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();
}
설정 클래스 파헤치기
- 각 설정 클래스들(????Configurer)은 AbstractHttpConfigurer 추상 클래스를 상속
ex) CsrfConfigurer, ExceptionHandlingConfigurer, ... etc - AbstractHttpConfigurer는 SecurityConfigurerAdapter를 상속
- 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 |