Java/Spring

[Spring] Filter와 Interceptor의 차이 정리

범데이 2025. 10. 31. 08:30

1. 개요

Spring MVC기반 웹 애플리케이션에서는 요청(Request)응답(Response)이 Controller에 도달하기 전 후로

다양한 처리가 필요한 경우가 많다.

(예: 로그인 세션 확인, 인코딩 설정, 접근 권한 체크, 로깅 등)

 

이때 사용할 수 있는 대표적인 두 가지 기술이 바로 FilterInterceptor이다.

 

 

 

2. Filter (javax.servlet.Filter)

개념

  • Servlet 표준 스펙에서 제공하는 기능이다.
  • DispatcherServlet 이전 단계에서 모든 요청을 가로채서 전처리/후처리 가능.
  • Spring MVC에 종속되지 않고, 톰캣/JEUS 등 Servlet 컨테이너 레벨에서 동작한다.

 

적용 시점

Client → Filter → DispatcherServlet → Controller → View

 

즉, Controller 진입 전에 실행된다.

 

주요 용도

  • 인코딩 처리(CharactorEncodingFilter)
  • 인증/권한 체크 (세션/토큰 확인)
  • XSS, CORS, 로깅 등 전역적인 요청 처리

 

설정 예시 (web.xml)

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

코드 예시

public class AuthCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession(false);

        if (session == null || session.getAttribute("USER") == null) {
            ((HttpServletResponse) res).sendRedirect("/login.do");
            return;
        }

        chain.doFilter(req, res); // 다음 Filter 또는 DispatcherServlet으로 이동
    }
}

 

 

 

3. Interceptor (org.springframework.web.servlet.HandlerInterceptor)

개념

  • Spring MVC 전용 요청 가로채기 기능
  • DispatcherServlet 이후 단계에서 동작
  • Spring Context 내에서 동작함으로, 빈 주입(@Autowired)이 가능하다.

 

적용 시점

Client → Filter → DispatcherServlet → Interceptor → Controller
                                    ↑         ↓
                            (preHandle)  (postHandle / afterCompletion)

 

주요 용도

  • Controller 호출 전 사용자 인증 / 권한 검사
  • Controller 실행 후 Model 데이터 가공
  • View 렌더링 후 로깅, 성능 측정

 

설정 예시 (spring-mvc.xml)

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="egovframework.example.common.interceptor.AuthInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

 

코드 예시

public class AuthInterceptor extends HandlerInterceptorAdapter {

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

        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("USER") == null) {
            response.sendRedirect("/login.do");
            return false; // Controller 진입 차단
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) throws Exception {
        // Controller 실행 후 로직
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception ex) throws Exception {
        // View 렌더링 후 로직
    }
}

 

 

 

4. 주요 차이점 비교

구분  Filter  Interceptor
소속 Servlet (javax.servlet) Spring MVC
적용 위치 DispatcherServlet 이전 DispatcherServlet 이후
주요 용도 인코딩, 로깅, 보안, CORS 등 전역 처리 로그인 세션, 권한, 로직 공통화
설정 위치 web.xml spring-mvc.xml
DI 지원 여부 X (Spring Bean 주입 불가) O (@Autowired 가능)
실행 메서드 doFilter() preHandle(), postHandle(), afterCompletion()
적용 범위 애플리케이션 전체 (모든 요청) Spring MVC 컨트롤러 영역 한정

 

 

 

5. 함께 사용하는 구조

대부분의 프로젝트에서는 Filter → Interceptor 병행 사용이 일반적이다.

계층  역할  예시
Filter 모든 요청에 대한 전처리 (인코딩, CORS, XSS 등) CharacterEncodingFilter, LoggingFilter
Interceptor Controller 진입 전후 처리 (로그인, 권한, 세션 관리 등) AuthInterceptor, MenuAccessInterceptor

 

예시 흐름도:

Client
 ↓
Filter (인코딩, 로깅)
 ↓
DispatcherServlet
 ↓
Interceptor (세션 검사, 공통 데이터 주입)
 ↓
Controller
 ↓
Service / DAO
 ↓
View(JSP)

 

 

 

6. 정리

  • Filter는 Servlet 레벨의 요청 흐름 제어기
  • Interceptor는 Spring MVC 레벨의 컨트롤러 전후 후킹 포인트

 

따라서,

전역 정책이나 보안/인코딩 은 Filter로,

비즈니스 로직 관련 공통 처리는 Interceptor로 관리하는 것이 이상적이다.

728x90
반응형