Spring Security

박채은·2023년 1월 16일
0

Spring

목록 보기
31/35

Spring Security

Spring MVC 기반 애플리케이션의 인증과 인가 기능을 지원하는 보안 프레임워크

Spring에서 지원하는 Servlet FilterInterceptor로 보안 기능을 직접 구현하는 방법도 있지만, 보통 Spring Security를 사용한다.
보안에 대해서 잘 알고 스스로 구현할 수 있다면 괜찮은데, 현재는 보안보다 비즈니스 로직을 구현하는 것이 더 중요하기 때문에!


용어

  • Principal(주체)
    • 작업을 수행하는 사용자, 디바이스, 또는 시스템
    • 일반적으로 인증을 성공한 사용자의 계정 정보를 의미
  • Authentication(인증)
    • 사용자가 본인이 맞음을 증명하는 절차
    • Credential을 사용해서 인증을 진행한다.
  • Credential(신원 증명 정보)
    • 사용자를 식별하기 위한 정보
    • 일상 생활의 예시) 신분증
    • 보안의 예시) 패스워드
  • Authorization(인가 또는 권한 부여)
    • 인증이 정상적으로 수행된 사용자에게 하나 이상의 권한을 부여하여, 특정 리소스에 접근할 수 있게 허가하는 과정
    • 인가는 인증이 완료된 후에, 진행된다.
    • 권한(authority)은 Role 형태로 부여된다.
  • Access Control(접근 제어)
    • 사용자가 리소스에 접근하는 행위를 제어하는 것

기능

  • 사용자 인증 기능(Authentication)
    • 폼 로그인 인증
    • 토큰 기반 인증
    • OAuth 기반 인증
  • 권한 부여 기능(인가, Authorization)
    • 사용자의 역할에 따른 권한 레벨 적용
    • 인증 절차를 거쳤다고 해도, 모든 리소스에 접근할 수 있는 것은 아니다.
  • 민감한 정보에 대한 데이터 암호화

  • SSL 적용

  • 웹 보안 공격에 대한 대비
    • 세션 고정 공격, 클릭재킹 공격, CSRF 등에 대한 대비

Spring Security 실습

  • SSR 방식의 폼 로그인 방식(HTML의 form 태그로 구성)을 통해서 실습을 진행할 것이다.
    • 클라이언트에게 전송하는 HTML 파일을 포함한다.
    • HTML 뷰를 구성하기 위해서 타임리프라는 템플릿 엔진을 사용한다.

타임리프에 대해서 더 찾아보기!

  • 커피 주문 애플리케이션을 만들 것이다.
    • 회원가입, 로그인 기능이 있다.
    • 사용자는 커피 목록을 보고 커피를 주문한다.
    • 관리자는 커피 주문 목록 페이지에서 주문을 확인한다.
    • 사용자만 마이페이지를 통해 본인의 주문을 볼 수 있다.

Spring Security Configuration

Spring Security는 디폴트 로그인 페이지디폴트 로그인 정보를 생성해준다.
하지만 우린 이런 디폴트 로그인 정보를 사용하지 않고, Spring Security Configuration을 통해서 원하는 기능을 웹 페이지에 적용시켜 것이다.

@Configuration
public class SecurityConfiguration {
    // 여기에 Spring Security의 설정을 진행합니다.
}
  • Spring Security Configuration 클래스를 하나 생성한 후에, @Configuration 애너테이션을 붙여준다.

  • Spring Security에 관한 @Configuration 이 붙은 클래스는 하나여야 한다!

@Configuration 애너테이션은 필요한 설정에 따라 여러 개 생성할 수 있다. 하지만 동일한 처리를 하는 Configuration을 여러개 만들 경우 Bean으로 등록할 때 문제가 발생할 수 있기 때문에 주의해야 한다!


1️⃣ 인메모리에 인증을 위한 고정된 사용자 계정 정보를 생성한다.

@Configuration
public class SecurityConfiguration {
    @Bean
    public UserDetailsManager userDetailsService() {
        UserDetails userDetails =
                User.withDefaultPasswordEncoder()
                        .username("kevin@gmail.com")
                        .password("1111")            
                        .roles("USER")               
                        .build();
        return new InMemoryUserDetailsManager(userDetails);
    }
}
  • UserDetails : 사용자의 핵심 정보를 포함하는 인터페이스

  • User : UserDetails 인터페이스의 구현체

  • withDefaultPasswordEncoder() : 패스워드를 암호화해주는 메서드

  • UserDetailsManager
    • Spring Security에서 제공하는 인터페이스
    • 사용자의 정보(UserDetails)를 관리하는 인터페이스
  • InMemoryUserDetailsManager
    • UserDetailsManager의 구현체
    • 데이터베이스 연동없이, 인메모리 상에서 사용자의 정보를 관리할 때 사용한다.

UserDetailsManager 객체를 Bean으로 등록해야 한다.
Spring은 "클라이언트의 요청"과 "Bean이 가지고 있는 사용자 정보"를 비교해서 인증 프로세스를 수행하기 때문에


2️⃣ HTTP 보안 설정

HttpSecurity 를 통해 Spring Security에서 지원하는 보안 설정을 구성할 수 있다.
SecurityFilterChain 객체를 Bean으로 등록해서 HTTP 보안 설정을 등록한다.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     http
            .csrf().disable()
            .formLogin()
            .loginPage("/auths/login-form")
            .loginProcessingUrl("/process_login")
            .failureUrl("/auths/login-form?error")
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/")
            .and()
            .exceptionHandling().accessDeniedPage("/auths/access-denied")
            .and()
            .authorizeHttpRequests(authorize -> authorize
                    .antMatchers("/orders/**").hasRole("ADMIN")
                    .antMatchers("/members/my-page").hasRole("USER")
                    .antMatchers("/**").permitAll()
            );
        return http.build();
}
  • HttpSecurity : HTTP 요청에 대한 보안 설정을 구성하는 클래스

  • csrf().disable() : CSRF 공격에 대한 Spring Security 설정을 비활성화
    (활성화되어 있으면 CSRF 공격을 방지하기 위해서 클라이언트로부터 CSRF 토큰을 받아 검증한다. 현재는 로컬 환경에서 테스트하는 것이므로 비활성화해둔다.)

  • formLogin() : 폼 로그인 방식으로 설정

  • authorizeHttpRequests() : 클라이언트 요청 URI에 대한 접근 권한을 부여한다.

  • antMatchers(Path).hasRole("ADMIN/USER") : 해당 role을 부여받은 사용자만 해당 Path에 접근할 수 있다.

  • and() : Spring Security 보안 설정을 메서드 체인 형태로 구성한다.

위의 코드처럼 여러 필터가 존재하고, and 메서드를 통해서 여러 필터들을 체인 형태로 연결해주는 것이다.


3️⃣ 회원 가입 기능 추가

(1)번에서는 고정된 사용자 계정 정보를 추가해둔 것이다.
하지만 우리가 보통 웹 사이트를 사용할 때는, 고정된 계정을 사용하지 않고 사용자가 직접 회원가입을 한 계정을 사용한다.

0개의 댓글