인프런 커뮤니티 질문&답변

정민교님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

기본 인증 필터 - BasicAuthenticationFilter

OncePerRequestFilter 질문

24.08.13 08:23 작성

·

51

0

OncePerRequestFilter는 요청당 한 번만 필터가 동작하도록 보장된? 필터라고 말씀해주셨는게

 

하나의 요청에 하나의 필터가 여러 번 동작하는 경우도 있나요..?

답변 2

0

bae jewoo님의 프로필 이미지

2024. 09. 06. 23:40

OncePerRequest가 아닌 일반 필터가 아닌 상황

request -> was -> 필터 -> 디스패처 서블릿 -> 컨트롤러 -> 서비스 에러 발생 throw Exception -> 이때 was는 error를 확인하고 error 페이지를 랜더링(forward)하기 위해서 다시 서블릿까지 보냄

결론 필터 2번 거침

was 까지 응답이 갔다가 다시 (일반)필터를 거치는 case 2가지
response.sendError / Uncaught Exception

--------------------------------------------------
강사님한테 질문 !!
oncePerRequest가 한번만 필터링 되었는지 식별하는
로직이 복잡한듯한데
이렇게 복잡한 이유는 제가 설명한 에러 상황 이외에도
다른 케이스가 있을 거라고 추측을 합니다
에러 상황이라고 하면 was는 attribute에 error를 넣어주니 간단하게 attribute를 확인해서 error 인지 확인하고 바로 넘기면 되니까요
다른 케이스를 하나 예시를 들어주실 수 있을까요?
아님 제가 잘못 이해한 게 있을까요



0

인프런 AI 인턴님의 프로필 이미지

2024. 08. 15. 08:26

안녕하세요, 인프런 AI 인턴입니다.

OncePerRequestFilter는 이름에서 알 수 있듯이 하나의 요청에 대해 필터가 한 번만 실행되도록 보장하는 Spring Security의 특별한 필터입니다. 일반적인 상황에서는 하나의 요청에 대해 OncePerRequestFilter는 단 한 번만 호출됩니다. 그러나 서블릿 컨테이너에 따라 요청이 여러 번 재처리될 수 있는 특수한 경우(예: 요청이 forward되는 경우)에는 OncePerRequestFilter가 여러 번 실행될 수 있습니다. 이 때문에 OncePerRequestFilter 내부에는 이미 처리한 요청을 다시 처리하지 않도록 체크하는 로직이 포함되어 있어서, 실제로 필터의 로직이 요청당 정확히 한 번씩만 실행되도록 보장합니다.

OncePerRequestFilter의 주요 목적은 모든 종류의 재처리 상황에서도 필터의 로직이 중복 실행되는 것을 방지하는 것이므로, 하나의 요청에 대해 필터가 여러 번 동작하는 상황을 제어합니다. 따라서 필터가 여러 번 실행될 수 있는 상황을 고려하여 설계되었지만, 정상적인 사용 시에는 요청당 한 번만 필터가 실행되도록 보장합니다.