본문 바로가기

Language/Spring Security

SecurityBuilder / SecurityConfigurer

728x90

SecurityBuilder

  • 빌더 클래스로서 웹 보안을 구성하는 빈 객체와 설정 클래스들을 생성하는 역할
  • 대표적인 예 : WebSecurity, HttpSecurity

SecurityConfigurer

  • Http 요청과 관련된 보안 처리를 담당하는 필터들을 생성
  • 여러 초기화 설정에 관여
    • Spring Security는 필터 기반 보안 프레임워크라고 해도 과언이 아닐 정도로 중요

SecurityBuilder와 SecurityConfigurer의 관계

  • SecurityBuilder → SecurityConfigurer를 참조
  • 인증 및 인가 초기화 작업은 SecurityConfigurer에 의해 진행

 

AutoConfiguration

  • 빌더 클래스(SecurityBuilder) 생성

 

SecurityBuilder

  • 설정 클래스(SecurityConfigurer) 생성

 

SecurityConfigurer

  • 초기화 작업 진행
  • init(B builder), configure(B builder)
    • builder에는 SecurityBuilder가 담김
  • SecurityBuilder → HttpSecurity Bean 생성
  • HttpSecurity → SecurityConfigurer 타입의 설정 클래스들을 생성
    Ex) LogoutConfigurer
  • 설정 클래스들의 init(), configure() 메서드 → Filter 생성
    Ex) LogoutFilter

SpringSecurity

package org.springframework.security.config.annotation;

public interface SecurityBuilder<O> {
    O build() throws Exception;
}

 

SecurityConfigurer

package org.springframework.security.config.annotation;

public interface SecurityConfigurer<O, B extends SecurityBuilder<O>> {
    void init(B builder) throws Exception;

    void configure(B builder) throws Exception;
}

 

 

HttpSecurityConfiguration에서 HttpSecurity 빈 객체 생성

@Bean({"org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity"})
@Scope("prototype")
HttpSecurity httpSecurity() throws Exception {
    LazyPasswordEncoder passwordEncoder = new LazyPasswordEncoder(this.context);
    AuthenticationManagerBuilder authenticationBuilder = new DefaultPasswordEncoderAuthenticationManagerBuilder(this.objectPostProcessor, passwordEncoder);
    authenticationBuilder.parentAuthenticationManager(this.authenticationManager());
    authenticationBuilder.authenticationEventPublisher(this.getAuthenticationEventPublisher());
    HttpSecurity http = new HttpSecurity(this.objectPostProcessor, authenticationBuilder, this.createSharedObjects());
    WebAsyncManagerIntegrationFilter webAsyncManagerIntegrationFilter = new WebAsyncManagerIntegrationFilter();
    webAsyncManagerIntegrationFilter.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
    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());
    http.logout(Customizer.withDefaults());
    this.applyCorsIfAvailable(http);
    this.applyDefaultConfigurers(http);
    return http;
}

 

HttpSecurity 빈 객체를 생성하여 return을 하면 해당 객체는 이전 장에서 본 SpringBootWebSecurityConfiguration의 defaultSecurityFilterChain메서드의 매개 변수로 쓰임

@Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
	http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated());
	http.formLogin(withDefaults());
	http.httpBasic(withDefaults());
	return http.build();
}

 

설정 클래스 파헤치기

  1. 각 설정 클래스들(????Configurer)은 AbstractHttpConfigurer 추상 클래스를 상속
    ex) CsrfConfigurer, ExceptionHandlingConfigurer, ... etc
  2. AbstractHttpConfigurer는 SecurityConfigurerAdapter를 상속
  3. SecurityConfigurerAdapter는 결국 SecurityConfigurer 상속
  • 즉, 모든 설정 클래스들은 init()과 configure() 메서드를 상속 받아 그래도 사용하거나 오버라이딩 하여 사용
728x90

'Language > Spring Security' 카테고리의 다른 글

폼 인증 - formLogin()  (0) 2024.07.15
사용자 정의 보안 설정하기  (0) 2024.07.15
DelegatingFilterProxy / FilterChainProxy  (0) 2024.07.15
WebSecurity / HttpSecurity  (0) 2024.07.15
프로젝트 생성 / 의존성 추가  (0) 2024.07.15