Spring에서 사용하는 Filter & Intercepter에 대해서 설명하는 글 입니다.
각각의 특징에 대해 알아보고 비교합니다.
Spring Web MVC의 전반적인 모습을 한번 그림을 통해 알아보자
Spring 에서 제공되는 것이 아닌 자바 서블릿에서 제공하는 기능이다.
Dispathcer Servlet에 요청이 전달되기 전/후 에 URL 패턴에 맞는 요청에 대한 부가 작업을 처리할 수 있는 기능을 제공한다.
스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리되는 것이고, 스프링 범위 밖에서 처리되는 것이다.
필터는 기본적으로 스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할 수 있다.
필터는 인터셉터보다 앞단에서 동작하기 때문에, 보안 검사 (XSS 방어)을 하여 올바른 요청이 아닌 경우 차단할 수 있다. 차단을 제대로 할 경우, 스프링 컨테이너에 요청이 전달되지 않고 차단되므로 안전성을 더욱 높일 수 있다.
필터는 Client의 Request 와 Response를 조작할 수 있다. 필터는 그에 비해, Request ,Resposne 내용만 조작이 가능하다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
init() : 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드이다. 웹 컨테이너가 init()메소드를 호출하여 필터 객체를 초기화 하면, 이후의 요청들은 doFilter를 통해 처리된다.
doFilter() : url-pattern에 맞는 모든 HTTP 요청이 디스패처 서블릿으로 전달되기 전에 웹 컨테이너에 의해 실행되는 메소드이다. chain.doFilter() 전/후에 우리가 필요한 처리 과정을 넣어줌으로써 원하는 처리를 진행할 수 있다.
destory(): destro 메소드는 필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위한 메소드이다. 이는 웹 컨테이너에 의해 1번 호출되며, 이후에는 doFitler에 의해 처리되지 않는다.
Java Servlet 에서 제공되는 Filter 와 다르게 Spring이 제공하는 기술로써, Dispathecr Servlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다.
#cf) 사용자 권한에 따라 요청사항에 변화가 있을 경우 사용하기 좋다.
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
// Request, Response를 교체할 수 없고 boolean 값만 반환 가능
return true;
}
}
인터셉터 처리과정은 dispatcher Servlet이 여러 인터셉터 목록을 가지고 있고 순차적으로 실행시키게 되고, true를 반환할 경우, 다음 인터셉터가 실행되거나 컨트롤러로 요청이 전달되며, false가 반환되면 요청이 중단한다.
필터와 인터셉터 모두 비지니스 로직과 분리되어 특정 요구사항등을 만족시켜야 할 때 적용한다.
필터는 특정 요총과 컨트롤러에 관계없이 전역적으로 처리해야 하는 작업이나, 웹어플리케이션 전반적으로 사용되는 기능을 구현할 때 적용하고, 인터셉터는 클라이언트의 요청과 관련된 작업에 대해 추가적인 요구사항을 만족해야할 때 적용한다.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#filters
https://dev-coco.tistory.com/173?category=1009530
https://mangkyu.tistory.com/173