- 개인 공부 목적으로 작성한 글입니다.
- 아래 출처를 참고하여 작성하였습니다.
1. 필터란?
- 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 URL 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공합니다.
- 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹컨테이너에 의해 관리되므로 디스패처 서블릿으로 가기 전에 요청을 처리하는 것입니다.
2. 필터의 메소드
- 필터를 추가하기 위해서는 javax.servlet의 Filter 인터페이스를 구현해야하며 이는 다음의 3가지 메소드를 가지고 있습니다.
- init
- doFilter
- destroy
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() {}
}
2-1. init 메소드
- init 메소드는 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드입니다.
- 웹 컨테이너가 1회 init 메소드를 호출하여 필터 객체를 초기화화면 이후의 요청들은 doFilter를 통해 전/후에 처리됩니다.
2-2. doFilter 메소드
- doFilter 메소드는 url-pattern에 맞는 모든 HTTP 요청이 디스패처 서블릿으로 전달되기 전/후에 웹 컨테이너에 의해 실행되는 메소드입니다.
- doFilter 메소드의 파라미터로는 FilterChain이 있는데, FilterChain의 doFilter를 통해 다음 대상으로 요청을 전달하게 됩니다.
2-3. destroy 메소드
- destroy 메소드는 필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위한 메소드입니다.
- 이는 웹 컨테이너에 의해 1번 호출되며 이후에는 이제 doFilter에 의해 처리되지 않습니다.
3. 필터 vs 인터셉터
3-1. 필터와 인터셉터의 차이
- 필터와 인터셉터는 각각이 관리되는 컨테이너와 Request/Response의 조작가능 여부가 다릅니다.
- 그에 따라 용도도 달라지게 됩니다.
3-2. 필터의 사용 예시
- 보안 관련 공통 작업
- 모든 요청에 대한 로깅 또는 감사
- 이미지/데이터 압축 및 문자열 인코딩
- 필터에서는 스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할 수 있습니다.
- 대표적인 예시로 보안과 관련된 공통 작업이 있습니다. 필터는 인터셉터보다 앞단에서 동작하기 때문에 전역적으로 해야하는 보안검사(XSS 방어 등)를 하여 올바른 요청이 아닐 경우 차단을 할 수 있습니다. 그러면 스프링 컨테이너까지 요청이 전달되지 못하고 차단되므로 안전성을 높일 수 있습니다.
- 또한 필터는 이미지나 데이터의 압축이나 문자열 인코딩과 같이 웹 애플리케이션에 전반적으로 사용되는 기능을 구현하기에 적합합니다. Filter는 다음 체인으로 넘기는 ServletRequest/ServletResponse 객체를 조작할 수 있다는 점에서 Interceptor보다 강력한 기술입니다.
3-3. 인터셉터의 사용 예시
- 인증/인가 등의 공통 작업
- API 호출에 대한 로깅 또는 감사
- Controller로 넘겨주는 정보(데이터)의 가공
- 인터셉터에서는 클라이언트의 요청과 관련되어 전역적으로 처리해야 하는 작업들을 처리할 수 있습니다. 대표적으로 인증이나 인가와 같이 클라이언트 요청과 관련된 작업 등이 있습니다. 이러한 작업들은 컨트롤러로 넘어가기 전에 검사해야 하므로 인터셉터가 처리하기에 적합합니다.
- 또한 인터셉터는 필터와 다르게 HttpServletRequest나 HttpServletResponse 등과 같은 객체를 제공받으므로 객체 자체를 조작할 수는 없습니다. 대신 해당 객체가 내부적으로 갖는 값은 조작할 수 있으므로 컨트롤러로 넘겨주기 위한 정보를 가공하기에 용이합니다. 예를 들어 JWT 토큰 정보를 파싱해서 컨트롤러에게 사용자의 정보를 제공하도록 가공할 수 있는 것입니다.
- 그 외에도 다양한 목적으로 API 호출에 대한 정보들을 기록해야하는 경우도 있습니다. 이러한 경우에 HttpServletRequest나 HttpServletResponse를 제공해주는 인터셉터는 클라이언트의 IP나 요청 정보들을 포함해 기록하기에 용이합니다.
출처
'SpringBoot > Common' 카테고리의 다른 글
Spring Multi profile 설정(YML) (0) | 2021.09.26 |
---|---|
인터셉터(Interceptor) (0) | 2021.09.22 |
Spring Profiles 설정 방법 (0) | 2021.09.13 |