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

공룡님의 프로필 이미지
공룡

작성한 질문수

스프링 시큐리티

8) 익명사용자 인증 필터 : AnonymousAuthenticationFilter

익명사용자를 왜 사용하는지 모르겠습니다.

해결된 질문

작성

·

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 가 중심이 되어서 익명사용자용 인증객체와 권한 정보등을 생성하는 처리를 하고 있다고 보시면 되겠습니다.

익명사용자 필터 강의에서도 설명하고 있으니 참고해 주시면 감사하겠습니다.

공룡님의 프로필 이미지
공룡

작성한 질문수

질문하기