Filter
Filter
Filter
- Servlet Filter는 서블릿 스펙의 일부로, 웹 애플리케이션의 요정(Request) 또는 응답(Response)을 가로채고 가공할 수 있는 재사용 가능한 컴포넌트이다.
- Spring에서도 이를 활용해 인증/인가 필터, 로깅 필터, CORS 필터 등을 만들 수 있다.
Filter 동작 순서
- 클라이언트의 요청이 먼저 필터를 통과함
- 각 필터는 doFilter() 메서드를 통해 요청을 가로채고 필요 시 후속 필터 또는 서블릿으로 넘김
- 서블릿/컨트롤러가 응답을 생성한 후 필터로 다시 돌아옴
- 필터가 응답을 후처리하고 클라이언트로 전달
[HTTP 요청]
↓
[FilterChain: 여러 필터]
↓
[DispatcherServlet 또는 서블릿]
↓
[Controller 등 비즈니스 로직]
↓
[응답 생성]
↑
[Filter: 응답 후처리]
↑
[클라이언트]
Filter 사용 예시
- 로그인 검증
- JWT 토큰 검사
- CORS 처리
- 요청/응답 로깅
- 응답 캐싱
Filter 구현 예제
@WebFilter(urlPatterns = "/*")
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("Request URI: " + req.getRequestURI());
chain.doFilter(request, response); // 다음 필터 또는 서블릿으로 전달
System.out.println("Response processed");
}
}
- Spring에서 필터 등록 ( Spring boot )
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<LoggingFilter> loggingFilter() {
FilterRegistrationBean<LoggingFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new LoggingFilter());
registration.addUrlPatterns("/*");
return registration;
}
}
Filter 주요 사용 예
| 목적 | 설명 |
|---|---|
| 인증 처리 | 로그인 여부 확인 후 인증되지 않은 사용자는 접근 제한 |
| CORS 처리 | 응답에 CORS 헤더를 추가 |
| 로깅 | 요청 URI, 처리 시간, 사용자 정보 등 기록 |
| 인코딩 | UTF-8 등의 문자 인코딩 설정 |
| 보안 검사 | 요청 헤더, 파라미터에 대한 악성코드 검사 등 |
Filter의 장단점
- 장점
- 요청/응답 흐름 제어 가능 (컨트롤러 밖에서 동작)
- 관심사 분리 (예: 인증, 로깅 등을 독립적으로 관리)
- 다양한 URL에 공통 처리 적용 가능
- 단점
- 순서를 잘못 구성하거나 무분별하게 사용하면 디버깅이 어려움
- 비즈니스 로직과 동떨어져 있어 테스트가 어려울 수 있음
- Spring Security 필터와 충돌 우려가 있음 (주의 필요)
관련 개념
| 개념 | 설명 |
|---|---|
| Interceptor | Spring MVC 전용. Handler 실행 전/후 동작 가능. 컨트롤러 수준에서 동작함. |
| AOP | 메서드 단위의 공통 관심사를 처리. 트랜잭션, 로깅 등에서 사용됨. |
| Filter vs Interceptor | Filter는 서블릿 단위(DispatcherServlet 이전), Interceptor는 컨트롤러 단위(DispatcherServlet 이후). |
Spring 환경에서의 필터 순서
- Spring Boot에서는 다음과 같은 순서로 필터가 실행된다:
- Servlet Filter (javax.servlet.Filter)
- Spring Security Filter (내부에서 여러 FilterChain 구성됨)
- DispatcherServlet
- Interceptor
- Controller
- 필터 순서 조정이 필요하다면
FilterRegistrationBean#setOrder()를 통해 설정 가능하다.