springframework/시작하자SpringSecurity

14.DelegatingFilterProxy, FilterChainProxy

Jungsoomin :) 2020. 9. 21. 13:01

DelegatingFilterProxy

  • FilterServlet 2.3 이상부터 적용된 기술이다.

  • Spring 에서 필터가 동작한다는 것은 SpringContext 안에 Filter들이 있다는 뜻이된다.

  • 하지만 FilterServletContext에 존재해 영역이 다르다.

  • 결국 Filter스프링 기술이나 Bean을 Injection 받을 수 없다.

이렇게 각자 영역이 다른 상태에서 Servlet Spec 에서 사용되는 Filter사용할 수 있게끔 하는 것DelegatingFilterProxy 이다.


DelegatingFilterProxy 의 작동원리

 

  1. SpringBean Filter를 상속한다. 이는 Filter Type Bean을 의미한다.

  2. DelegatingFilterProxyServlet SpecFilter를 구현하고 있다.

  3. DelegatingFilterProxy Servlet Filter 이며, DelegatingFilterProxy 가 특정한 이름을 가진  Spring Filter Type Bean을 찾아 요청을 위임한다.

  • springSecurityFilterChain 이름으로 생성 된 빈을 ApplicationContext 에서 찾아 위임 한다.

  • 실제 보안처리는 하지않는다.


springSecurityFilterChain의 이름을 가진 Bean은 FilterChainProxy

 

FilterChainProxy

 

  1. springSecurityFilterChain 의 id를 가진다.

  2. DelegatingFilterProxy에게 Request을 위임 받아 실제 보안처리를 실시

  3. SpringSecurity 초기화 시에 생성되는 Filter Type Bean들을 관리, 제어

  • SpringSecurity기본적으로 생성하는 Filter

  • WebSecurityConfigurerAdapter 상속 클래스에서 API 추가시 생성되는 Filter

  • 필터가 작동하고나면 다시 FilterChainProxy 를 거쳐 다음 FilterChain 된다.

    4. 사용자의 RequestFilter 순으로 호출하여 전달

    5. 사용자 정의 Filter를 생성하여 기존 필터의 전 , 후에 추가 가능하다.

  • 각각의 Filter 고유한 역할과 순서가 있기 때문에 의 Chain에 맞게 추가해야함

   6. 마지막 필터까지 인증 , 인가 예외가 발생하지 않는다면 보안에 통과 하고, Servlet 자원에 접근한다.


Container 관점의 DelegatingFilterProxy, FilterChainProxy

 

  1. 사용자의 Request

  2. Servlet Filter DelegatingFilterProxy 가 작동, DelegatingFilterProxy의 idspringSecurityFilterChain 으로 내부적으로 탐색하는 FilterChainProxy 의 id와 같음

  3. DelegatingFilterProxy springSecurityFilterChain id를 가진 FilterChainProxy 에게 RequestDelegate

  4. FilterChainProxyFilter Type Bean들이 동작하며 보안검사를 실행

  5. 모든 필터를 거쳐내려가 FilterSecurityInterceptor에서 AuthenticationException 이나 AccessDeniedException 이 발생하지 않았다면 RequestServlet 에 전달

  6. SpringMVC DispatcherServlet 이 요청을 받아 Servlet 자원에 접근

 

** SpringContext 에서 springSecurityFilterChain 이라는 id로 Bean 을 생성하는 객체WebSecurityConfiguration 클래스이다.