[ODOP] 81일차 - DelegatingFilterProxy, FilterChainProxy

[ODOP] 81일차 - DelegatingFilterProxy, FilterChainProxy

DelegatingFilterProxy

  • ServletFilter
    • 서블릿 스펙 2.3 버전 부터 지원되는 기능

    • 서블릿 컨테이너에서 생성되며 실행

      따라서 Spring Container 에서 생성되는 Bean 을 Injection 하는 방식으로는 사용할 수 없다

하지만 지난 방식에서는 사용자의 처리를 Filter 기반으로 처리했다 (여기서 말하는 Filter 는 Servlet Filter)

Spring Security 는 개발자의 "Filter 에서 Spring Bean 을 사용하고자 하는" 요구사항을 해결하기 위하여 아래와 같은 프로세스를 거치게 된다.

  1. ServletFilter 에서 사용자의 Stream 이 들어온다
  2. ServletFilter 에서 DelegatingFilterProxy 를 동작
    • DelegatingFilterProxy 는 GenericFilterBean 이라는 추상 클래스를 구현한 구현체
    • GenericFilterBean 은 ServletFilter 를 상속받고 있다
    • GenericFilterBean 은 ServletFilter 이지만 WepApplicationContext 를 가지고 있기 때문에 Spring Bean 을 사용할 수 있다
      (interface WebApplicationContext extends ApplicationContext)
  3. 특정한 이름을 가진 스프링 빈을 찾아 그 빈에게 요청을 위임한다
    • springSecurityFilterChain 이름으로 생성된 빈을 ApplicationContext 에서 찾아 요청을 위임한다
    • DelegatingFilterProxy 는 실제 보안 처리를 하지 않는다

FilterChainProxy

위 이미지의 Filter 들을 관리하고 제어하는 클래스가 바로 FilterChainProxy 이다
  • springSecurityFilterChain 의 이름으로 생성되는 필터 빈
  • DelegatingFilterProxy 로 부터 요청을 위임 받고 실제 보안처리를 수행
  • 스프링 시큐리티 초기화 시 생성되는 필터들을 관리하고 제어
    • 스프링 시큐리티가 기본적으로 생성하는 필터
    • 설정 클래스에서 API 추가 시 생성되는 필터
  • 사용자의 요청을 필터 순서대로 호출하여 전달
  • 사용자정의 필터를 생성해서 기존의 필터 전.후로 추가 가능
    • 필터의 순서를 잘 정의
  • 마지막 필터까지 인증 및 인가 예외가 발생하지 않으면 보안 통과

전체적인 흐름

Servlet Container 는 각각의 Filter 들이 먼저 돌고 Spring Container 로 넘어가게 된다