[Spring] Interceptor, filter
스프링 MVC에서 아주 중요한 요청-응답 사이의 가로채기 메커니즘이다.
로그인 체크, 로깅, 권한 검사, 트랜잭션 시작/종료, 타이머 측정 같은 공통 관심사를 컨트롤러 전에 처리할 수 있게 해준다.
스프링 인터셉터는 DispatcherServlet과 Controller 사이에서 HTTP 요청과 응답을 가로채는 역할
스프링은 다중 인터셉터를 지원하기 때문에 여러 개의 인터셉터를 등록하고 순차적으로 실행 할 수 있다.
HandlerInterceptor 인터페이스
스프링 인터셉터는 HandlerInterceptor 인터페이스를 구현하여 작성된다.
해당 인터페이스는 세가지의 메서드를 가지고 있다.
- preHandle() : 컨트롤러 실행전 호출되는 메서드, 요청을 가로채어 사전작업을 할 수 있다.
- postHandle() : 컨트롤러 실행 이후에 호출되는 메서드, 컨트롤러의 실행 결과에 대한 후처리 작업을 담당한다.
- afterCompletion() : 뷰 렌더링까지 완료된 후 호출되는 메서드, 최종적인 작업처리 수행가능

단, 인터셉터는 HTTP 요청-응답 흐름에만 작동한다. @Async 같은 비동기 호출은 AOP 같은 다른 기법이 필요하다.
장점:
- 공통적인 기능을 일괄적으로 관리가 가능하다 (관심사 분리)
- 예외 처리를 중앙화 시켜 일관된 방식으로 예외처리가 가능하다.
단점 :
- 요청과 응답사이에 위치하여서 매 요청마다 인터셉터가 실행되어야 한다.
인터셉터가 복잡한 과정을 처리하거나 너무 많으면 병목을 가져 올 수 있다.
- HTTP 요청에서만 적용이 가능하다.
스프링 필터
DispatcherServlet에 요청이 도달하기 전후에 요청에 대한 부가작업을 처리할 수 있게 해준다.
서블릿 필터에 정의된 기능이기 DispatcherServlet 이전에 동작하며, Spring Context와 무관함.
즉 필터는 스프링 범위 밖에서 처리가 된다.
톰캣과 같은 웹 컨테이너에 의해 관리가 되고 디스패처 서블릿 전/후에 처리

주로 하는 일
- XSS/SQL Injection 방어
- 인증/인가 (토큰 검사)
- 요청 로깅, 응답 헤더 추가
- CORS 설정
필터의 주요 메서드
- init :
필터가 최초 생성될 때 한 번만 호출됨 이후의 요청들은 doFilter를 통해 처리된다.
- doFilter : 실제 요청과 응답을 가로채는 로직이 실행되는 메서드, 모든 요청마다 실행된다.
chain.doFilter(request, response)를 호출해야 다음 필터나 서블릿으로 요청이 전달
- destroy : 필터가 서버에서 제거될 때 (종료되거나 리로드될 때) 호출된다.
열어둔 리소스를 정리하거나 DB 연결종료 등에 사용된다.
| 항목 | Filter | Interceptor |
| 정의 | 서블릿 스펙 (javax.servlet.Filter) | Spring MVC 스펙 (HandlerInterceptor) |
| 동작 시점 | DispatcherServlet 이전 | DispatcherServlet 이후 |
| 대상 | 모든 요청 (정적 리소스 포함) | 컨트롤러로 가는 요청만 |
| 등록 위치 | @Component, FilterRegistrationBean | WebMvcConfigurer.addInterceptors() |
| Spring Context 접근 | 불가능 or 제한적 | Spring Bean 주입 가능 (DI 가능) |
| 전형적 용도 | 보안 필터(XSS, CORS), 인코딩, 로깅 | 로그인 체크, 권한 검사, API 호출 로깅 |
| 작동 범위 | 서블릿 전체 | Spring MVC 요청만 (REST API 포함) |
| 응답 후처리 | 응답 본문 포함한 전체 처리 가능 | 응답 직전까지만 가능 (뷰 렌더링 전후 등) |
보통 Spring 관련한 기능을 같이 사용할때 인터셉터를 사용한다.
필터는 성능, 보안, 로깅 목적등의 저수준 작업을 수행할때 많이 사용되고 (필터는 모든 요청에 대해 가장 먼저실행, 정적리소스 포함)
인터셉터는 인증. 권한, 세션 등의 고수준 작업에서 많이 사용된다.