인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

최지호님의 프로필 이미지

작성한 질문수

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

익명 인증 사용자 – anonymous()

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

작성

·

213

0

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

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

답변 2

0

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

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

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

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

0

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

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

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

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

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

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