본문 바로가기

Spring Framework/SpringSecurity

[Spring Security] Servlet 기반 어플리케이션 보안의 개요 - FilterChain

개요

이 글은 Spring Security 6.4.3을 기반으로 작성되었습니다.

 

 

스프링 시큐리티의 Servlet 지원은 Servlet 필터(Filter) 위에서 동작합니다.

따라서 필터가 뭔지 아는 것이 먼저입니다.

 

FilterChain

위의 이미지는 하나의 HTTP request에 대해서 어떻게 처리하는 지 보여줍니다.

 

만약 클라이언트(Clinet)가 request를 하나 보내면, container에서는 FilterChain을 생성합니다.

이 FilterChain에는 여러 개의 Filter들과 하나의 Servlet이 포함되어 있습니다.

 

Spring MVC 어플리케이션에서는 주로 DispatcherServlet의 객체가 Servlet이 됩니다.

 

 

이 그림에서 중요한 건 두 가지입니다.

첫째, 대부분의 경우 1개의 Servlet이 1개의 HttpServletRequest를 다루지만, Filter는 여러 개가 가능합니다.

둘째, Filter는 아래로 흐릅니다. 즉, 한 request는 여러 Filter들을 거쳐 작동됩니다. 
그러므로, 순서는 매우 중요합니다.

 

하나의 request에 대해서 Filter는 일종의 관문 역할을 하며,

Client와 Servlet 사이에서 전처리 역할을 담당한다고 보시면 될 것 같습니다.

 

 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	// do something before the rest of the application
	chain.doFilter(request, response); // invoke the rest of the application
	// do something after the rest of the application
}

위의 코드는 FilterChain의 사용 예시입니다.

doFilter 메서드는 doFilter를 다시 호출해 다음 필터로 넘기고, 나머지 로직이 호출되도록 합니다.

 

 

 

다음 포스트에서는 FilterChain의 내부 로직 중 하나인

DelegatingFilterProxy와 FilterChainProxy에 대해 다뤄보겠습니다.

 

 

Reference

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