Spring Security는 인증된 사용자 정보를 SecurityContext에 저장합니다. 이를 통해 애플리케이션 전반에서 현재 인증된 사용자의 정보를 조회하고 사용할 수 있습니다.
SecurityContext란?
- SecurityContext는 Spring Security에서 인증된 사용자 정보를 저장하는 컨테이너입니다.
- SecurityContextHolder를 통해 현재 요청 스레드에서 접근할 수 있습니다.
- Authentication 객체를 저장하며, 인증된 사용자 정보 및 권한을 담고 있습니다.
SecurityContext의 저장 과정
사용자 인증
- 인증 필터(예:
UsernamePasswordAuthenticationFilter
)가 사용자의 ID/비밀번호를 검증합니다.
- 인증 필터(예:
Authentication 객체 생성
- 인증이 성공하면 사용자의 정보와 권한을 포함한 Authentication 객체가 생성됩니다.
SecurityContext에 저장
- Authentication 객체가 SecurityContext에 저장됩니다.
SecurityContextHolder를 통해 조회**
- SecurityContextHolder를 사용하여 인증된 사용자의 정보를 조회합니다.
SecurityContextHolder
SecurityContextHolder
는 SecurityContext를 저장하고 접근하는 역할을 합니다.
- 기본적으로 ThreadLocal을 사용하여 현재 요청 스레드에 SecurityContext를 저장합니다.
Authentication 객체의 구조
SecurityContext에 저장되는 Authentication 객체에는 다음과 같은 정보가 들어 있습니다:
필드 | 설명 |
---|---|
Principal |
인증된 사용자 정보 (예: UserDetails ) |
Credentials |
사용자의 비밀번호 또는 인증 토큰 |
Authorities |
사용자의 권한 목록 (예: ROLE_USER , READ ) |
Details |
세션 정보, IP 주소 등 추가적인 정보 |
Authenticated |
인증 여부 (true or false ) |
예시 코드
SecurityContext에서 사용자 정보 가져오기
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
public class SecurityUtils {
public static void printAuthenticatedUser() {
// SecurityContextHolder에서 Authentication 객체 가져오기
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
// 사용자 정보 (Principal) 출력
System.out.println("사용자 정보: " + authentication.getPrincipal());
// 권한 정보 출력
System.out.println("권한 정보: " + authentication.getAuthorities());
// 인증 여부 확인
System.out.println("인증 여부: " + authentication.isAuthenticated());
}
}
출력 예시
사용자 정보: org.springframework.security.core.userdetails.User@34bcf5e1
권한 정보: [ROLE_USER]
인증 여부: true
SecurityContext에 사용자 정보 저장하기
사용자를 수동으로 인증하고 SecurityContext에 저장할 수도 있습니다:
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
public class CustomAuthentication {
public static void main(String[] args) {
// 사용자의 인증 정보 설정
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken("user", "password", List.of(new SimpleGrantedAuthority("ROLE_USER")));
// SecurityContext에 Authentication 객체 저장
SecurityContextHolder.getContext().setAuthentication(authentication);
// 저장된 사용자 정보 출력
System.out.println("인증된 사용자: " + SecurityContextHolder.getContext().getAuthentication().getName());
}
}
정리
- Spring Security는 인증 성공 시 Authentication 객체를 생성하고 SecurityContext에 저장합니다.
- SecurityContextHolder를 통해 인증된 사용자 정보를 조회할 수 있습니다.
- SecurityContext는 기본적으로 ThreadLocal에 저장되며, 요청 스레드에서 접근 가능합니다.
이 정보는 인증 및 권한 검사를 수행하거나 현재 사용자의 정보를 확인하는 데 활용됩니다.
'Spring Security' 카테고리의 다른 글
Authentication Resolver (0) | 2024.12.18 |
---|---|
Authentication Filter, Authentication Manager, Authentication Provider (0) | 2024.12.18 |
RFC6265 (0) | 2024.10.31 |
SameSite (0) | 2024.10.31 |
CORS(Cross-Origin Resource Sharing)의 Simple Request와 Non-Simple Request (0) | 2024.10.31 |