​​ Spring에서 인터셉터 사용하기 – 인증, 로깅 등에 활용하는 방법
본문 바로가기
개발

Spring에서 인터셉터 사용하기 – 인증, 로깅 등에 활용하는 방법

by 컴밥 2025. 4. 25.

Spring 웹 애플리케이션을 개발하다 보면 요청(request)이 컨트롤러에 도달하기 전이나 응답(response)이 클라이언트로 전달되기 전에 어떤 로직을 삽입하고 싶은 경우가 있습니다.
이럴 때 유용하게 사용할 수 있는 기능이 바로 인터셉터(Interceptor)입니다.

이번 글에서는 스프링에서 인터셉터가 무엇인지, 어떻게 사용하는지, 실제로 인증, 로깅 등에 어떻게 활용할 수 있는지 소개해보겠습니다.

 

인터셉터란?

인터셉터는 HandlerInterceptor 인터페이스를 구현하여 정의합니다.
이는 DispatcherServlet이 컨트롤러에 요청을 전달하기 전/후, 뷰 렌더링 전에 특정 작업을 수행할 수 있도록 해주는 가로채기(Interceptor) 기능입니다.

서블릿 필터(Filter)와 유사하지만, 보다 Spring MVC에 밀접하게 통합되어 있으며 컨트롤러 단위로 세밀한 처리가 가능하다는 점이 특징입니다.

 

핵심 메서드 3가지

HandlerInterceptor 인터페이스에는 세 가지 주요 메서드가 있습니다.

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    • 컨트롤러 진입 전 실행
    • false를 반환하면 이후 로직은 실행되지 않음
  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    • 컨트롤러 실행 후, 뷰 렌더링 전 호출
  3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    • 요청 처리가 완료된 뒤, 예외 여부와 관계없이 실행

 

인터셉터 구현 예시 – 로깅용

@Component
public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("[LOG] 요청 URI: " + request.getRequestURI());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) throws Exception {
        System.out.println("[LOG] 요청 처리 완료");
    }
}

 

 

인터셉터 등록하기

인터셉터는 등록하지 않으면 동작하지 않기 때문에 WebMvcConfigurer를 구현한 설정 클래스에서 등록해주어야 합니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoggingInterceptor loggingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loggingInterceptor)
                .addPathPatterns("/api/**")      // 특정 경로에만 적용
                .excludePathPatterns("/static/**"); // 제외할 경로
    }
}

 

 

인증 처리에 인터셉터 활용

가장 대표적인 활용 사례는 로그인 인증입니다.
로그인하지 않은 사용자가 보호된 페이지에 접근하려 할 때 인터셉터에서 요청을 차단할 수 있습니다.

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

 

 

Filter와 Interceptor의 차이점

항목 Filter Interceptor
위치 서블릿 컨테이너 레벨 스프링 MVC 레벨
대상 DispatcherServlet 이전 요청 전체 DispatcherServlet 이후의 요청
목적 공통 처리 (예: 인코딩) 요청 흐름 제어, 컨트롤러 진입 전후 로직
등록 방식 @WebFilter, FilterRegistrationBean 등 WebMvcConfigurer를 통해 등록

 

 

주의할 점

  • 인터셉터 내부에서 response.sendRedirect()를 사용할 경우 이후 컨트롤러는 실행되지 않음
  • 정적 리소스 경로에는 기본적으로 적용되지 않지만 명시적으로 경로를 지정하면 적용 가능
  • 너무 많은 로직을 넣으면 성능 저하의 원인이 될 수 있으므로 필요한 최소한의 처리만 수행하는 것이 좋음

 

Spring의 인터셉터는 필터보다는 좀 더 고수준의 요청 흐름 제어 도구로, 인증, 접근 제어, 요청 로깅, 타이머 처리 등 다양한 영역에서 유용하게 쓰입니다.
Filter와의 차이를 이해하고, 컨트롤러 이전/이후 단계에서 필요한 로직을 잘 설계하면, 코드의 분리도와 유지보수성이 훨씬 높아집니다.

애플리케이션 구조를 체계적으로 관리하고 싶다면 인터셉터는 꼭 익혀야 할 필수 도구 중 하나입니다.

 

spring