[Spring Security] DelegatingFilterProxy의 동작과정

이멀젼씨

·

2021. 6. 12. 21:37

목적

스프링 시큐리티의 DelegatingFilterProxy가 어떻게 스프링 필터체인과 함께 동작할 수 있는지 이해하기 위함

목차

  1. 스프링 필터의 동작과정
  2. DelegatingFilterProxy의 동작과정

1. 스프링 필터의 동작과정

간단히 설명해서 ApplicationFilterChain이 갖고 있는 filter목록을 순회하며 filter를 순회하게 된다.

자세한건 이전 글을 참조하면 되겠다.

2. DelegatingFilterProxy의 동작과정

DelegatingFilterProxyBean을 필터로 등록하여 스프링 시큐리티에 등록된 필터를 호출하는 방식이다.

그림상으론 필터 실행 후 다음 필터가 실행되는 것처럼 나와있는데

실제론 해당 필터가 실행하고자 하는 로직이 끝나면 doFilter메서드 또는 doFilterInternal메서드가 종료되기 전에 chain.doFilter를 호출하는 방식이다.

재귀적으로 호출된다.

스프링의 필터가 순차적으로 실행될 때 스프링 시큐리티의 필터는 그림상으론 4번째에 실행되게 된다.

ApplicationFilterChain에서 각 필터 객체를 가져올 때 getFilter메서드를 사용하는데

DelegatingFilterProxyBean의 getFilter메서드는 DelegatingFilterProxy를 반환한다.

1. doFilter()

일반적인 필터와 마찬가지로 DelegatingFilterProxy또한 Filter인터페이스를 상속받는 클래스이며, doFilter메서드를 실행하게 된다.

Filter인터페이스를 상속받는 delegateToUse객체가 현재 null이기 때문에 initDelegate메서드를 통해 FilterChainProxy를 주입받는다.

그런다음 invokeDelegate메서드에 FilterChainProxy와 request, response, 스프링에 등록되어있는 ApplicationFilterChain을 파라미터로 넘긴다.

2. invokeDelegate()

파라미터로 받은 FilterChainProxy의 doFilter메서드를 호출한다.

3. FilterChainProxy.doFilter()

try안에 있는 doFilterInternal메서드를 실행한다.

4. FilterChainProxy.doFilterInternal()

FilterChain인터페이스를 구현하는 VirtualFilterChain클래스는 FilterChainProxy의 내부클래스로 만들어져있는 상태이다.

VirtualFilterChain은 스프링에서 제공해주는 필터를 갖고 있는 originalChain객체와 스프링 시큐리티에서 제공해주는 필터를 갖고 있는 additionalFilters객체를 멤버로 갖고 있다.

만들어진 VirtualFilterChain객체의 doFilter메서드를 호출한다.

5. VirtualFilterChain.doFilter()

ApplicationFilterChain과 마찬가지로 nextFilter에 스프링 시큐리티에서 제공해주는 다음 필터를 가져온 뒤 doFilter를 실행하는 방식이다.

doFilter의 마지막 파라미터로 VirtualFilterChain을 넘기면서 다음 필터를 실행할 수 있게 해두었다.

VirtualFilterChain에 등록된 additionalFilter들도 마찬가지로 doFilter메서드를 실행하면

상위 필터객체가 있는 경우에는 doFilter -> doFilterInternal의 순서로 실행되거나

Filter인터페이스를 구현하여 doFilter메서드를 오버라이딩 한 경우엔 바로 doFilter메서드가 실행된다.

더 이상 거쳐야할 필터가 없다면 맨 윗부분에 있는 if문안에 originalChain.doFilter를 통해 스프링에 등록되어있던 DelegatingFilterProxyBean의 다음 필터인 WsFilter가 실행되게 된다.