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

최지호님의 프로필 이미지

작성한 질문수

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

익명 인증 사용자 – anonymous()

컨트롤러에서 그냥 Authentication을 파라미터로 받아요면 null인 이유

24.07.27 17:58 작성

·

113

0

컨트롤러가 실행되는 시점이면 이미 모든 Filter를 거쳤으니 AnonymousAuthenticationFilter도 거쳤을거라 생각하고, SecurityContext에도 AnonymousAthenticationToken이 있으니,
Authentication에 AnonymousAthenticationToken이 있을거라 생각했는데, 왜 null이 있는건가요??

그리고 왜 @CurrentSecurityContext로 찾을때만 AnonymousAthenticationToken를 받을수 있는건가요??

답변 2

0

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

2024. 08. 04. 19:33

네 강의에서 설명하는 내용 그대로입니다.

그 이유는 익명 사용자인 경우 스프링 MVC 에서 굳이 객체를 참조해 줄 필요가 없다고 판단한 것 같습니다.

대신 SecurityContext 객체는 유효하므로 객체로 참조할 수 있고 그렇게 되면 SecurityContext 안에는 익명사용자 객체가 존재할 것이므로 그렇게 접근하라고 하는 것 같습니다.

0

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

2024. 07. 29. 18:01

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

님의 질문은 스프링 시큐리티의 작동 방식과 관련된 것으로 보입니다. 스프링 시큐리티는 요청이 처리되는 동안 다양한 필터를 통해 인증 정보를 SecurityContext에 저장합니다. 컨트롤러에서 Authentication 객체를 파라미터로 직접 받으려고 할 때 null이 발생하는 이유는 스프링이 자동으로 해당 객체를 메소드 파라미터로 주입해주는 기능이 기본적으로 활성화되어 있지 않기 때문일 수 있습니다.

스프링 시큐리티에서는 @AuthenticationPrincipal이나 @CurrentSecurityContext 어노테이션을 사용하여 현재 인증된 사용자의 상세 정보나 SecurityContext를 메소드 파라미터로 받을 수 있도록 지원합니다. 특히, @CurrentSecurityContext를 사용하면 SecurityContext에서 직접 Authentication 객체를 추출할 수 있으며, 이 경우에는 해당 컨텍스트에 저장된 AnonymousAuthenticationToken을 포함하여 현재 인증 정보를 가져올 수 있습니다.

이 정보만으로는 구체적인 코드 상황과 스프링 시큐리티의 설정을 모두 파악하기는 어렵습니다만, 일반적으로 컨트롤러에서 Authentication 객체를 직접 받으려 할 때 null이 반환되는 문제는 스프링 시큐리티의 인증 프로세스와 스프링의 파라미터 주입 방식 사이의 연동에 주의를 기울여야 해결할 수 있습니다. @CurrentSecurityContext를 통해 Authentication 객체를 받을 때 정상적으로 작동하는 것은 이 어노테이션이 SecurityContext로부터 직접 정보를 가져오도록 구성되어 있기 때문입니다.

더 자세한 내용은 스프링 시큐리티 공식 문서 or 관련 참고 자료를 확인하시는 것을 추천드립니다.