실무 패턴: Filter와 Interceptor

moon.kick·2025년 4월 17일

좋은 질문이야!
Spring 실무에서는 Filter와 Interceptor를 함께 사용하는 구조가 매우 흔해.
각각의 역할을 분리하고 체계적으로 관리하는 게 핵심이야.


✅ 실무 패턴: Filter + Interceptor 함께 쓰기

구성 요소주요 역할
Filter전역 보안, 토큰 검증, CORS 처리, 인코딩 등 전처리
Interceptor로그인 상태 확인, 권한 검사, 응답 로깅 등 MVC 전처리/후처리

💡 실무 흐름 예시 (JWT 인증 시스템)

[1] Filter
    └─ JwtAuthFilter
         - Authorization 헤더에서 JWT 추출
         - 유효성 검증
         - SecurityContext에 인증 객체 저장

[2] Interceptor
    └─ AuthInterceptor
         - 특정 URI 요청 시 로그인 여부 확인
         - 관리자 권한 체크 등

[3] Controller

✅ 코드 예시 구성

1. 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); // 다음 필터 또는 서블릿으로 넘김
    }
}

2. AuthInterceptor.java

public 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;
    }
}

3. 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도메인 로직 처리게시물 조회, 회원가입 등

✅ 같이 쓰는 이유

  • Filter는 HTTP 수준 (보편적인 요청 처리)
  • Interceptor는 Spring MVC 수준 (비즈니스 전후처리)

🔄 결합 구조도

[Client]
   ↓
[JwtAuthFilter]           ← 서블릿 이전 전역 보안 처리
   ↓
DispatcherServlet
   ↓
[AuthInterceptor]         ← 컨트롤러 접근 제한
   ↓
[Controller]

필요하면 이 구조를 기반으로:

  • Spring Security와 통합한 버전 (Filter → SecurityContext → Interceptor)
  • AdminInterceptor, RoleCheckInterceptor 같은 분기 처리 방식
  • 테스트 방법 (MockMvc + Interceptor 검증)

도 설명해줄 수 있어!

계속 이어서 도와줄까? 😊

profile
@mgkick

0개의 댓글