Dev./Spring

[Spring] Interceptor 정리

limitation01 2025. 12. 2. 00:23

Interceptor란

Spring MVC에서 컨트롤러(Controller) 호출 전·후에 요청을 가로채서 공통 로직을 수행하는 도구

JWT 기반 인증이 끝난 후, 인증된 사용자 정보(SecurityContext)를 활용해

  • 자원 소유자 검증
  • 역할 기반 접근 제어
  • API 사용 제한
  • 등의 부가 검증 수행

Spring MVC 요청 흐름

[사용자 요청]
    ↓
[JwtFilter]
    ↓
[SecurityContextHolder에 인증 저장]
    ↓
[Interceptor]
    ↓
[인증 사용자 검증]
    ↓
[Controller]

Interceptor가 왜 필요할까?

예를 들어 컨트롤러 마다 다음과 같은 코드가 반복된다면

if (!isLogin(request)) {
    throw new UnauthorizedException();
}
  • 컨트롤러 코드가 지저분해짐
  • 인증/권한 로직이 비즈니스 로직과 섞임
  • 수정 시 모든 컨트롤러를 건드려야 함

공통 로직을 컨트롤러 밖으로 빼기 위해 Interceptor를 사용


HandlerInterceptor

Filter와 마찬가지로 구현되어있는 HandlerInterceptor를 활용

메서드 설명
preHandle 컨트롤러 실행 전에 동작 ( false 반환 시 흐름 중단 가능)
postHandle 컨트롤러 실행 후, 뷰 렌더링 전
afterCompletion 응답 완료 후, 예외 처리 포함

preHandle

@Override
public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) {
    // 인증, 권한 체크
    return true;
}

역할

  • 컨트롤러에 들어가기 전에 실행
  • 인증 / 권한 / 로그인 여부 검사

리턴 값

  • true → 요청 계속 진행 (Controller 실행)
  • false → 요청 중단 (Controller 실행 X)

구현 예시 - 인증 체크

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) {

        Long userId = (Long) request.getAttribute("userId");

        if (userId == null) {
            throw new UnauthorizedException("로그인이 필요합니다.");
        }

        return true;
    }
}

Interceptor 등록 방법

Interceptor는 자동으로 적용되지 않는다.
WebMvcConfigurer에 명시적으로 등록해야 한다.

@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {

    private final AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/auth/**");
    }
}
  • addPathPatterns : 적용할 URL
  • excludePathPatterns : 제외할 URL
  • interceptor는 URL 기준으로 동작

그래서 언제 사용해야할까?

  • 로그인 / 인증 / 권한 체크
  • 특정 URL 접근 제어
  • 요청 로깅 (URI, IP)