인터셉터(Interceptor)와 필터(Filter)

2025. 7. 2. 00:00·탐구하기

Spring에서 Interceptor와 Filter는 요청(Request)와 응답(Response)을 가로채서 공통 처리를 할 수 있게 해주는 기능입니다.
둘은 비슷하지만 동작 시점과 목적이 다릅니다.


✅ 한눈에 보기: Filter vs Interceptor

항목 Filter Interceptor

소속 서블릿(Servlet) 스펙 Spring MVC
실행 시점 DispatcherServlet 이전 DispatcherServlet 이후
대상 모든 요청 (*.css, *.js, /api, 등 포함) 컨트롤러 요청 (@Controller만)
구현 방식 javax.servlet.Filter 구현 HandlerInterceptor 구현
사용 목적 인코딩, CORS, 보안, 인증 등 전역 처리 로그인 체크, 권한 체크, 로깅 등 컨트롤러 전용 처리
설정 위치 WebFilter, FilterRegistrationBean 등 WebMvcConfigurer의 addInterceptors()

✅ 1. Filter (필터)

  • Servlet 기반 동작 → Spring이 아닌 일반 Java 웹앱에서도 사용 가능
  • 클라이언트 요청 → 필터 → DispatcherServlet
  • 정적 리소스도 필터링 가능

📌 예시: 로그인 체크용 Filter

@Component
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        String uri = req.getRequestURI();

        if (uri.startsWith("/admin") && req.getSession().getAttribute("loginUser") == null) {
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("/login");
            return;
        }

        chain.doFilter(request, response); // 다음 필터 or 서블릿으로 전달
    }
}

✅ 2. Interceptor (인터셉터)

  • Spring MVC 전용 기능
  • DispatcherServlet에서 컨트롤러를 호출하기 직전/직후에 개입
  • 주로 컨트롤러 진입 전/후 처리가 필요한 경우 사용

📌 인터셉터 구현

public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        HttpSession session = request.getSession();
        if (session.getAttribute("loginUser") == null) {
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

📌 등록 방법 (WebMvcConfigurer)

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginCheckInterceptor())
                .addPathPatterns("/admin/**")
                .excludePathPatterns("/login", "/css/**");
    }
}

✅ 동작 순서 비교

클라이언트 요청
   ↓
[Filter] (서블릿 전역 처리)
   ↓
DispatcherServlet
   ↓
[Interceptor - preHandle()] (컨트롤러 전)
   ↓
@Controller
   ↓
[Interceptor - postHandle()] (컨트롤러 후)
   ↓
View Resolver
   ↓
[Interceptor - afterCompletion()] (뷰 렌더링 후)
   ↓
응답

✅ 정리 요약

구분 Filter Interceptor

동작 위치 DispatcherServlet 이전 DispatcherServlet 이후, 컨트롤러 전후
사용 목적 전역 요청 필터링 (보안, 인코딩, 로깅 등) 컨트롤러 로직에 대한 사전/사후 처리
정적 리소스 처리 O X
요청 정보 접근 ServletRequest HttpServletRequest
설정 위치 FilterChain WebMvcConfigurer

✅ 실제 사용 예시

기능 추천 방식

인코딩 설정 (UTF-8) Filter
인증 토큰 검사 (JWT 등) Filter or Interceptor
로그인 세션 체크 Interceptor
요청 로깅 Interceptor (또는 AOP)
정적 리소스 차단 Filter

 

'탐구하기' 카테고리의 다른 글

Dispatcher Servlet은 무엇일까?  (0) 2025.07.02
@Controller와 @RestController의 차이점  (0) 2025.07.01
JPA와 MyBatis의 차이점  (0) 2025.07.01
JPA란 무엇일까?  (0) 2025.07.01
MyBatis란 무엇일까?  (0) 2025.06.30
'탐구하기' 카테고리의 다른 글
  • Dispatcher Servlet은 무엇일까?
  • @Controller와 @RestController의 차이점
  • JPA와 MyBatis의 차이점
  • JPA란 무엇일까?
ayinyun
ayinyun
ayinyun 님의 블로그 입니다.
  • ayinyun
    ayinyun 님의 블로그
    ayinyun
  • 전체
    오늘
    어제
    • 분류 전체보기 (75)
      • SQL 개발 공부 (8)
      • JAVA 개발 공부 (4)
      • JavaScript(JS) (1)
      • React (1)
      • 탐구하기 (38)
      • KPT회고록 (14)
      • SpringBoot (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ayinyun
인터셉터(Interceptor)와 필터(Filter)
상단으로

티스토리툴바