filter관련 사용방법이 달랐는데 차이가 무었인지?(Filter, OncePerRequestFilter)

Better late than never·2022년 9월 2일
0

?

Spring Security 사용 중 security에서 어떻게 동작하는 지 궁금해져서 filter에 대한 내용을 찾아봤는데 사용 방법이 각 사용자 마다 조금씩 달라서 확인해봤더니 filter, OncePerRequestFilter를 사용하는 두 사용자가 존재하였다.

Filter와 OncePerRequestFilter의 차이점 기입

  • Filter는 javax.servlet-api나 tomcat-embed-core를 사용하면 제공되는 Servlet Filter Interface이다.
  • Filter를 조금 더 확장하여 스프링에서 제공하는 필터가 있는데 그것이 바로 GenericFilterBean이다.
  • GenericFilterBean은 기존 Filter에서 얻어올 수 없는 정보였던 Spring의 설정 정보를 가져올 수 있게 확장된 추상 클래스이다.

이 두 필터는 한 가지 공통점이 있는데 매 서블릿 마다 호출이 된다는 것이다.

  • 서블릿은 사용자의 요청을 받으면 서블릿을 생성해 메모리에 저장해두고, 같은 클라이언트의 요청을 받으면 생성해둔 서블릿 객체를 재활용하여 요청을 처리한다.

문제는 이 서블릿이 다른 서블릿으로 dispatch되는 경우가 있을 수 있다.

  • 가장 대표적으로 Spring Security에서 인증과 접근 제어 기능이 Filter로 구현되어진다.
  • 이러한 인증과 접근 제어는 RequestDispatcher 클래스에 의해 다른 서블릿으로 dispatch되게 되는데, 이 때 이동할 서블릿에 도착하기 전에 다시 한번 filter chain을 거치게 된다.
  • 바로 이 때 또 다른 서블릿이 우리가 정의해둔 필터가 Filter나 GenericFilterBean로 구현된 filter를 또 타면서 필터가 두 번 실행되는 현상이 발생할 수 있다.

이런 문제를 해결하기 위해 등장한 것이 바로 이번 글의 주인공인 OncePerRequestFilter이다.

  • OncePerRequestFilter는 그 이름에서도 알 수 있듯이 모든 서블릿에 일관된 요청을 처리하기 위해 만들어진 필터이다.
  • 이 추상 클래스를 구현한 필터는 사용자의 한번에 요청 당 딱 한번만 실행되는 필터를 만들 수 있다.

0개의 댓글