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

초기화 과정 이해(SecurityBuilder / SecurityConfigurer)

webmaster 2022. 12. 2. 19:57
728x90

프로젝트 생성

프로젝트 생성
의존성
password 로그

  • 스프링 시큐리티 의존성만 추가하더라도, 기본적으로 User/Password를 제공이 된다.

SecurityBuilder / SecurityConfigurer

SecurityBuilder와 SecurityConfigurer

  • SecurityBuilder는 빌더 클래스로, 웹 보안을 구성하는 빈 객체와 설정 클래스들을 생성하는 역할을 하며, WebSecurity와 HttpSecurity가 있다.
  • SecurityConfigurer는 Http 요청과 관련된 보안 처리를 담당하는 필터들을 생성하고, 여러 초기화 설정에 관여한다.
  • SecurityBuilder는 SecurityConfigurer를 포함하고 있으며, 인증 및 인가 초기화 작업은 SecurityConfigurer에 의해 진행된다.

과정

  • build() 메서드를 통해 빌더 클래스 생성
  • 빌더 클래스를 생성하는 과정에서, SecurityConfigure에 있는 init, configure 메서드를 호출하면서, 설정 클래스를 생성한다.

  1. WebSecurity -> HttpSecurity 순서로 실행시키고, 초기 apply 함수를 실행시켜준다.
    • apply 함수에서 초기화 대상임을 찾고, 초기화 대상 생성/적용 한다.
  2. build 메서드를 호출한다
    • init, confugure 함수를 호출하면서, 인증과 인가에 필요한 필터를 생성한다
    • WebSecurity의 대표적인 예로 WebSecurityConfigurerAdapter가 있으며 현재는 duplicate 된 상태이다.
    • HttpSecurity에서는 build() 메서드를 호출하면, CorsConfigurer, HttpBaseConfigurer,... 등 필터들 모두 실행하면서, 인증/ 인가에 관한 모든 설정들이 초기화된다.
  3. performBuild()가 build() 내부적으로 실행이 되고, build() 메서드가 종료가 된다.
    • WebSecurity에서는 performBuild() 호출하면서, FilterChainProxy를 생성한다.
    • HttpSecurity에서는 performBuild() 호출하면서, SecurityFilterChain을 생성한다.

직접 CustomSecurityConfigurer 만들기

SecurityConfig

@EnableWebSecurity
public class SecurityConfig {

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

}

CustomSecurityConfiguer

public class CustomSecurityConfigurer extends
    AbstractHttpConfigurer<CustomSecurityConfigurer, HttpSecurity> { //SecurityConfigurer 를 상속받고 있다.

  private boolean isSecure;

  @Override
  public void init(HttpSecurity builder) throws Exception {
    super.init(builder);
    System.out.println("init method started...");
  }

  @Override
  public void configure(HttpSecurity builder) throws Exception {
    super.configure(builder);
    System.out.println("configure method started...");
    if (isSecure) {
      System.out.println("https is required");
    } else {
      System.out.println("https is optional");
    }
  }

  public CustomSecurityConfigurer setFlag(boolean isSecure) {
    this.isSecure = isSecure;
    return this;
  }
}
  • SecurityFilterChain 빈을 반환하는 securityFilterChain 빈을 생성한다.
    • 예전에는 WebSecurityConfigurerAdapter를 호출하였는데 현재 더 이상 사용하지 않는다.
    • 빈이므로, HttpSecurity객체를 파라미터로 받을 수 있으며, 해당 빈을 apply 메서드에 내가 생성한 빈을 넣어준다.
  • CustomSecurityConfiguer에서 커스텀하게 설정을 진행할 수 있다.
    • init 메서드를 오버라이드 하여, 실행되는지 print 하고, configure 메서드를 통해 build() 메서드가 호출되는 시점에서 동작할 기능을 커스텀하게 개발할 수 있다.
    • builder 패턴처럼 쓰기 위해 setFlag 같은 경우 값을 변경 후, 자기 자신을 반환하도록 했다.
728x90

'스프링 시큐리티 OAuth2 > Spring Security Fundamentals' 카테고리의 다른 글

CORS  (0) 2022.12.20
HttpBasic 인증  (0) 2022.12.18
시큐리티 인증 및 인가 흐름 요약  (0) 2022.12.17
AuthenticationEntryPoint 이해  (0) 2022.12.17
자동 설정에 의한 초기화 진행  (0) 2022.12.11