작성
·
148
0
컨트롤러가 실행되는 시점이면 이미 모든 Filter를 거쳤으니 AnonymousAuthenticationFilter도 거쳤을거라 생각하고, SecurityContext에도 AnonymousAthenticationToken이 있으니,
Authentication에 AnonymousAthenticationToken이 있을거라 생각했는데, 왜 null이 있는건가요??
그리고 왜 @CurrentSecurityContext로 찾을때만 AnonymousAthenticationToken를 받을수 있는건가요??
답변 2
0
네 강의에서 설명하는 내용 그대로입니다.
그 이유는 익명 사용자인 경우 스프링 MVC 에서 굳이 객체를 참조해 줄 필요가 없다고 판단한 것 같습니다.
대신 SecurityContext 객체는 유효하므로 객체로 참조할 수 있고 그렇게 되면 SecurityContext 안에는 익명사용자 객체가 존재할 것이므로 그렇게 접근하라고 하는 것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다.
님의 질문은 스프링 시큐리티의 작동 방식과 관련된 것으로 보입니다. 스프링 시큐리티는 요청이 처리되는 동안 다양한 필터를 통해 인증 정보를 SecurityContext
에 저장합니다. 컨트롤러에서 Authentication
객체를 파라미터로 직접 받으려고 할 때 null
이 발생하는 이유는 스프링이 자동으로 해당 객체를 메소드 파라미터로 주입해주는 기능이 기본적으로 활성화되어 있지 않기 때문일 수 있습니다.
스프링 시큐리티에서는 @AuthenticationPrincipal
이나 @CurrentSecurityContext
어노테이션을 사용하여 현재 인증된 사용자의 상세 정보나 SecurityContext
를 메소드 파라미터로 받을 수 있도록 지원합니다. 특히, @CurrentSecurityContext
를 사용하면 SecurityContext
에서 직접 Authentication
객체를 추출할 수 있으며, 이 경우에는 해당 컨텍스트에 저장된 AnonymousAuthenticationToken
을 포함하여 현재 인증 정보를 가져올 수 있습니다.
이 정보만으로는 구체적인 코드 상황과 스프링 시큐리티의 설정을 모두 파악하기는 어렵습니다만, 일반적으로 컨트롤러에서 Authentication
객체를 직접 받으려 할 때 null
이 반환되는 문제는 스프링 시큐리티의 인증 프로세스와 스프링의 파라미터 주입 방식 사이의 연동에 주의를 기울여야 해결할 수 있습니다. @CurrentSecurityContext
를 통해 Authentication
객체를 받을 때 정상적으로 작동하는 것은 이 어노테이션이 SecurityContext
로부터 직접 정보를 가져오도록 구성되어 있기 때문입니다.
더 자세한 내용은 스프링 시큐리티 공식 문서 or 관련 참고 자료를 확인하시는 것을 추천드립니다.