작성
·
45
0
해당 강의를 학습하던 도중 indexController 의 다음 메서드가 어떻게 익명사용자인것을 알아채고 해당 토큰을 남기는 걸까 의문점이 생겨 질문을 남깁니다.
@GetMapping("/anonymousContext") public String anonymousContext(@CurrentSecurityContext SecurityContext context) { return context.getAuthentication().getName(); }
해당의문을 해결하기 위해 localhost:8080/anonymousContext 가 호출될 때 서버는 어떤 과정을 거칠까 생각해보고 다음과 같은 결론을 냈습니다.
1. localhost:8080/anonymousContext 가 호출될 때, Authentication 이 null 값인 것을 확인한다
2. AnonymousAuthenticationToken을 생성하여 SecurityContextHolder에 저장한다.
3. Jsession이 없는 것을 확인하고 AnonymousAuthenticationToken이 저장된 SecurityContext를 파라미터로 넘긴다.
4. 해당 포큰이 getName() 값이 출력된다.
이러한 과정을 거칠거라 생각한 이유는 로그인 상태에서 localhost:8080/anonymousContext 를 호출하게 될 때, "user"라는 값이 출력되는 것을 확인했고 두 같은 요청값에 유일한 차이는 쿠키에 Jsession의 유무였기 때문입니다.
SecurityContext가 anonymous 를 판단하는 기준이 제가 생각한 것과 같을까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 노동준님, 질문해주셔서 감사합니다.
스프링 시큐리티에서 SecurityContext
가 익명 사용자로 판단하는 과정은 크게 두 가지 상태에 따라 이루어집니다: 인증된 사용자 상태와 인증되지 않은 익명 사용자 상태입니다. 귀하가 기술하신 내용은 스프링 시큐리티의 익명 사용자 처리 과정과 매우 잘 부합합니다.
스프링 시큐리티는 요청을 받을 때 다음과 같은 과정을 거칩니다:
SecurityContext의 초기화: 모든 요청에 대해 SecurityContextPersistenceFilter
가 실행되며, 여기서 SecurityContext
를 초기화합니다. 보통 이 과정에서 HTTP 세션이나 다른 저장소로부터 SecurityContext
를 복원합니다.
인증 객체 확인: SecurityContext
에 인증 객체(Authentication)가 존재하는지를 확인합니다. 인증 객체가 존재하지 않으면, 기본적으로는 인증되지 않은 상태로 간주됩니다.
익명 사용자 처리: 인증 객체가 없다면, AnonymousAuthenticationFilter
가 실행되어 AnonymousAuthenticationToken
을 생성합니다. 이 함수는 내부적으로 익명 사용자의 요청을 처리하며, 보안을 최소화된 상태로 유지합니다.
SecurityContext에 저장: 생성된 AnonymousAuthenticationToken
은 SecurityContextHolder
에 저장되어 앞으로의 필터 및 요청 처리 과정에서 참조됩니다.
HTTP 세션 확인: JSESSIONID 쿠키는 특정 세션에서 사용자의 상태를 추적하지만, 익명 사용자는 새로운 세션을 시작하기 전에는 보통 세션 ID가 없습니다.
로그인된 경우에는 세션에 사용자의 SecurityContext
가 저장되어 있으며, 이로 인해 요청 시 사용자 정보가 그대로 SecurityContext
에 포함됩니다.
노동준님이 설명하신 것처럼, 익명 사용자의 경우와 로그인된 사용자의 경우에는 SecurityContext
의 상태가 다르고, 요청 시마다 이의 차이가 나타날 수 있습니다.
관련하여 다음의 답변을 참고하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.