해결된 질문
작성
·
1K
5
인증에서 user 객체가 없으면 null로 반환하면 체크가 될텐데 굳이 익명사용자 인증 처리 필터를 이용해서 익명 사용자와 인증 사용자를 구분하는 이유가 뭔가요?
null로 비교 시 위험해서 그런건가요?
답변 1
15
네
스프링 시큐리티는 익명 사용자 즉 로그인을 하지 않은 상태의 사용자도 별도의 역할 즉 인증정보, 권한정보를 가지도록 설계되었습니다.
물론 인증정보와 권한정보 자체가 정식 인증을 받은 상태가 아닌 익명 사용자용 인증, 권한 정보라고 볼 수 있습니다.
그리고 스프링 시큐리티에서 인증받지 않은 상태를 판별하는 기준은 user 객체의 존재 여부가 아닙니다.
즉 user 가 null 이라 할지라도 Authentication 이 null 이 아니면 인증 받은 것으로 간주하기도 합니다.
if(SecurityContextHolder.getContext().getAuthentication() == null){
....
}
과 같은 구문이 스프링 시큐리티 전반에 걸쳐 여러 군데에서 나오고 있습니다.
즉 세션이 만료되거나 무효화 되어서 SecurityContext 안에 Authentication 객체가 존재하지 않을 경우 어떠한 처리를 하라는 의미입니다.
위의 구문은 세션이 무효화 되어서 인증이 필요한 상태는 맞지만 익명사용자 즉 "anonymousUser" 는 아닙니다.
익명사용자는 Authentication 이 null 이 아니고 문자열의 "anonymousUser" 이 저장되어 있는 principal 과 ROLE_ANONYMOUS 권한 정보를 가지고 있는 객체입니다.
그렇기 때문에 스프링 시큐리티에서는 익명사용자라 할지라도 Authentication 객체를 별도로 할당함으로써 인증사용자와 익명사용자를 구분해서 적절한 분기를 타고 있습니다.
어떻게 보면 익명사용자 즉 로그인을 하지 않은 사용자는 궁극적으로 user 가 null 인 상태라 가정하고 코드를 작성하는게 당연할 수있습니다.
다만 스프링 시큐리티는 익명사용자가 인증을 받은 것은 아니지만 단순히 null 체크 기능을 넘어서 인증 및 인가 영역 전반에 걸쳐 특정한 목적과 사용을 위해서 고안한 설계물이며 AnonymousAuthenticationFilter 가 중심이 되어서 익명사용자용 인증객체와 권한 정보등을 생성하는 처리를 하고 있다고 보시면 되겠습니다.
익명사용자 필터 강의에서도 설명하고 있으니 참고해 주시면 감사하겠습니다.