[Spring] OncePerRequestFilter란?

이멀젼씨

·

2021. 5. 10. 21:54

목적

OncePerRequestFilter를 이해하고 목적에 맞게 사용하기 위함

목차

  1. 학습 이유
  2. OncePerRequestFilter

1. 학습이유

얼마전 Spring Security를 공부하면서 JWT필터를 구현했었다.


나는 GenericFilterBean을 상속받은 AbstractAuthenticationProcessingFilter을 상속받아 코드를 작성했지만


다른 사람들은 대부분 OncePerRequestFilter를 상속받아 구현하였다.


무슨 차이일까 궁금했다.

2. OncePerRequestFilter

우선 문서상에는 이렇게 쓰여있다.


Filter base class that aims to guarantee a single execution per request dispatch, on any servlet container. It provides a doFilterInternal method with HttpServletRequest and HttpServletResponse arguments.


어느 서블릿 컨테이너에서나 요청 당 한 번의 실행을 보장하는 것을 목표로 한다.
doFilterInternal메소드와 HttpServletRequest와 HttpServletResponse인자를 제공한다.


중요한 점은 요청 당 한번의 실행을 보장한다는 것이다.


서블릿이 실행되는 동안 다른 서블릿에 요청이 올 수도 있다.


예를들어, 어느 필터에서 헤더를 확인 한 후 특정 url로 포워딩 시킨다고 가정하자.


이때 예외가 발생하지 않았다면, url로 포워딩 시키는 것 자체가 서블릿 실행 중 요청이 온 것이다.


OncePerRequestFilter를 사용하지 않았다면 앞서 거친 필터들을 또 한번 거칠 것이고, 쓸데없는 자원만 낭비하는 셈이다.

결국 동일한 request안에서 한번만 필터링을 할 수 있게 해주는 것이 OncePerRequestFilter의 역할이고 보통 인증 또는 인가와 같이 한번만 거쳐도 되는 로직에서 사용한다.


인증 또는 인가를 거치고나서 특정 url로 포워딩하면, 요청이 들어왔으니 인증 및 인가필터를 다시 실행시켜야 하지만, OncePerRequestFilter를 사용함으로써 인증이나 인가를 한번만 거치고 다음 로직을 진행할 수 있도록 한다.