💡 개요
Spring Security는 인증 및 권한 관리를 담당하는 프레임워크다. 오늘은 Spring Security에서 인증된 사용자 정보를 관리하는 Spring Context에 대해 정리해 보자.
📕 Security Context
Security Context는 Spring Security에서 인증된 사용자 정보를 저장하는 공간이다.
보통 Spring Security에서 JWT 기반 인증을 사용하면, 클라이언트는 요청할 때 JWT 토큰을 함께 보낸다. 이 토큰의 페이로드에는 사용자를 식별할 수 있는 정보(예: 사용자 ID, 이메일 등)가 포함되어 있다.
Spring Security는 이 JWT 토큰을 검증하고, 인증이 성공하면 인증된 사용자 정보를 Security Context에 저장한다.
이렇게 하면 이후 컨트롤러나 서비스 계층에서 별도로 인증 정보를 다시 조회하지 않아도, Security Context에서 바로 사용자 정보를 가져와 활용할 수 있다.
만약 Security Context가 없다면, 클라이언트는 매번 요청할 때 JWT 토큰뿐만 아니라 사용자 정보도 추가로 보내야 한다.
하지만 JWT 자체에 이미 사용자 정보가 포함되어 있기 때문에, 같은 정보를 불필요하게 두 번 보내는 셈이 된다.
즉, Security Context는 인증된 정보를 효율적으로 관리하여 불필요한 데이터 전송을 줄이고, 애플리케이션의 보안성과 성능을 높이는 역할을 한다.
🚀 SecurityContext 저장 공간
SecurityContext는 ThreadLocal을 사용하여 현재 스레드에서만 접근 가능한 공간에 인증 정보를 저장한다.
Spring Framework에서 각 사용자의 요청은 하나의 스레드에서 처리되며, 요청이 시작될 때 스레드가 할당되고, 응답이 완료되면 스레드는 반환된다.
이러한 환경에서 ThreadLocal에 데이터를 저장한다면 저장한 순간부터 응답 때까지 해당 정보를 어디서든 조회할 수 있다.
SecurityContext도 ThreadLocal과 동일하게 인증 정보가 저장된 순간부터 응답 때까지 어디서든 조회할 수 있다.
🚀 SecurityContext 예제
다음은 Security Conext의 예제 코드이다.
🚀 SecurityContext에 인증 객체 저장
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new TestingAuthenticationToken("username", "password", "ROLE_USER");
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context);
위 코드는 SecurityContextHolder에게 비어있는 SecurityContext 공간을 할당받은 후, Context 내부에 사용자 인증 객체인 Authentication authentication 을 저장하는 코드이다.
주로 사용자의 JWT를 검증하는 필터 단에서 위의 코드가 작성된다.
SecurityContextHolderd와 SecurityContext의 구조는 다음과 같다.
SecurityContext에서 인증 객체 조회
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/member")
public class MemberController {
...
@GetMapping("/security-context-test")
public ResponseEntity<String> accessTokenTest(@AuthenticationPrincipal UserDetails userDetails) {
return ResponseEntity.status(HttpStatus.OK).body(userDetails.getUsername());
}
}
@AuthenticationPrincipal 은 현재 SecurityContext에 저장된 인증 객체에서 사용자 정보를 가져오는 역할을 한다.
즉, 내부적으로 ThreadLocal을 이용한 SecurityContextHolder를 통해 인증 객체를 조회한다.
👨🏻💻 참고
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.02.17 - Service 여러 개 Repository (Feat : Facade 패턴) (0) | 2025.02.17 |
---|---|
[개발 일기] 2025.02.16 - Transaction Synchronization (0) | 2025.02.16 |
[개발 일기] 2025.02.14 - 우선순위 큐 (0) | 2025.02.14 |
[개발 일기] 2025.02.13 - 자바 record (0) | 2025.02.13 |
[개발 일기] 2025.02.12 - 스티키 세션 (1) | 2025.02.12 |