스프링 필터와 인터셉터차이

이규훈·2025년 1월 27일

스프링 인터셉터(Interceptor)와 필터(Filter)는 웹 요청 처리 과정에서 사용되지만, 적용 시점, 범위, 기능 등에서 차이가 있습니다. 아래에 주요 차이점을 정리해드립니다.


1. 적용 시점과 위치

구분필터(Filter)인터셉터(Interceptor)
적용 영역서블릿 컨테이너(스프링 밖)스프링 컨텍스트(DispatcherServlet 내부)
실행 시점DispatcherServlet 이전에 동작DispatcherServlet 이후, 컨트롤러 진입 전/후에 동작
실행 순서필터 → DispatcherServlet → 인터셉터필터보다 나중에 실행
  • 필터: 모든 요청이 서블릿에 도달하기 전에 동작 (예: 인코딩, 보안)
  • 인터셉터: 스프링 MVC의 컨트롤러 호출 전/후, 뷰 렌더링 후에 동작 (예: 로깅, 권한 체크)

2. 설정 방식

구분필터인터셉터
등록 방법web.xml 또는 FilterRegistrationBeanWebMvcConfigureraddInterceptors()
예시 코드```java```java
@Bean@Override
public FilterRegistrationBean myFilter() {public void addInterceptors(...) {
FilterRegistrationBean reg = new ...;registry.addInterceptor(new MyInterceptor())
reg.addUrlPatterns("/*");.addPathPatterns("/admin/**");
return reg;}
}```
```

3. 기능과 제어 범위

구분필터인터셉터
요청/응답 제어요청/응답 객체를 변형 가능 (ServletRequestWrapper)기존 객체를 그대로 사용 (변형 불가)
스프링 빈 주입불가 (의존성 주입 어려움)가능 (스프링 빈으로 등록 가능)
예외 처리서블릿 단계에서 처리컨트롤러 계층의 예외 처리 (예: @ExceptionHandler) 활용 가능
URL 패턴 정밀도서블릿 규격의 단순 패턴 (예: /*)Ant 스타일 세부 패턴 (예: /admin/**)

4. 인터셉터의 세부 동작 시점

인터셉터는 3가지 메서드로 세밀한 제어가 가능합니다:
1. preHandle: 컨트롤러 실행 (인증/인가 체크)
2. postHandle: 컨트롤러 실행 (모델 데이터 수정)
3. afterCompletion: 뷰 렌더링 (자원 정리)

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, ...) {
        // 컨트롤러 진입 전
        return true; // false 시 요청 중단
    }

    @Override
    public void postHandle(...) {
        // 컨트롤러 실행 후, 뷰 렌더링 전
    }

    @Override
    public void afterCompletion(...) {
        // 뷰 렌더링 완료 후
    }
}

5. 사용 사례

필터인터셉터
- 크로스 사이트 스크립팅(XSS) 방어- 세션/인증 체크
- 요청 데이터 압축 해제- API 호출 로깅
- 공통 보안 헤더 추가 (CORS 등)- 실행 시간 측정
- 모든 요청에 대한 로깅- 컨트롤러 전/후 부가 작업

6. 선택 가이드

  • 필터를 선택할 때:
    • 서블릿 수준의 전역 처리 (예: 보안, 인코딩)
    • 스프링과 무관한 기능이 필요할 때
  • 인터셉터를 선택할 때:
    • 스프링 빈 주입이 필요할 때
    • 컨트롤러 실행 전/후의 세밀한 제어가 필요할 때

요약

  • 필터는 서블릿 수준에서 전역적으로 적용되며, DispatcherServlet 진입 전에 동작합니다.
  • 인터셉터는 스프링 MVC의 컨텍스트 내에서 세부적인 요청 흐름을 제어합니다.
  • 실행 순서: Filter1 → Filter2 → DispatcherServlet → Interceptor1 → Interceptor2 → Controller
profile
개발취준생

0개의 댓글