스프링 시큐리티 OAuth2/Spring Security Fundamentals

자동 설정에 의한 초기화 진행

webmaster 2022. 12. 11. 20:46
728x90

HttpSecurity에 따른 초기 설정 과정

  • SpringWebMvcImportSelector : 인터페이스로, 특정 환경에 따라 다른 설정 파일을 Load 할 수 있도록 도와준다.
  • SecurityFilterAutoConfiguration : DelegatingFilterProxyRegistrationBean이라는 빈 클래스를 만들고, 이 빈클래스는 DelegatingFilterProxy를 등록시켜주는 역할을 한다
    • DelegatingFilterProxy는 SpringSecurityFilterChain 이름의 빈을 검색하고, 그 빈에게 클라이언트 요청을 위임하는 역할을 한다.
  • WebMvcSecurityConfiguration : ArgumentResolver 관련 타입을 클래스를 생성해준다
    • AuthenticationPrincipalArgumentResolver : @AuthenticationPrincipal 어노테이션으로 선언이된 변수가 있다면, 자동으로 인증을 받은 Principal 객체를 바인딩해준다.
    • CurrentSecurityContextArgumentResolver
    • CsrfTokenArgumentResolver
  • HttpSecurityConfiguration : HttpSecurity를 생성해 준다
    • HttpSecurity는 공통 설정 클래스(~~ Configure)와 필터들을 생성하고, 최종적으로 SecurityFilterChain 빈을 반환한다.

SpringBoot의 자동 설정에 의한 초기화 진행

SpringBootWebSecurityConfiguration : 초기 스프링 부트가 초기화될 때, 아래와 같은 Bean을 초기 설정으로 한 빈을 생성한다.

초기 SpringBoot가 설정하는 설정 빈

  • HttpSecurityConfiguration에서 생성한 HttpSecurity 객체를 주입받는다
  • Form 로그인과 Basic 로그인 기능을 추가 정의한 기본 SecurityFilterChain 빈을 정의함

WebSecurityConfiguration : WebSecurity를 만들어준다.

WebSecurityConfiguration이 만들어 주는 WebSecurity

  • WebSecurity는 securityFilterChainBuilders라는 속성을 가지고 있고, 내부적으로 SecurityBuilder, SecurityFilterChain을 가지고 있다.
    • 초기 아무것도 설정하지 않았을 경우 SpringBoot가 기본적으로 생성해주는 defaultSecurityFilterChain을 SecurityFilterChain으로 가지고 있다.
  • build()를 하게 되면, 실제 WebSecurity가 생성이 되고, 최종 결과로, FilterChainProxy 객체가 생성이 되고, SeucirtyFilterChain을 담는 SecurityFilterChains가 생기게 된다.
  • WebSecurity / HttpSecurity을 차이
    • HttpSecurity는 defaultSecurityFilterChain과 같은 http FilterChain을 만드는 것이고, 이러한 결과는 여러 개가 나올 수 있다. -> 이러한 http는 WebSecurityFilterChain에 저장이 되고, 이를 WebSecurity에서 빌드하는 것
    • HttpSecurity < WebSecurity

실습

@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http)
      throws Exception { //빈이기 때문에 HttpSecurity를 주입 받을 수 있다
    http.authorizeHttpRequests().anyRequest().authenticated();
    http.formLogin();
    //http.apply(new CustomSecurityConfigurer().setFlag(false)); //빌더 패턴과 비슷하게 사용할 수 있다.
    return http.build();
  }

  @Bean
  public SecurityFilterChain securityFilterChain2(HttpSecurity http) throws Exception {
    //httpSecurity를 각각 생성해야 하므로 httpConfiguration에서 빈이 다르게 생성이 되어야한다
    http.authorizeHttpRequests().anyRequest().authenticated();
    http.httpBasic();
    return http.build();
  }
}
  • SecurityFilterChain을 반환하는 2개의 빈을 각각 만들게 된다면, httpSecurity를 각각 생성해야 하므로, httpConfiguration에서 빈이 다르게 호출되어야 한다(scope가 prototype이기 때문 -> 싱글톤이 아니다)
728x90