새소식

반응형
Java/Spring

DelegatingFilterProxyRegistrationBean<T extends Filter>

  • -
반응형

DelegatingFilterProxy 란?

서블릿 필터 클래스이다.

서블릿 컨테이너(Tomcat)에 필터로 등록되지만 내부적으로는 Spring Bean 이름으로 실제 Filter를 찾아서

위임(delegate) 한다.

 

즉, 서블릿 필터처럼 동작하지만 진짜 필터 로직은 Spring Context 내에 있는 Bean 이 처리한다.

 

⚙️ 동작 구조 요약

[서블릿 컨테이너의 Filter Chain]
      ↓
DelegatingFilterProxy (서블릿 필터, Spring이 자동 등록)
      ↓ (Bean 이름 기반으로 찾아서 위임)
springSecurityFilterChain (Spring Security의 실제 필터 체인 Bean)
      ↓
security Filter들 (UsernamePasswordAuthenticationFilter, etc.)

 

 

✅ DelegatingFilterProxy 자체는 Bean인가?

  • DelegatingFilterProxy 는 Spring 자체가 관리하는 Bean 이자 Filter이기도 하다
  • Spring Boot 환경에서는 이 필터가 자동 등록된다.
  • 실제로는 다음과 같은 방식으로 Bean 등록과 연결이 자동 처리된다.
@Bean
public FilterRegistrationBean<DelegatingFilterProxy> securityFilterChain() {
    FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<>();
    registration.setFilter(new DelegatingFilterProxy("springSecurityFilterChain")); // ← 이 이름의 Bean을 찾음
    registration.addUrlPatterns("/*");
    return registration;
}

 

하지만 Spring Boot 3에서는 springSecurityFilterChain 이라는 Bean 을 자동으로 생성하고 이걸 DelegatingFilterProxy 가

위임하는 방식이므로 위 코드는 명시적으로 적지 않아도 동작한다.

 

🔑 요약

항목 설명
DelegatingFilterProxy 서블릿 컨테이너에 등록되는 필터 (Spring이 자동 등록)
Spring Bean 여부 ✅ 맞습니다. Spring Bean입니다.
실제 보안 로직 처리 내부적으로 springSecurityFilterChain이라는 Spring Security Filter Chain Bean에 위임

 

 

Spring Boot 3 버전에서의 DelegatingFilterProxy

🔍 등록 흐름

  1. Spring Security 는 FilterChainProxy Bean(springSecurityFilterChain) 을 생성한다.
    => Spring Security 등록을 위한 SpringFilterChain Bean 이다.
  2. Spring Boot 는 springSecurityFilterChain 이름의 Bean 이 있으면 자동으로 DelegatingFilterProxy 를 만들어 서블릿 필터로 등록한다.
  3. 내부적으로는 DelegatingFilterProxyRegistrationBean 을 사용해서 등록한다.

 

🔧 핵심 소스 흐름

1. ✅ springSecurityFilterChain Bean 생성

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests().anyRequest().authenticated();
        return http.build(); // 이 내부적으로 FilterChainProxy 를 생성함
    }
}

 

이 설정을 통해 springSecurityFilterChain 이라는 이름의 Bean 이 자동으로 등록된다.

 

2. ✅ Spring Boot에서 DelegatingFilterProxy 자동 등록

springSecurityFilterChain 이라는 이름의 Bean 이 있으면, Spring Boot 는 자동으로

DelegatingFilterProxyRegistrationBean 을 생성한다.

 

클래스 위치

org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration

 

필터 등록 소스

@Bean
@ConditionalOnBean(name = DEFAULT_FILTER_NAME) // DEFAULT_FILTER_NAME = "springSecurityFilterChain"
public DelegatingFilterProxyRegistrationBean securityFilterChainRegistration(
        SecurityProperties securityProperties) {
    DelegatingFilterProxyRegistrationBean registration = new DelegatingFilterProxyRegistrationBean(
            DEFAULT_FILTER_NAME);
    registration.setOrder(securityProperties.getFilter().getOrder());
    return registration;
}

 

 

3. ✅ DelegatingFilterProxyRegistrationBean 내부

해당 클래스는 FilterRegistrationBean<DelegatingFilterProxy> 를 확장한 클래스이다.

public class DelegatingFilterProxyRegistrationBean extends AbstractFilterRegistrationBean<DelegatingFilterProxy>
		implements ApplicationContextAware {
    public DelegatingFilterProxyRegistrationBean(String targetBeanName,
            ServletRegistrationBean<?>... servletRegistrationBeans) {
        super(servletRegistrationBeans);
        Assert.hasLength(targetBeanName, "'targetBeanName' must not be empty");
        this.targetBeanName = targetBeanName;
        setName(targetBeanName);
    }
}

 

여기서 DelegatingFilterProxyRegistrationBean 을 통해 springSecurityFilterChain 이라는 Bean 을

필터 등록하여 Spring Security 의 FilterChain 이 동작한다.

 

 

✅ 결론 정리

항목 설명
DelegatingFilterProxy Spring Boot에서 자동으로 서블릿 필터로 등록됨
등록 위치 SecurityFilterAutoConfiguration 클래스
조건 springSecurityFilterChain 이름의 Bean이 있을 경우
연결 대상 FilterChainProxy Bean (Spring Security 내부 보안 필터 체인)

 

 

반응형
Contents