본문 바로가기

spring security

익명 인증 사용자 - anonymous()

정수원님의 **스프링 시큐리티 완전 정복** 강의 내용 기록입니다 !!

 

 

 

익명 사용자
  • 스프링 시큐리티에서 "익명으로 인증된" 사용자는 "인증되지 않은" 사용자와 동일
  • 액세스 제어 속성을 더 편리하게 구성하기 위해 인증되지 않은 사용자도 하나의 객체로 만듦
  • 인증되지 않은 사용자도 하나의 Authentication 객체가 되어 SecurityContextHolder는 항상 Authentication 객체를 포함하고 null을 포함하지 않는다 !
  • 인증 사용자와 익명 인증 사용자를 구분하여 어떤 기능을 수행하고자 할 때 유용
  • 익명 인증 사용자의 권한을 별도로 운용할 수 있음 ≫ 인증된 사용자가 접근할 수 없도록 구성이 가능함

  • 인증 사용자) Authentication을 SecurityContext에 저장 → SecurityContext를 세션에 저장
  • 익명 인증 사용자) Authentication을 SecurityContext에 저장 → 세션에는 저장하지 않음

 

익명 사용자 API

  • principal : 익명 인증 사용자의 이름 지정
    • 기본값은 'anonymousUser'
  • authorities : 익명 인증 사용자의 권한 설정
    • 기본값은 'ROLE_ANONYMOUS'
  • 따로 지정하지 않고 기본값으로 사용해도 무방

 

익명 사용자 구조

 

AnonymousAuthenticationFilter

↓   생성

AnonymousAuthenticationToken

- anonymousUser : 익명 사용자 이름 (String)

- ROLE_ANONYMOUS : 익명 사용자 권한 (String)

→ 이 값들을 API를 통해 변경 가능

 

  • 인증받지 못한 상태라면 AnonymousAuthenticationFilter에서 익명 사용자의 인증 객체를 생성하고 SecurityContext에 저장
  • 익명 사용자의 인증 객체 : 익명 인증 사용자의 이름과 권한을 포함하는 AnonymousAuthenticationToken

 

스프링 MVC에서 익명 인증 사용하기
  • 익명 사용자에 대해 인증 객체를 얻으려는 경우 (인증된 사용자가 아닌 경우 처리 등)

1.

  • 스프링 MVC가 HTTPServletRequest#getPrincipal을 사용하여 Authentication 파라미터를 넘겨줌
  • 하지만 요청이 익명 사용자라면 익명사용자의 인증 객체가 아닌 null이 전달됨

2.

  • 익명 요청에서 Authentication(인증 객체)를 얻고 싶다면 @CurrentSecurityContext를 사용
  • SecurityContext를 받아와 SecurityContext에서 직접 getAuthentication() 하여 사용

 

AnonymousAuthenticationFilter
  • SecurityContextHolder에 Authentication 객체가 없을 경우(인증받지 못한 상태인 경우) 감지하고 새로운 Authentication 객체로 저장
  • 이미 인증이 된 경우에는 이 필터를 그냥 지나침

 

흐름도

 

client

↓  Get  /index

AnonymousAuthenticationFilter

Authentication != null : 인증된 Authentcation이 존재하는지

Yes

chain.doFilter

이미 인증된 상태이므로 익명 인증 사용자 생성이 필요 없음

 

No

AnonymousAuthenticationToken 생성 : (anonymousUser + ROLE_ANONYMOUS)

SecurityContextHolder : Authentication을 SecurityContext에 설정
- 익명 인증 객체를 SecurityContext에 저장
- SecurityContext를 세션에 저장하는 작업은 하지 않음

결과적으로

AnonymousAuthenticationToken (anonymousUser + ROLE_ANONYMOUS)

SecurityContext

SecurityContextHolder