ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 필터와 인터셉터의 차이점
    Spring Framework 2022. 5. 22. 02:49

    필터란?

    필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공합니다.

     

    https://mangkyu.tistory.com/173

    인터셉터란?

    인터셉터는 J2EE 표준 스펙 기능은 아니고 Spring이 제공하는 기술로써 디스패처 서브릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공합니다.

     

    웹 컨텍스트에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작합니다.

     

    실제로 Interceptor가 Controller로 요청을 하진 않지만 대략적으로 다음과 같은 처리 순서로 도식화만 했습니다.

    https://mangkyu.tistory.com/173

     

    필터와 인터셉터의 차이점 및 용도

    https://mangkyu.tistory.com/173

    • 관리되는 컨테이너가 다르다.
    • 필터는 Dispatcher Servlet 호출 전, 인터셉터는 Dispatcher Servlet 호출 후에 사용된다.
    • Request/Response의 조작여부(아래에서 조금 더 자세히 설명하겠습니다)
    • 용도에 대해서도 아래에서 자세히 설명하겠습니다.

    Request/Response 객체 조작 가능 여부

    필터는 Request와 Response를 조작할 수 있지만 인터셉터는 조작할 수 없다.

    이게 무슨말일까?

    조작한다는 의미는 내부 상태를 변경한다는 것이 아니라 다른 객체로 바꿔 친다는 의미입니다.

    필터가 다음 필터를 호출할 때 Request/Response 객체를 넘겨주므로 우리가 원하는 Request/Response 객체를 넣어 줄 수 있습니다.

     

    필터의 호출 예시는 다음과 같습니다.

    public MyFilter implements Filter { 
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    		// 개발자가 다른 request와 response를 넣어줄 수 있음
    		// 즉 request와 response를 조작 가능
    		chain.doFilter(request, response); 
    	}
    }

     

    하지만 인터셉터는 디스패처 서블릿이 여러 인터셉터 목록을 가지고 있고 for문으로 순차적으로 실행시킵니다.

    그리고 true를 반환하면 다음 인터셉터가 실행되거나 컨트롤러로 요청이 전달되며 false가 반환되면 요청이 중단됩니다.

    즉, 우리가 다른 Request/Response 객체를 넘겨줄 수 없습니다.

     

    인터셉터의 호출 예시는 다음과 같습니다.

    public class MyInterceptor implements HandlerInterceptor{
    	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
        	//Request/Response를 조작할 수 없고 boolean 값만 반환
            return true;
        }
    }

     

     

    필터와 인터셉터의 용도 및 예시

    필터의 용도 및 예시

    • 공통된 보안 및 인증/인가 관련 작업
    • 모든 요청에 대한 로깅
    • 이미지/데이터 압축 및 문자열 인코딩
    • Spring과 분리되어야 하는 기능

    필터는 인터셉터보다 앞단에서 동작하기 때문에 전역적으로 해야 하는 보안 검사 등을 하여 올바른 요청이 아닐 경우 차단을 할 수 있습니다. (스프링 컨테이너까지 요청이 전달되지 않기 때문에 안정성 증가)

     

    필터는 이미지나 데이터의 압축이나 문자열 인코딩과 같이 웹 애플리케이션에 전반적으로 사용되는 기능을 구현하기 좋습니다.

     

    인터셉터의 용도 및 예시

     

    • 세부적인 보안 및 인증/인가 공통 작업
    • API 호출에 대한 로깅 또는 감사
    • Controller로 넘겨주는 정보(데이터)의 가공

    인터셉터에서는 클라이언트 요청과 관련되어 전역적으로 처리해야 하는 작업들을 처리할 수 있습니다.
    대표적으로 세부적으로 적용해야 하는 인증/인가와 같이 클라이언트 요청과 관련된 작업 등이 있습니다.

    예를 들어 특정 그룹의 사용자는 어떤 기능을 사용하지 못하는 경우가 있는데, 이러한 작업들은 컨트롤러로 넘어가기 전에 검사해야 하므로 인터셉터가 처리하기 적합합니다.

     

    해당 객체가 내부적으로 갖는 값은 조작할 수 있기 때문에 컨트롤러로 넘겨주기 위한 정보를 가공하기에 용이합니다.

    예를 들어 JWT 토큰 정보를 파싱 해서 컨트롤러에게 사용자의 정보를 제공하도록 가공할 수 있습니다.

     

     

     

    AOP VS 인터셉터 VS 필터

    모두 공통적인 로직을 처리해주는 기능들입니다.

     

    인터셉터와 필터는 Servlet 단위에서 실행되는 반면에 AOP는 메서드 앞에 Proxy 패턴의 형태로 실행됩니다.

    AOP의 경우에는 url을 기준으로 범위를 설정하는 Interceptor와 Filter와 달리 메서드 전 후의 지점을 자유롭게 설정이 가능하며 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있습니다.

     

     

     

     

    출처

    https://mangkyu.tistory.com/173

     

    [Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)

    Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자

    mangkyu.tistory.com

     

    댓글

Designed by Tistory.