Spring

[Spring Security] Filter와 Interceptor 차이 및 용도

Lea Hwang 2022. 7. 27. 15:41

공통적으로 처리할 부분

자바 웹 개발을 하다 보면 공통업무 코드가 발생합니다. 이를 매 페이지마다 작성하면 코드 중복과 리소스 낭비로 이어지므로 해당 부분은 따로 빼서 관리하는 게 좋은데요.

대표적으로 Filter, Interceptor 모두 무슨 행동을 하기 전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용됩니다.

이번 포스팅에서는 요청의 흐름에 따라 필터, 인터셉터의 개념에 대해 알아보겠습니다.

 

 

전체 흐름

출처 :  https://goddaehee.tistory.com/154

 

 

요청이 들어왔을 때 진행되는 순서는 Filter → Interceptor → AOP → Interceptor → Filter의 순으로 거치게 됩니다.

 

 

 

Filter

Filter는 J2EE표준 스펙 기능으로, Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대한 작업을 처리할 수 있는 기능을 제공합니다.

Filter는 스프링 컨테이너가 아닌 웹 컨테이너(톰캣)에 의해 관리됩니다.

  1. Web Application에 등록한다.
  2. 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.
  3. Request, Response 객체를 직접 조작할 수 있다.
  4. 인코딩 처리, 보안, 로그인과 권한 검사 등의 요청에 대한 처리

 

[ 필터의 실행 메서드 ]

  • init() - 필터 객체 초기화, 이후 요청들은 doFilter를 통해 처리된다.
  • doFilter() - 전/후 처리
    • url-pattern에 맞는 모든 HTTP 요청이 디스패처 서블릿으로 전달되기 전 웹 컨테이너에 의해 실행
  • destroy() - 필터 객체 종료

 

 

Interceptor

인터셉터는 Spring이 제공하는 기술로 Dispatcher Servlet이 컨트롤러를 호출하기 전과 후 끼어들어 스프링 컨텍스트 내부에Controller(Handler)에 관한 요청과 응답에 대해 처리합니다.

 

인터셉터는 스프링 컨테이너 내에서 동작하므로 필터를 거쳐 프런트 컨트롤러인 디스패처 서블릿이 요청을 받은 이후에 동작합니다.

  1. Spring의 Context에 등록한다.
  2. 스프링의 모든 Bean에 접근할 수 있다.
  3. Request, Response 객체를 직접 조작할 수 없다.
  4. 인터셉터 여러 개 사용할 수 있고, 로그인 체크, 권한 체크 등의 업무 처리

 

[ 인터셉터의 실행 메서드 ]

  • preHandler() - 컨트롤러 메서드가 실행되기 전에 실행
    • 전처리 작업, 요청 정보 가공
  • postHanler() - 컨트롤러 메서드 실행 직후 view페이지 렌더링 되기 전
    • 후처리 작업
  • afterCompletion() - view페이지가 렌더링 되고 난 후
    • 요청 처리 중에 사용한 리소스 반환

 

 

Filter와 Interceptor 차이

대상 필터(Filter) 인터셉터(Interceptor)
관리되는 컨테이너 웹 컨테이너 스프링 컨테이너
Request / Response
객체 조작 가능 여부
O X
용도 - 공통된 보안 및 인증/인가 관련 작업
- 모든 요청에 대한 로깅 또는 감사
- 이미지/데이터 압축 및 문자열 인코딩
- Spring과 분리되어야 하는 기능
- 세부적인 보안 및 인증/인가 공통 작업
- API호출에 대한 로깅 또는 감사
- Controller로 넘겨주는 데이터의 가공

 

[ Request / Response 객체 조작 가능 여부 ]

여기서 조작이란 내부 상태를 변경한다는 것이 아니라 객체를 넘겨줄 수 있다는 의미입니다.

 

Filter코드 中 chain.doFilter(request, response);   

public CustomFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
     
        chain.doFilter(request, response);       
    }
    
}

 

Interceptor코드의 경우 boolean값을 반환합니다.

public class CustomInterceptor implements HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // boolean 값 반환
        return true;
    }

}

 

 

[ 용도 ]

필터는 스프링과 무관하게 전역적으로 처리해야 하는 작업이나 웹 애플리케이션 전반적으로 사용되는 기능을 구현하고

인터셉터클라이언트의 요청과 관련된 전역적으로 처리해야하는 작업이나 컨트롤러로 넘겨주기 위해 데이터 가공하는 작업을 합니다. 

 

추가적으로 필터(Filter)를 인증과 인가에 사용하는 도구로는 SpringSecurity가 있습니다.

 

 

 

 

 

 

 


 

 

 

참고 :

스터디원 제리👏 감사합니다^^

https://mangkyu.tistory.com/173