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

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

?

Spring Security 사용 중 security에서 어떻게 동작하는 지 궁금해져서 구조에 대해서 찾아보다가 filter에 대해서 검색하다가 종류에 따라서 사용 방법이 조금씩 달라서 filter에 대해서 기입

Filter는 Srping MVC 생명주기에서 제일 처음과 끝에 위치하여 시작과 끝을 책임진다. Filter의 동작 방식을 간단히 보고 OncePerRequestFilter이 왜 필요한지 알아보자

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

  • GenericFilterBean : 기존 Filter에서 얻어올 수 없는 정보였던 Spring의 설정 정보를 가져올 수 있게 확장된 추상 클래스이다

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

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

예를 들어 가장 대표적으로 Spring Security에서 인증과 접근 제어 기능이 Filter로 구현되어진다. 이러한 인증과 접근 제어는 RequestDispatcher 클래스에 의해 다른 서블릿으로 dispatch되게 되는데, 이 때 이동할 서블릿에 도착하기 전에 다시 한번 filter chain을 거치게 된다.

바로 이 때 또 다른 서블릿이 우리가 정의해둔 필터가 Filter나 GenericFilterBean로 구현된 filter를 또 타면서 필터가 두 번 실행되는 현상이 발생할 수 있다.

OncePerRequestFilter

이런 문제를 해결하기 위해 등장한 것이 OncePerRequestFilter이다.

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

결론

매 서블릿 마다 필터가 호출되는데 이 서블릿은 다른 서블릿으로 dispatch 되는 경우가 있어 필터가 두 번 이상 실행되는 현상이 발생할 수 있는데 이를 방지하기 위해 OncePerRequestFilter를 사용

0개의 댓글