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)
'Dev. > Spring' 카테고리의 다른 글
| [Spring] AOP 정리 (0) | 2025.12.03 |
|---|---|
| [Spring] interface의 default 메서드를 언제 써야 할까 (0) | 2025.11.29 |
| [Spring] 스프링이 싱글톤 빈을 생성하는 과정 (0) | 2025.11.21 |
| [Spring] Lombok 생성자 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (1) | 2025.11.20 |
| [Spring] 응답DTO에 엔티티 의존성을 주입해야 하는 경우 (0) | 2025.11.19 |