Skip to Content
Suffering builds character
아카이브18.spring Security스프링 시큐리티5.부록필터3.FilterChainProxy

3.FilterChainProxy

1-1. 역할

DelagatingFilterProxy를 통해 서블릿과 스프링 사이의 가교(bridge) 역할은 가능해졌으나, 본질적으로 서블릿 객체이기 때문에 이 객체만으로는 스프링의 기능을 활용하기에는 어려움

따라서 스프링에서는 별도의 Filter를 하나 더 구현하여 서블릿 컨테이너가 아닌 스프링 컨테이너에서 관리할 수 있는 스프링 빈 객체인 FilterChainProxy를 제공

이 객체는 DelegatingFilterProxy 내부에서 위임(Delegation) 형태의 Proxy 역할을 수행

따라서 DelegatingFilterProxy는 서블릿 필터로서 런타임에 가로챈 사용자의 요청을 스프링 시큐리티의 보안 관련 처리를 수행하는 스프링 빈에게 위임해서 보안에 대한 처리가 진행되도록 하기 위해 FilterChainProxy에게 요청을 위임

FilterChainProxySpring Security의 빈인 SecurityFilterChain에게 요청을 전달하여 해당 SecurityFilterChain이 가지고 있는 필터들을 통과하도록 하여 보안과 관련된 처리가 진행되도록 함

정리하면 FilterChainProxy란 스프링 빈으로 등록되고 DelegatingFilterProxy의 대리자 역할을 수행하는 Filter 인터페이스의 구현체

1-2. 동작 방식

  1. DelegatingFilterProxy가 필터로서 가로챈 요청을 FilterChainProxy에 위임
  2. FilterChainProxy는 자신이 가지고 있는 SecurityFilterChain에 요청을 흘려보냄
  3. SecurityFilterChain에 있는 필터들이 통과되며 Security와 관련된 처리가 진행됨

2. SecurityFilterChain 인터페이스의 메서드 정의

이 인터페이스는 matches()getFilter() 메서드를 가지고 있음

matches()

SecurityFilterChain 구현체가 해당 요청을 처리하기에 적합한지를 판별하는 역할 수행

시큐리티는 matches() 메서드에서 활용할 수 있는 RequestMatcher 인터페이스와 여러 구현체를 제공함

ex. AnyRequestMatcher를 사용 시 모든 HTTP 요청이 해당 SecurityFilterChain 구현체를 통과함

시큐리티는 URL을 기반으로 요청을 구분할 수 있도록 AntPathRequestMatcher도 제공함

만약 matches()true를 반환하면 요청은 해당 SecurityFilterChain을 거치게되는데, 이때 getFilter() 메서드가 호출되면서 요청이 SecurityFilterChain 구현체의 필터 목록에 있는 모든 필터를 거치게됨

시큐리티의 기본 설정을 사용할 경우 SecurityFilterChain 구현체인 DefaultSecurityFilterChain이 사용됨

Last updated on