Filter 필터와 Interceptor 인터셉터

1. Filter 필터

1.1 개념

Filter는 서블릿(Servlet)으로 요청이 전달되기 전, 또는 응답이 클라이언트로 반환되기 전에 요청과 응답을 전처리하거나 후처리하는 메커니즘입니다.

Filter는 Java 웹 애플리케이션의 핵심 구성 요소(Servlet, Filter, Listener) 중 하나입니다.

주로 로그인 검증, 인코딩 통일, 민감 문자 처리 등 공통적인 작업을 수행하는 데 사용됩니다.

@WebFilter(urlPatterns = "/*") // 필터가 차단할 요청 경로 설정 ("/*"는 모든 브라우저 요청 차단)
public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init: 초기화 메서드 호출됨");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        System.out.println("LogFilter: 요청 차단됨 - 전처리 로직");
        // 요청 전달
        chain.doFilter(req, res);
        System.out.println("LogFilter: 후처리 로직");
    }

    @Override
    public void destroy() {
        System.out.println("destroy: 소멸 메서드 호출됨");
    }
}

Filter 클래스에 @WebFilter 애노테이션을 추가한 후, 애플리케이션 진입점에 @ServletComponentScan 애노테이션을 추가하여 Spring Boot에서 서블릿 구성 요소를 활성화해야 합니다.

@ServletComponentScan
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

참고: 필터에서 chain.doFilter(req, res)를 호출하여 요청을 전달하지 않으면 후속 리소스에 접근할 수 없습니다.

1.2 필터의 세 가지 메서드

1.2.1 init()

필터 객체가 생성될 때 자동으로 호출되며, 한 번만 실행됩니다.

1.2.2 doFilter()

요청이 차단될 때마다 매번 호출되는 핵심 메서드로, 요청과 응답을 처리합니다. chain.doFilter()로 요청을 전달할 수 있습니다.

1.2.3 destroy()

서버가 종료될 때 자동으로 호출되며, 한 번만 실행됩니다.

1.3 차단 경로 설정

  • 특정 경로: /login/login 경로만 차단
  • 디렉터리 차단: /api/*/api/ 하위 모든 리소스 차단
  • 모든 경로: /* – 모든 리소스 차단

1.4 필터 체인 (다중 필터)

웹 애플리케이션에 여러 필터를 구성할 수 있으며, 이를 필터 체인이라고 합니다. 필터 실행 순서는 클래스 이름의 알파벳 순서에 따라 결정됩니다.

1.5 구현 단계

  1. 필터 클래스 정의: javax.servlet.Filter 인터페이스를 구현하고 모든 메서드를 재정의
  2. 경로 설정: @WebFilter 애노테이션으로 차단할 리소스 경로 지정

요청 처리 흐름:

  1. 요청 URL 획득
  2. URL에 login이 포함되어 있으면 통과
  3. 요청 헤더에서 토큰(token) 획득
  4. 토큰이 없으면 미인증 오류 반환
  5. 토큰을 파싱하여 검증 실패 시 미인증 오류 반환
  6. 모든 검증 통과 시 요청 전달

2. Interceptor 인터셉터

2.1 개념

Interceptor는 컨트롤러(Controller)로 요청이 전달되기 전후 또는 뷰(View)가 렌더링된 후에 로직을 실행할 수 있는 Spring MVC의 기능입니다.

필터와 유사하지만 Spring 컨텍스트 내에서 동작하며, 주로 인증, 로깅, 성능 모니터링 등에 사용됩니다.

2.2 세 가지 메서드

2.2.1 preHandle()

컨트롤러 실행 에 호출되며, true를 반환하면 요청이 계속 진행되고, false를 반환하면 중단됩니다.

2.2.2 postHandle()

컨트롤러 실행 에 호출되며, 뷰 렌더링 전에 추가 처리를 수행합니다.

2.2.3 afterCompletion()

뷰 렌더링이 완료된 에 호출되어 리소스 정리 등의 작업을 수행합니다.

2.3 구현 단계

  1. 인터셉터 클래스 정의: HandlerInterceptor 인터페이스 구현
  2. 등록 및 설정: WebMvcConfigurer 인터페이스를 구현하여 인터셉터 등록
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("AuthInterceptor: preHandle 실행");
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        // 토큰 검증 로직
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("AuthInterceptor: postHandle 실행");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("AuthInterceptor: afterCompletion 실행");
    }
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")     // 차단할 경로
                .excludePathPatterns("/api/login"); // 제외할 경로
    }
}

2.4 필터와 인터셉터의 실행 순서

두 구성 요소를 함께 사용할 경우 실행 순서는 다음과 같습니다:

  1. Filter의 doFilter() 전처리
  2. Interceptor의 preHandle()
  3. 컨트롤러 실행
  4. Interceptor의 postHandle()
  5. Filter의 doFilter() 후처리
  6. Interceptor의 afterCompletion()

3. Filter와 Interceptor의 주요 차이점

구분 Filter Interceptor
기반 Servlet API 기반 Spring MVC 프레임워크 기반
적용 범위 모든 요청 (정적 리소스 포함) 컨트롤러로 전달되는 요청만
Spring 빈 주입 직접 지원하지 않음 (추가 설정 필요) 완전히 지원
주요 사용 사례 인코딩 처리, 보안 검사, 압축 인증, 로깅, 성능 측정, 권한 검사

태그: filter Interceptor Spring MVC Servlet Java Web

6월 15일 23:51에 게시됨