어제 오늘 내일

[Spring Boot] "누구냐 넌?" 요청을 가로채는 두 명의 문지기: Filter vs Interceptor 차이점 본문

IT/SpringBoot

[Spring Boot] "누구냐 넌?" 요청을 가로채는 두 명의 문지기: Filter vs Interceptor 차이점

hi.anna 2026. 3. 16. 01:38

 
웹 개발을 하다 보면 "모든 요청에 대해 로그를 남겨라", "로그인 안 한 사용자는 튕겨내라" 같은 요구사항을 받게 됩니다.
이걸 모든 컨트롤러 메서드에 복사-붙여넣기 하실 건가요? 절대 아니죠.
스프링 부트에는 요청을 중간에 가로채서 처리하는 강력한 도구 두 가지가 있습니다. 바로 필터(Filter)인터셉터(Interceptor)입니다. 둘 다 비슷해 보이지만, 활동 구역과 권한이 완전히 다릅니다.


1. 웹 컨테이너의 문지기: 필터 (Filter)

필터는 스프링(Spring) 영역 밖, 즉 웹 컨테이너(Tomcat) 영역에서 동작합니다.

  • 위치: 요청이 DispatcherServlet에 도착하기도 전에 가장 먼저 실행됩니다.
  • 특징: 스프링과 무관한, 날것 그대로의 HTTP 요청/응답을 조작할 수 있습니다.
  • 주요 용도:
  • 인코딩 변환 (UTF-8 등)
  • XSS(Cross Site Scripting) 방어
  • CORS 설정 (다른 도메인 요청 허용)
  • 보안 인증 (Spring Security가 Filter 기반입니다!)

구현 방법 ()

@Component
public class LogFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {

        System.out.println("1. [Filter] 요청 들어옴! 검문 검색 시작");

        // 다음 필터나 서블릿으로 요청을 넘김 (이거 안 하면 요청이 여기서 죽음!)
        chain.doFilter(request, response);

        System.out.println("4. [Filter] 응답 나감! 뒤처리 완료");
    }
}

2. 스프링의 비서: 인터셉터 (Interceptor)

인터셉터는 스프링 컨테이너 안에서 동작합니다. DispatcherServlet이 컨트롤러를 호출하기 직전과 직후에 끼어듭니다.

  • 위치: DispatcherServlet -> Interceptor -> Controller
  • 특징: 스프링의 모든 빈(Bean)에 접근할 수 있고, 어떤 컨트롤러(Handler)가 실행될지 정보를 알 수 있습니다.
  • 주요 용도:
  • 로그인 체크 (세션 검사)
  • 권한 체크 (관리자 여부)
  • 컨트롤러 실행 시간 측정
  • API 호출 로그 남기기

구현 방법 ()

@Component
public class LoginInterceptor implements HandlerInterceptor {

    // 컨트롤러 실행 전 (가장 많이 씀)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("2. [Interceptor] 컨트롤러 실행 직전!");

        // true: 다음 단계로 진행, false: 여기서 요청 끝!
        return true; 
    }

    // 컨트롤러 실행 후 (뷰 렌더링 전)
    @Override
    public void postHandle(...) {
        System.out.println("3. [Interceptor] 컨트롤러 실행 후 (예외 발생하면 실행 안 됨)");
    }
}

주의: 인터셉터는 만들고 나서 꼭 WebMvcConfigurer에 등록해 줘야 작동합니다!


3. 한눈에 보는 비교표 (면접 필수!)

구분 필터(Filter) 인터셉터(Interceptor)
관리자 웹 컨테이너 (Tomcat) 스프링 컨테이너 (Spring)
실행 시점 DispatcherServlet DispatcherServlet , Controller
조작 대상 ServletRequest, ServletResponse HttpServletRequest, Object handler (메서드 정보)
스프링 예외 처리 불가 (톰캣까지만 감) @ControllerAdvice로 처리 가능
사용 예시 인코딩, 보안(Security), CORS 로그인 체크, 권한, 로그, 실행 시간

4. 핵심 정리: 언제 뭘 써야 할까요?

  • "스프링과 상관없이 전역적으로 처리해야 해!"
    👉 Filter를 쓰세요. (예: 들어오는 모든 요청을 UTF-8로 바꾸기, 이미지 파일 압축하기)
  • "컨트롤러가 뭔지 알아야 하고, 로그인된 사용자 정보(Bean)가 필요해!"
    👉 Interceptor를 쓰세요. (예: "이 API는 관리자만 쓸 수 있어", "이 메서드 실행하는 데 3초 걸렸네?")

마치며

오늘의 결론입니다.

  1. 요청의 흐름: Client -> Filter -> DispatcherServlet -> Interceptor -> Controller
  2. 단순한 HTTP 조작은 Filter, 비즈니스 로직과 관련된 처리는 Interceptor.
  3. 스프링 시큐리티(Spring Security)는 Filter 기반으로 동작한다.

이제 여러분의 서버에는 든든한 문지기 두 명이 생겼습니다! 안심하고 비즈니스 로직 개발에 집중하세요.
다음 포스팅에서는 이 두 문지기로도 해결하기 힘든 "메서드 사이사이에 숨은 중복 코드를 제거하는 마법" AOP(Aspect Oriented Programming)에 대해 알아보겠습니다.
도움이 되셨다면 좋아요와 댓글 부탁드립니다! 😊

반응형
Comments