AutoConfiguration - 자동 설정으로 인해 SecurityBuilder 클래스 만듦

SecurityBuilder (설정 클래스 생성, 초기화 작업 진행)→ SecurityConfigurer 내부 메서드 실행.

ex)

SecurityBuilder 에서 HttpSecurity 설정 클래스 생성 → 빈이 됨.

HttpSecurity객체가 Securityconfigurer 타입의 설정 클래스를 생성. → 엄청 많음

Securityconfigurer 타입의 설정 클래스 인 init()과 configurer() 에서 초기화 작업이 일어남.

이 중에서 필터들을 생성함(CorsFilter, DisableEncodeUrlFilter 등)

각각의 configurer 설정 클래스마다 필터가 있음.

 class HttpSecurityConfiguration {
 
		 ...
 
 //필터 생성.
 @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;
    }
    
}

AbstractConfiguredSecurityBuilder의 메서드를 통해 build됨.

    protected final O doBuild() throws Exception {
        synchronized(this.configurers) {
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.INITIALIZING;
            this.beforeInit();
            this.init(); // Securityconfigurer 타입의 모든 설정 클래스들의 init() 실행
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.CONFIGURING;
            this.beforeConfigure();
            this.configure(); // Securityconfigurer 타입의 모든 설정 클래스들의 configure() 실행
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.BUILDING;
            O result = this.performBuild();
            this.buildState = AbstractConfiguredSecurityBuilder.BuildState.BUILT;
            return result;
        }
    }