목차
- Authentication
- SecurityContextHolder
1. Authentication
Authentication은 가장 기본적인 방식인 Form 인증을 예로 들었을 때, 사용자의 아이디와 패스워드를 기반으로
인증을 수행하고, 그에 따른 인가를 허용할 때 사용하는 객체이다.
해당 흐름도를 살펴보면 총 2번의 Authentication이 등장하는 데, 사용하는 클래스 및 자료의 구성 자체는 같으나
내부적으로 들어가는 속성에는 변화가 존재한다.
Principal과 Authentication은 각각 인터페이스로, Authentication은 Principal을 상속받은 인터페이스이다.
메서드의 세부적인 내용은 아래의 표와 같다.
getPrincipal() | 인증 주체를 의미함. 인증 전에는 Username(아이디), 인증 후에는 UserDetails 객체가 될 수 있음. |
getCredentials() | 인증을 위한 자격 증명으로 주로 Password가 들어감. |
getAuthorities() | Principal에게 부여된 권한을 나타냄. |
getDetails() | 인증 요청에 대한 IP, 인증서 일련번호 등 세부적인 사항을 저장함 |
isAuthenticated() | 인증 상태를 반환 |
setAuthenticated(boolean) | 인증 상태를 설정 |
즉, 인증 전과 인증 후를 비교했을때 간략하게 Authentication은 다음과같은 상태를 유지한다고 볼 수 있다.
인증 전에는 username과 password가 각각 principal과 credentails에 저장되고 Authentication Manager에게 전달된 이후 Provider에 의해 인증이 수행된다.
성공적으로 인증이 마무리되면 개인정보와 같은 Credentails은 유출 위험을 막기 위해 빈 공간으로 초기화하고
UserDetails타입의 객체를 Principal에설정하여 반환하면 해당 객체가 SecurityContextHolder에 저장되는 것이다.
2. SecurityContextHolder
SecurityContextHolder는 사용자가 인증을 성공했을 때의 객체 ( Authentication 타입 )를 저장하는 저장 공간이라고 볼 수 있다.
하지만 모든 인증 성공 객체에 대해 SecurityContextHolder에 일괄 저장하는 것이 아닌, 내부적으로 SecurityContext에 Authentication 객체를 저장한 이후 SecurityContext 자체를 Holder에 저장하는 것이다.
해당 내용에 대한 정리는 아래의 표와 같다.
SecurityContext | 기능 |
Authentication 저장 | 현재 인증된 사용자의 Authentication 객체를 저장함. |
ThreadLocal 저장소 사용 | SecurityContextHolder를 통해 접근되며 ThreadLocal 저장소를 사용해 각 스레드가 자신만의 보안 영역을 사용함. |
어플리케이션 접근성 | 어플리케이션 어느 곳에서도 접근 가능하고 현재 사용자의 인증상태 확인이 가능함 |
SecurityContextHolder | 기능 |
SecurityContext 저장 | Authentication을 담은 SecurityContext 객체를 저장함. |
전략 패턴 사용 | 다양한 저장 전략을 지원하기 위해 SecurityContextHolderStrategy 인터페이스를 사용함. |
기본 전략 | MODE_THREADLOCAL |
전략 모드 직접 지정 | SecurityContextHolder.setStrategyName("name") |
Strategy | 기능 |
MODE_THREADLOCAL | 기본 모드이며, 각 스레드가 독립적인 보안 영역을 지님. |
MODE_ INHERITABLETHREADLOCAL |
부모 스레드로부터 자식 스레드로 보안 컨텍스트가 상속되며 스레드간 작업 분산 실행을 할 때 적합함. |
MODE_GLOBAL | 전역적인 단일 보안 컨텍스트를 사용하는 방법. |
기본적으로는 THREADLOCAL을 통해 기본 전략을 내세우고 있다.
각각의 전략에 대해서 SecurityContextHolder 클래스 내부에 멤버로 정의되어 있는 모습을 확인할 수 있다.
'Spring Security' 카테고리의 다른 글
[Spring Security 6.x] Authentication Manager / Authentication Provider (0) | 2024.06.22 |
---|---|
[Spring Security 6.x] FormLogin 동작 방식 (0) | 2024.06.15 |
[Spring Security 6.x] DelegatingFilterProxy / FilterChainProxy (1) | 2024.06.12 |
[Spring Security 6.x] HttpSecurity / WebSecurity (0) | 2024.06.11 |
[Spring Security 6.x] Default Authentication(기본 인증 설정, 기본 로그인 페이지) (0) | 2024.06.10 |