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

bae jewoo님의 프로필 이미지

작성한 질문수

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

SecurityContextRepository / SecurityContextHolderFilter - 1

SecurityContextPersistenceFilter & UsernamePasswordAuthenticationFilter

작성

·

45

0

SecurityContextPersistenceFilter를 사용하고

폼 로그인 처리 방식을 사용한다고 하면

UsernamePasswordAuthenticationFilter를 사용할텐데

해당 필터는 스프링 시큐리티가 인증에 성공시 자동으로

세션에 시큐리티 컨텍스트를 저장한다고 했는데

SecurityContextPersistenceFilter 또한 finally에서 세션에 또 저장을 하니까 2번 저장하게 될까요?

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

저도 확인을 해봐야 하지만 이미 세션에 저장했다면 다시 저장하지 않도록 코드가 구현되어 있을거라 보는데 확실치는 않습니다.

그리고 2번 저장하더라도 키가 동일하면 덮어쓰기 때문에 문제가 되지는 않을것 같습니다.

0

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

질문하신 “SecurityContextPersistenceFilter와 UsernamePasswordAuthenticationFilter가 세션에 SecurityContext를 두 번 저장하게 되는지”에 대한 답변을 드리겠습니다.

SecurityContextPersistenceFilter는 클라이언트의 요청마다 SecurityContext를 관리하는 매우 중요한 필터입니다. 이 필터는 요청이 시작될 때 HttpSession에서 SecurityContext를 가져오고, 응답이 완료될 때 다시 HttpSession에 저장합니다. UsernamePasswordAuthenticationFilter는 폼 로그인을 처리하고, 인증이 성공할 때 SecurityContext에 Authentication 객체를 저장하는 필터입니다.

이 두 필터의 역할을 이해하기 위해 아래 URL들을 참고하세요:

  1. SecurityContextPersistenceFilter의 finally구문
  2. SecurityContextPersistenceFilter 로 remove 하는 데 어떻게 컨트롤러에서 조회가 가능한가요?
  3. Session관리는 어디서 지정해야할지

간단히 요약하자면:
- UsernamePasswordAuthenticationFilter는 단순히 Authentication 객체를 SecurityContext에 저장합니다. 이 과정 중에는 HttpSession에 대한 변경 사항이 일어나지 않습니다.
- SecurityContextPersistenceFilter는 요청의 끝 부분에서 SecurityContext를 HttpSession에 저장하는 작업을 합니다. 즉, 이 필터는 SecurityContext를 저장하는 책임을 가지고 있기 때문에 두 번 저장되는 일은 발생하지 않습니다.

이러한 동작 방식 때문에 SecurityContextPersistenceFilter가 최종적으로 SecurityContext를 HttpSession에 한 번만 저장합니다. 따라서 두 번 저장되는 문제가 발생하지 않습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.