Filter/Interceptor 의 개념와 차이

Minky·2021년 10월 4일
0

Filter, Interceptor, AOP의 흐름


Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.

  1. 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다.
  2. 컨트롤러에 들어가기 전 preHandler가 실행된다
  3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
  4. 서블릿 종료 시 destroy가 실행된다.

왜 사용하나?

인증/인가를 받아야 사용할 수 있는 웹사이트가 있다고 가정하자.
로그인(인증) 하고 어떠한 기능을 사용하고자 할때(권한) 컨트롤러를(api) 통해 기능을 요청할것이다.
이때마다 서버에서는 (1)올바른 사용자가 맞는지, 맞다면 그 (2)기능을 사용 할 수있는 권한이 있는지 체크할것이다.

그럼, 1000개의 기능이 있다면 위와 같은 체크를 1000번 해야할까?
이럴때 filter, interceptor로 사용자의 요청을 가로채 특정 기능을 수행 할 수있도록 제어 할 수있다.

이렇게만 봤을때, 둘이 같은거 아닌가? 생각 할 수도 있다. (내가..)

결론적으로, 두 개 모두 '요청' 과 '응답' 전후에 작업을 처리하는 용도로 사용되지만, 호출 시점이 다르다.

Filter

public interface Filter { 
	public void init(FilterConfig filterConfig) throws ServletException; 
    	public void doFilter(ServletRequest request, 
    	ServletResponse response, FilterChain chain) throws IOException, ServletException; 
    	public void destroy(); 
 }

J2EE 표준. spring framework에서 지원하고 있지만 spring framework만의 기능은 아니다.
servlet container에 의해 동작이 제어되는것으로, DispatcherServlet 이전에 실행된다.

보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다. 대표적인 예로는 Spring Security, CORS Filter등이 있다.

  • init() - 필터 인스턴스 초기화
  • doFilter() - 전/후 처리
  • destroy() - 필터 인스턴스 종료

Interceptor

public interface HandlerInterceptor { 
	boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; 
    	void postHandle( HttpServletRequest request, response, Object handler, ModelAndView modelAndView) throws Exception; 
        void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }

Spring Framework에서 자체적으로 제공하는 기능.
스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전,후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
Spring context내에서 HTTPRequest 와 HTTPResponse 처리에 대해 강력한 기능을 제공한다.

보통 클라이언트를 통해 들어오는 디테일한 처리(세션체크,인증,권한)에 대해서는 이곳에서 처리한다.

  • preHandler() - 컨트롤러 메서드가 실행되기 전
  • postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
  • afterCompletion() - view페이지가 렌더링 되고 난 후

참고

https://goddaehee.tistory.com/154
https://junghyungil.tistory.com/123
https://jaehun2841.github.io/2018/08/25/2018-08-18-spring-filter-interceptor/#filter
https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter

profile
소통하는 Web Developer가 되고 싶습니다 :)

0개의 댓글