🌿With Spring/Spring Security

Servlet Filter와 Filter Chain

코딩베이비 2022. 11. 28. 23:48

Servlet Filter

  • 서블릿 기반 애플리케이션에서 애플리케이션의 endpoint에 request가 도달하기 전에, 중간에서 request를 가로챈 후 어떠한 처리를 할 수 있는 포인트
  • 자바에서 제공하는 API. javax.servlet 패키지에 인터페이스로 정의되어 있음

ex)

  • 사용자의 웹 요청이 Controller 같은 endpoint에 도달하기 전에 인증 관리자나 인가 관리자 등의 컴포넌트가 중간에서 요청을 가로채 사용자의 credential과 authorization 등을 검사

 

Servlet Filter(서블릿 필터)는 하나 이상의 필터들을 연결해 Filter Chain을 구성할 수 있다.

Spring Framework의 DispatcherServlet에 클라이언트 요청이 전달되기 전 필터 체인

각각의 필터는 doFilter() 메소드를 반드시 가지고 있어야 하고, doFilter() 메소드를 통해 필터 체인을 형성하게 된다.

그림대로 필터가 형성될 경우, 클라이언트의 요청은 특별 작업들을 수행한 뒤, HttpServlet을 거쳐 DispatcherServlet으로 요청이 전달되고, 반대로 DispatcherServlet에서 전달한 응답 역시 특별한 작업들을 수행하게 할 수 있다.

 

Spring Security에서의 필터의 역할

Spring Security에서 사용하는 작업은 '보안'과 관련된 작업이다.

✔️DelegatingFilterProxy

Servlet Filter와 연결되는 Spring Security만의 필터를 ApplicationContext에 Bean으로 등록 후, 이 Bean들을 이용해서 보안과 관련된 여러가지 작업을 하게 되는데, 이 과정의 시작점이 DelegatingFilterProxy이다.

(Spring Security도 Spring Container인 ApplicationContext를 사용함)

🌟관련된 작업을 처리하는 것이 아닌, 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 다리 역할을 해주는 것!

 

✔️FilterChainProxy

Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음을 사용하기 위한 진입점FilterChainProxy이다.

FilterChainProxy부터 Spring Security에서 제공하는 보안 필터들이 작업들을 수행한다.

 

 

🏳️Spring Security의 Filter Chain은 URL 별로 여러개 등록될 수 있다.

🏳️어떤 Filter Chain을 사용할 지는 FilterChainProxy가 결정하고, 가장 먼저 매칭된 Filter Chain을 실행한다.

https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters

ex)

  • /api/** 패턴의 Filter Chain이 있고, /api/message URL 요청이 전송되는 경우
    • 디폴트 패턴인 /**과도 매칭되지만, 가장 먼저 /api/**가 매칭되기 때문에 SecurityFilterChain0만 실행
  • /message/** 패턴의 Filter Chain이 없는데 /message/ URL 요청을 전송하는 경우
    • 매칭되는 Filter Chain이 없기 때문에 디폴트 패턴인 /** 패턴의 SecurityFilterChainn을 실행

 

 

Spring Security에서 지원하는 Filter 목록

https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters