-
Filter와 FilterChain에 대하여 알아보자스터디/Spring 2023. 4. 7. 14:49728x90
이번 포스팅에서는 Servlet Filter와 FilterChain에 대해 알아보겠습니다. 이름에서 짐작할 수 있듯이, FilterChain은 여러 개의 Filter를 체인 형태로 연결하여 순차적으로 처리하는 역할을 합니다. 어떻게 처리할 수 있는 지 알아보겠습니다.
그 전에 Filter에 대해서 가볍게 확인해보고 가겠습니다.
Filter 인터페이스
Filter 인터페이스에는 doFilter 메서드가 있습니다. 해당 메서드의 파라미터에는 요청과 응답 정보를 담고 있는 ServletRequest와 ServletResponse 객체가 포함되어 있습니다. Filter는 이를 사용해서 웹 애플리케이션의 요청과 응답을 쉽게 처리할 수 있습니다.
Filter의 doFilter 메서드의 동작 과정은 아래와 같습니다.- doFilter 메서드에서 요청을 가로채서 필요한 처리를 수행합니다. (검증, 변형 등)
- filterChain.doFilter()를 호출하여 다음 단계로 요청을 넘깁니다.
- .....
- doFilter 메서드에서 응답을 가로채서 필요한 처리를 수행합니다.
- 최종적으로 응답이 클라이언트에게 전송됩니다.
이러한 필터는 Spring Boot에서는 FilterRegistrationBean을 사용하여 필터를 등록할 수 있습니다. 등록할 때, 순서와 urlPatterns 등을 지정할 수 있습니다.
ApplicationFilterChain
AppliationFilterChain은 FilterChain 인터페이스의 구현체입니다. Filter에서 doFilter 메서드를 호출하면 메서드 내부에서 다음 Filter로 넘어가기 위해서 filterChain.doFilter 메서드를 호출합니다.
doFilter 메서드에서는 시큐리티가 활성화 되어있는 지 확인한 다음 활성화되어있지 않다면, internalDoFilter 메서드를 호출합니다.internalDoFilter 메서드에는 n과 pos라는 변수를 사용합니다.
n은 filterChain에 등록된 필터의 개수를 의미합니다. 그리고, pos 지역 변수는 현재 필터의 인덱스를 나타냅니다.여기서는 pos가 n보다 작다면 pos++를 수행하여 다음 필터를 실행할 수 있도록 하고, 현재 필터의 doFilter 메서드를 호출하여 실행합니다. 이 과정이 반복되어 FilterChain에 등록된 모든 필터가 실행되면, 요청은 DispatcherServlet으로 전달됩니다.
결론
Filter들은 FilterChain에 등록되며, 필터의 doFilter 메서드에서 filterChain.doFilter()를 호출하면 내부적으로 다음 필터의 doFilter 메서드가 실행됩니다.
그리고, Filter를 사용하면서 한 가지 주의해야할 것이 있습니다. 바로, return을 사용하는 것입니다.위에서 알 수 있듯이 return을 사용하면 다음 필터가 실행되지 않습니다. 그렇게 되면 요청이 DispatcherServlet으로 전달되지 않아 Handler가 실행되지 않습니다. 따라서, 비즈니스 로직을 정상적으로 처리해야하는 경우 return을 사용하면 안 됩니다.
지금까지 Filter와 FilterChain간의 관계에 대해서 알아보았습니다. 감사합니다.
728x90'스터디 > Spring' 카테고리의 다른 글
private 메서드는 트랜잭션 처리를 할 수 없는 이유 (0) 2023.07.26 DTO에 대한 고민 (0) 2023.07.17 Argument Resolver에 대해서 알아보자 (0) 2023.03.30 쓰레드 풀을 이용한 쓰레드 관리 (0) 2023.03.26 Postman사용 방법 (0) 2022.10.10