Spring-Security

[Spring Security] SecurityBuilder, SecurityConfigurer

caporatang 2025. 2. 4. 22:20
반응형

SecurityBuilder, SecurityConfigurer

스프링 시큐리티는 초기화 과정에서 인증이나 인가와 관련된 여러가지 작업을 하게 된다. 이것은 여러개의 객체들과 설정들이 상호작용하여 작업이 이루어 지게 되는데, 이런 작업을 종합적으로 처리하는 두개의 클래스가 SecurityBuilder, SecurityConfigurer 클래스다.

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

클래스 생성 과정

AutoConfiguration에 의해 빌더 클래스가 자동 생성된다. SecurityBuilder 클래스는 빈 객체와 설정 클래스를 생성하는 역할을 한다고 위에서 언급했다. 즉, SecurityBuilder 클래스가 SecurityConfigurer 타입의 객체들을 생성한다.
SecurityConfigurer 클래스는 내부적으로 init() 메서드와, configure() 메서드를 가지고 있는데 각각 매개변수로 SecurityBuilder 타입의 객체를 받는다. 그 후 SecurityConfigurer는 두개의 메서드를 통해서 초기화 작업을 진행하며, 이때 필터도 같이 생성하며 인증 인가 관련된 설정들을 실행한다.

정리하자면, SecurityBuilder를 통해서 자동생성에 의해 가장 핵심적인 HttpSecurity 빈을 생성하고, 이 빈 객체가 SecurityConfigure 타입의 여러개의 설정 Configure 들을 생성한다. 생성된 Configure들의 init 메서드와 configure 메서드를 통해서 여러개의 많은 filter들과 설정들이 생성된다.

각 필터와 설정 파일의 생성 과정을 클래스로 찾아보자

  1. SecurityBuilder 클래스를 보면, 최상위 인터페이스로 build 메서드가 정의되어 있다.
  2. SecurityConfigurer 클래스는 init 메서드와 configure 메서드가 정의 되어 있으며, SecurityBuilder 타입의 B 객체를 매개변수로 받는다.
  3. 서버를 디버그로 실행하고 HttpConfiguration 클래스에 httpSecurity 메서드를 보면 아래 코드와 같은데,

httpSecurity 메서드 중 아래 코드 부분이 설정되는 부분이다.

http.csrf(Customizer.withDefaults())
        .addFilter(webAsyncManagerIntegrationFilter)
        .exceptionHandling(Customizer.withDefaults())
        .headers(Customizer.withDefaults())
        .sessionManagement(Customizer.withDefaults())
        .securityContext(Customizer.withDefaults())
        .requestCache(Customizer.withDefaults())
        .anonymous(Customizer.withDefaults())
        .servletApi(Customizer.withDefaults())
        .apply(new DefaultLoginPageConfigurer());
  1. 수많은 설정과 필터가 생성되므로, 한가지 csrf 설정하는 과정을 보면 getOrApply 메서드에 CsrfConfigurer 객체를 생성해서 적용하는 모습을 볼 수 있고, 그 뒤로 CsrfConfigure 클래스가 상속하고 있는 AbstractHttpConfigurer와 SecurityConfigurerAdapter를 따라 차례대로 올라가면 최종적으로 SecurityConfigurer를 확인할 수 있다.
    즉, CsrfConfigurer 클래스는 최종적으로는 SecurityConfigurer 인터페이스를 상속받은 클래스라는 것을 확인할 수 있다.

그럼 생성한 설정들과 필터들은 어디서 사용하는가

위에서 생성된 설정들과 필터들은 이전 글에서 알아봤던 SpringBootWebSecurityConfiguration 클래스에 defaultSecurityFilterChain 객체로 주입된다. 넘어온 http 객체들을 보면 아래와 같이 Csrf부터 해서 각각의 설정 클래스가 포함되어 있다.

init과 configure

글 위에서 언급했듯이 SecurityConfigurer에는 init, configure 메서드가 있는데 이 메서드들은 defaultSecurityFilterChain안에서 http.build() 하는 과정에서 다음과 같이 실행된다.

init 메서드를 살펴보면 넘겨받은 각각의 configuration안에 있는 각각의 configuration 클래스들에서 재정의가 되어 있는 init 즉, 초기화 메서드들을 호출한다. configure도 마찬가지로 각각의 설정 파일안에 있는 configure 메서드들을 호출하는 것이다.

각각의 설정 파일들 안에 init 메서드나, configure 메서드들은 재정의가 되어 있을수도 있고, 아닐수도 있다. 그래서 대표적으로 CsrfConfigure 클래스 안에 있는 configure 메서드 하나만 살펴보면, filter를 생성하고 필터가 필요한 핸들러같은 객체들을 만들어서 http 객체에 추가해서 반환하는 작업을 거친다.

반응형