본문 바로가기

IT/기타

Spring Interceptor란?

반응형

Spring Interceptor는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청을 가로채어 추가적인 처리를 수행할 수 있도록 해주는 기능입니다. 이는 Spring MVC에서 제공하는 기능으로, HandlerInterceptor 인터페이스를 구현하여 요청 전/후 처리, 공통 로직(예: 인증, 로깅, 권한 검사 등)을 쉽게 적용할 수 있습니다.

1. Spring Interceptor의 특징


• DispatcherServlet과 Controller 사이에서 동작하며, 요청을 가로챌 수 있음.
• 필터(Filter)와 유사하지만, Spring MVC에 특화되어 있음.
• 하나의 요청에 대해 여러 개의 인터셉터를 적용할 수 있음.
• 특정 URL 패턴에 대해서만 적용할 수 있음.

2. Spring Interceptor의 동작 흐름


Spring Interceptor는 다음 3가지 메서드를 통해 특정 시점에서 요청을 가로챌 수 있습니다.

 preHandle() (컨트롤러 실행 전)
• 클라이언트 요청을 가로채 컨트롤러 실행 전에 실행됨.
• 반환값이 true이면 다음 단계 진행, false이면 요청 종료.
• 주로 인증(Authentication), 권한(Authorization) 검사 등에 사용.

 postHandle() (컨트롤러 실행 후, 뷰 렌더링 전)
• 컨트롤러가 실행된 후 실행되며, 응답을 조작할 수 있음.
• 주로 모델 데이터 추가, 로그 기록 등에 사용.

 afterCompletion() (뷰 렌더링 후, 응답 완료 후)
• 요청 처리가 완료된 후 실행됨.
• 주로 리소스 정리, 예외 처리 로깅 등에 사용.

3. Spring Interceptor 구현 방법


Spring Interceptor를 구현하려면 HandlerInterceptor 인터페이스 또는 HandlerInterceptorAdapter 클래스를 상속받아 사용합니다.

  Interceptor 클래스 생성

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    // 컨트롤러 실행 전 (요청 전)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle: 요청 처리 전 실행");
        return true; // true이면 컨트롤러로 진행, false이면 요청 종료
    }

    // 컨트롤러 실행 후 (뷰 렌더링 전)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle: 컨트롤러 처리 후 실행");
    }

    // 뷰 렌더링 후 (요청 완료 후)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion: 요청 완료 후 실행");
    }
}


 Interceptor를 Spring에 등록

Interceptor를 사용하려면 WebMvcConfigurer를 구현하고 addInterceptors() 메서드에서 등록해야 합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/api/**") // 특정 경로에 대해서만 인터셉터 적용
                .excludePathPatterns("/api/login", "/api/public/**"); // 특정 경로 제외
    }
}
반응형


4. Filter와 Interceptor의 차이점

비교 항목FilterInterceptor
적용 범위Servlet 레벨Spring MVC 레벨
동작 시점DispatcherServlet 이전DispatcherServlet 이후 (Controller 실행 전후)
주요 목적요청 및 응답 변형 (인코딩, 보안)요청/응답을 분석하고 컨트롤러 실행 전후 처리
사용 인터페이스javax.servlet.Filterorg.springframework.web.servlet.HandlerInterceptor


Filter는 모든 요청을 처리할 수 있으며, 인증/보안 관련 작업을 처리하는 데 주로 사용됨.

Interceptor는 Spring MVC 내부의 요청 흐름을 제어하며, 특정 컨트롤러에 대한 전후 처리를 수행하는 데 유용함.


5. Interceptor 활용 예시


  인증(Authentication) 및 권한(Authorization) 체크

✔️  사용자가 특정 API를 호출할 때, 로그인 여부를 확인하고 권한이 없으면 차단.

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String token = request.getHeader("Authorization");

    if (token == null || !token.equals("VALID_TOKEN")) {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
        return false;
    }

    return true;
}


  로깅(Logging)

✔️  요청 및 응답의 정보를 기록하여 디버깅 및 모니터링.

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("요청 URL: " + request.getRequestURL());
    System.out.println("응답 상태 코드: " + response.getStatus());
}


  특정 API 요청 제한

✔️  예를 들어, /admin/** 경로의 API는 관리자만 접근하도록 설정.

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String userRole = (String) request.getSession().getAttribute("USER_ROLE");

    if (request.getRequestURI().startsWith("/admin") && !"ADMIN".equals(userRole)) {
        response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden");
        return false;
    }

    return true;
}


• Spring Interceptor는 요청을 가로채 전후 처리를 수행하는 기능으로, 인증, 로깅, 권한 검사 등에 활용됨.
• HandlerInterceptor 인터페이스의 preHandle(), postHandle(), afterCompletion()을 구현하여 사용.
• WebMvcConfigurer에서 addInterceptors() 메서드를 사용하여 등록.
• Filter와 유사하지만, Spring MVC 내부에서 동작하며 컨트롤러 실행 전후에 적용됨.


반응형