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
는 그 이름에서도 알 수 있듯이 모든 서블릿에 일관된 요청을 처리하기 위해 만들어진 필터이다.사용자의 한번에 요청 당 딱 한번만
실행되는 필터를 만들 수 있다.매 서블릿 마다 필터가 호출되는데 이 서블릿은 다른 서블릿으로 dispatch 되는 경우가 있어 필터가 두 번 이상 실행되는 현상이 발생할 수 있는데 이를 방지하기 위해 OncePerRequestFilter를 사용