[개발 일기] 2025.02.15 - Security Context

2025. 2. 15. 18:06·개발 일기

💡 개요

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를 통해 인증 객체를 조회한다.

 

 

 

👨🏻‍💻 참고

 

https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html#servlet-authentication-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
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.02.17 - Service 여러 개 Repository (Feat : Facade 패턴)
  • [개발 일기] 2025.02.16 - Transaction Synchronization
  • [개발 일기] 2025.02.14 - 우선순위 큐
  • [개발 일기] 2025.02.13 - 자바 record
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.02.15 - Security Context
상단으로

티스토리툴바