시큐리티의 동작 원리에 큰 구성으로는 DelegatingFilterProxy / FilterChainProxy / SecurityFilterChain이 있다.
그 중 DelegatingFilterProxy와 FilterChainProxy이 무엇인지 살펴보자.
DelegatingFilterProxy / FilterChainProxy 이란?
DelegatingFilterProxy
먼저 DelegatingFilterProxy는 스프링에 시큐리티 의존성이 활성화되어 있다면,
클라이언트의 요청을 가로채어서 등록된 FilterChainProxy로 요청을 보내는 역할을 수행하며,
특정한 시큐리티의 로직을 수행하지는 않는다.
그리고 DelegationgFilterProxy에 FilterChainProxy Bean으로 요청을 전달하도록
등록을 해주는 역할은 SecurityAutoConfiguration가 수행한다.
SecurityAutoConfiguration의 클래스는 다음과 같다.
@AutoConfiguration(after = SecurityAutoConfiguration.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(SecurityProperties.class)
@ConditionalOnClass({ AbstractSecurityWebApplicationInitializer.class, SessionCreationPolicy.class })
public class SecurityFilterAutoConfiguration {
private static final String DEFAULT_FILTER_NAME = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME;
@Bean
@ConditionalOnBean(name = DEFAULT_FILTER_NAME)
public DelegatingFilterProxyRegistrationBean securityFilterChainRegistration(
SecurityProperties securityProperties) {
DelegatingFilterProxyRegistrationBean registration = new DelegatingFilterProxyRegistrationBean(
DEFAULT_FILTER_NAME);
registration.setOrder(securityProperties.getFilter().getOrder());
registration.setDispatcherTypes(getDispatcherTypes(securityProperties));
return registration;
}
private EnumSet<DispatcherType> getDispatcherTypes(SecurityProperties securityProperties) {
if (securityProperties.getFilter().getDispatcherTypes() == null) {
return null;
}
return securityProperties.getFilter()
.getDispatcherTypes()
.stream()
.map((type) -> DispatcherType.valueOf(type.name()))
.collect(Collectors.toCollection(() -> EnumSet.noneOf(DispatcherType.class)));
}
}
이는 스프링 시큐리티 의존성 내부에 포함되어 있으며, 실행과 함께 자동으로 등록되도록 설정되었다.
대략적인 로직의 구성은 new DelegatingFilterProxyRegistrationBean 생성자를 통해서
DEFAULT_FILTER_NAME에 특정한 Bean 이름이 등록되고, 요청은 해당 Bean으로 전달된다.
그리고 이 Bean 이름은 시큐리티 로직을 수행하는 FilterChainProxy의 이름을 정하는 것과 같은데,
스프링 시큐리티 의존성을 추가하면 자동으로 springSecurityFilterChain으로 정해진다.
FilterChainProxy
이제 스프링 시큐리티 의존성 추가에 따라,
자동으로 DelegatingFilterProxy는 springSecurityFilterChain이라는
이름의 필터 Bean으로 접근하도록 요청을 보낸다.
그럼 시큐리티 로직이 담긴 FilterChainProxy에서는 요청에 따라
등록된 SecurityFilterChain 중에 알맞는 SecurityFilterChain 로직을 사용하여 검증 및 인증을 실행한다.
이와 같은 절차를 통해서 DelegationFilterProxy이 가로챈 요청을
FilterChainProxy에 보내고 시큐리티 로직에 따라 인증 인가 등을 기능한다.
요약하자면, 스프링 시큐리티의 DelegatingFilterProxy는 서블릿 필터이며,
Spring 컨테이너가 관리하는 Filter Bean이 있고 이 Filter Bean은 FilterChainProxy이며
이 객체안에서 Security와 관련된 일들이 벌어진다고 생각할 수 있겠다.
'Spring > 시큐리티 기본원리' 카테고리의 다른 글
시큐리티 기본 원리( 6 ) - 필터 구조와 상속( GenericFilterBean과 OncePerRequestFilter ) (0) | 2025.01.19 |
---|---|
시큐리티 기본 원리( 5 ) - SecurityContextHolder( 인증 정보 공유 방식 ) (0) | 2024.06.15 |
시큐리티 기본 원리( 4 ) - SecurityFilterChain 구조 (0) | 2024.06.15 |
시큐리티 기본 원리( 3 ) - SecurityFilterChain( 다중 필터 경로 매핑 ) (1) | 2024.06.15 |
시큐리티 기본 원리( 1 ) - 내부구조 및 동작원리 (0) | 2024.06.15 |
댓글