정수원님의 **스프링 시큐리티 완전 정복** 강의 내용 기록입니다 !!
익명 사용자
- 스프링 시큐리티에서 "익명으로 인증된" 사용자는 "인증되지 않은" 사용자와 동일
- 액세스 제어 속성을 더 편리하게 구성하기 위해 인증되지 않은 사용자도 하나의 객체로 만듦
- 인증되지 않은 사용자도 하나의 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
'spring security' 카테고리의 다른 글
요청 캐시 RequestCache / SavedRequest (0) | 2025.01.31 |
---|---|
로그 아웃 - logout() (0) | 2025.01.31 |
기억하기 인증 필터 - RememberMeAuthenticationFilter (0) | 2025.01.28 |
기억하기 인증 - rememberMe() (0) | 2025.01.28 |
기본 인증 필터 - BasicAuthenticationFilter (0) | 2025.01.27 |