좋은 질문이야!
Spring 실무에서는 Filter와 Interceptor를 함께 사용하는 구조가 매우 흔해.
각각의 역할을 분리하고 체계적으로 관리하는 게 핵심이야.
| 구성 요소 | 주요 역할 |
|---|---|
| Filter | 전역 보안, 토큰 검증, CORS 처리, 인코딩 등 전처리 |
| Interceptor | 로그인 상태 확인, 권한 검사, 응답 로깅 등 MVC 전처리/후처리 |
[1] Filter
└─ JwtAuthFilter
- Authorization 헤더에서 JWT 추출
- 유효성 검증
- SecurityContext에 인증 객체 저장
[2] Interceptor
└─ AuthInterceptor
- 특정 URI 요청 시 로그인 여부 확인
- 관리자 권한 체크 등
[3] Controller
JwtAuthFilter.java@WebFilter(urlPatterns = "/*")
public class JwtAuthFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String token = request.getHeader("Authorization");
if (token != null && validateToken(token)) {
// 토큰에서 사용자 정보 파싱 → SecurityContext 등록 (혹은 custom context)
}
chain.doFilter(req, res); // 다음 필터 또는 서블릿으로 넘김
}
}
AuthInterceptor.javapublic class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userId = request.getAttribute("userId"); // Filter에서 setAttribute()한 값
if (userId == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
WebMvcConfigurer 등록@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/mypage/**", "/admin/**"); // 보호 URL만 지정
}
}
| 역할 | 처리 위치 | 예시 |
|---|---|---|
| Filter | 요청 전체 전처리 | JWT 검증, XSS 필터링, CORS, Charset |
| Interceptor | 컨트롤러 전/후 | 로그인 상태 확인, 관리자 여부 확인 |
| Controller | 도메인 로직 처리 | 게시물 조회, 회원가입 등 |
[Client]
↓
[JwtAuthFilter] ← 서블릿 이전 전역 보안 처리
↓
DispatcherServlet
↓
[AuthInterceptor] ← 컨트롤러 접근 제한
↓
[Controller]
필요하면 이 구조를 기반으로:
Filter → SecurityContext → Interceptor)도 설명해줄 수 있어!
계속 이어서 도와줄까? 😊