Spring Security - 1. Authentication, SecurityContextHolder
Security Context Holder
Security Context Holder는 인증된 사용자의 구체적인 정보를 보관한다.
- Pricipal
- 식별된 사용자 정보를 보관한다. UserDetails의 인스턴스를 의미한다.
- 시스템에 따라 UserDetails 클래스를 상속하여, 커스텀한 형태로 유지할 수 있다.
- Credentials
- 주체 (사용자가) 올바르다는 것을 증명하는 자격 증명이다.
- 보통 비밀번호를 의미하며, AuthenticationManager 와 관련된 항목일 수 있다.
- Authorities
- 사용할수 있는 권한을 의미한다.
- Authentication 상태에 영향을 주지 않거나 수정할 수 없는 인스턴스를 사용해야 한다.
인증정보 유효기간
Security Context Holder 에 저장된 인증정보의 유효 기간은 다음과 같은 방식으로 결정된다.
-
HTTP Session 기반 :
- 기본적으로 Speing Security 는 HTTP 세션을 사용하여 인증 정보를 저장한다.
- 세션이 만료되면 (예: 사용자가 로그아웃 하거나, 세션 타임아웃이 발생할 때) Security ContextHolder 의 인증 정보도 같이 제거된다.
- 세션 타임아웃은 웹 어플리케이션의 설정에 따라 달라지며, 일반적으로 ‘web.xml’ 파일이나 Spring Boot 설정 (’application.properties’ 또는 ‘application.yml’) 에서 정의할 수 있다.
-
Stateless (JWT 토큰 등) 기반 :
- JWT (JSON Web Token)와 같은 토큰 기반 인증을 사용하는 경우, Security Context Holder 의 인증정보는 각 요청이 들어올때마다 새롭게 설정된다.
- 이 경우 토큰 자체에 유효 기간이 포함되어 있으며, 토큰이 만료되면 해당 토큰을 사용한 요청은 인증에 실패하게 된다.
- 토큰 기반 인증은 세션을 사용하지 않으므로, 서버는 상태를 유지하지 않고 클라이언트가 토큰을 전달할 때마다 인증 정보를 검증한다.
-
ThreadLocal 사용 :
ThreadLocal
- Security Context Holder 는 기본적으로 ‘ThreadLocal’ 을 사용하여 현재 스레드에 대한 인증 정보를 저장한다.
- 요청이 끝나면 해당 스레드의 ‘ThreadLocal’에 저장된 정보는 제거된다.
- 따라서 Security Context Holder 의 인증정보는 요청이 완료될때까지 유효하게 된다.
사용자의 정보 세팅하기