스프링부트 필터와 인터셉터의 차이

김세빈·2025년 5월 30일

백엔드

목록 보기
1/1

Spring Boot 애플리케이션을 개발하다 보면, HTTP 요청과 응답을 중간에 가로채어 처리해야 하는 경우가 자주 발생한다. 이때 사용하는 대표적인 방법이 바로 FilterInterceptor이다. 두 기능 모두 비슷한 역할을 하지만, 동작하는 시점과 활용 목적이 다르기 때문에 그 차이를 명확히 이해하고 적절한 상황에 적용하는 것이 중요하다.


1. Filter란?

Filter는 서블릿 API의 일부로, Spring의 DispatcherServlet에 도달하기 이전 단계에서 모든 요청을 처리한다. 즉, Spring Framework의 처리 흐름에 진입하기 전에 동작하게 된다.

Filter의 주요 활용 예시

  • 로깅: 요청 및 응답 정보를 로그로 남겨 디버깅 및 모니터링에 활용한다.
  • GZIP 압축: 응답 데이터를 압축하여 전송 속도를 개선한다.
  • 문자 인코딩 처리: UTF-8 등 통일된 인코딩 설정을 적용한다.
  • 보안 검사: 방화벽 설정, 속도 제한, 접근 제어 등의 전처리를 수행한다.
  • 요청/응답 수정: 예를 들어 데이터 래핑, 캐싱 처리, XSS 필터링을 수행한다.

Filter 구현 예시

@Component
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        System.out.println("Request received: " + request.getRemoteAddr());
        chain.doFilter(request, response); // 다음 필터 또는 서블릿으로 전달
        System.out.println("Response sent.");
    }
}
  • 모든 요청에 적용되며, 정적 리소스(CSS, JS, 이미지 등)도 포함된다.
  • 서블릿 컨테이너 수준에서 동작하기 때문에 Spring Bean이나 Controller에 직접 접근할 수 없다.

2. Interceptor란?

Interceptor는 Spring MVC의 구성 요소로, Spring 내부의 DispatcherServlet이 요청을 Controller로 전달하기 전후에 작동한다.

Interceptor의 주요 활용 예시

  • 인증 및 권한 검사: 로그인 상태 확인, 권한 검증 등의 로직을 수행한다.
  • 실행 시간 측정: 컨트롤러 처리 시간 등의 퍼포먼스 모니터링에 활용한다.
  • Model/View 수정: 응답 전 공통 데이터를 삽입하거나 뷰 모델을 수정한다.
  • 공통 속성 추가: 사용자 정보 등 공통 데이터를 모든 응답에 포함시킨다.

Interceptor 구현 예시

@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("Checking authentication...");
        return true; // 컨트롤러로 요청 계속 전달
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) {
        System.out.println("Controller executed.");
    }
}
  • Spring MVC Controller에만 적용되며, 정적 리소스에는 적용되지 않는다.
  • Spring ApplicationContext 내부에서 작동하므로 Spring Bean을 주입(@Autowired)받아 사용할 수 있다.

3. Filter vs Interceptor 주요 차이점

항목FilterInterceptor
실행 시점DispatcherServlet 이전Controller 실행 전/후
적용 범위모든 요청 (정적 리소스 포함)Spring MVC Controller 요청
Spring Bean 접근❌ 불가능✅ 가능
요청 타입전체 HTTP 요청Controller 요청만
요청/응답 수정헤더, 인코딩, 압축 등 가능Model, View 수정 가능 (응답 바디 직접 수정은 어려움)
주요 용도보안 필터, 로깅, 인코딩인증, 권한 검사, 컨트롤러 후처리

4. 언제 무엇을 써야 할까?

Filter를 사용해야 할 때

  • 모든 요청(정적 리소스 포함)에 대해 로깅, 보안 검사, 인코딩 처리 등을 적용하고자 할 때
  • 응답 압축(GZIP) 등의 기능이 필요한 경우
  • Spring Bean을 사용하지 않고 순수 서블릿 수준에서 처리할 경우

Interceptor를 사용해야 할 때

  • 컨트롤러 접근 전에 인증/인가 검사가 필요한 경우
  • 컨트롤러 실행 시간을 측정하거나 로그를 남기고 싶은 경우
  • 응답 전 공통 데이터(Model)를 삽입하고 싶은 경우
  • **Spring Bean(Service, Repository 등)**을 활용한 비즈니스 로직이 필요한 경우

5. 요약

구분FilterInterceptor
레벨서블릿 레벨Spring MVC 레벨
적용 대상전체 HTTP 요청Spring Controller 요청
Spring Bean 접근❌ 불가능✅ 가능
대표 용도인코딩, 압축, 보안인증, 로깅, 모델 처리

💡 선택 기준 요약

  • HTTP 요청 자체를 조작해야 한다면 → Filter
  • Controller 로직 전후로 로직을 삽입하고 싶다면 → Interceptor

마무리

Spring Boot에서 HTTP 흐름을 제어해야 할 때 Filter와 Interceptor는 매우 유용한 도구이다. 기능적으로 겹치는 부분도 있지만, 실행 시점과 활용 목적이 분명히 다르기 때문에 상황에 따라 적절하게 선택하여 사용해야 한다.

실무에서는 이 둘을 조합하여 사용하는 경우도 많으므로, 명확한 이해를 바탕으로 설계하는 것이 중요하다.

0개의 댓글