기술 제공자

관리되는 컨테이너가 각각 웹 컨테이너와 스프링 컨테이너이다.

실행 시점

Request/Response 조작 가능 여부

필터는 RequestResponse 객체 자체를 조작할 수 있다. 반면에 인터셉터는 불가능하다. 이를 조작할 수 있다는 것은 다른 객체로 변경하여 전달할 수 있다는 뜻이다.

public class CustomFilter implements Filter {
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // 조작된 request, response 로 doFilter() 의 호출이 가능하다.
    chain.doFilter(request, response);
  }
}
public class MyInterceptor implements HandlerInterceptor {
  default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // true, false 만 반환 가능하다.
    return true;
  }
}

용도

빈 등록 여부

사실상 둘 다 빈으로 등록이 가능하다고 보는 것이 맞다.

Interceptor 는 당연히 스프링에서 제공하는 기술이기에 빈 등록이 가능하다.

Filter 는 서블릿에서 제공하지만, 스프링에서 제공하는 DelegatingFilterProxy 로 프록시 필터 형태로 빈 등록이 가능하다.

스프링 부트에서는 내장 톰캣을 이용해 서블릿 컨테이너까지 스프링 부트가 제어하게 되므로 DelegatingFilterProxy 로 감싸서 등록할 필요도 없다.

출처

Filter, Interceptor, AOP 알아보기