Spring Security / / 2024. 12. 18. 15:17

SecurityContext

Spring Security는 인증된 사용자 정보SecurityContext에 저장합니다. 이를 통해 애플리케이션 전반에서 현재 인증된 사용자의 정보를 조회하고 사용할 수 있습니다.


SecurityContext란?

  • SecurityContext는 Spring Security에서 인증된 사용자 정보를 저장하는 컨테이너입니다.
  • SecurityContextHolder를 통해 현재 요청 스레드에서 접근할 수 있습니다.
  • Authentication 객체를 저장하며, 인증된 사용자 정보 및 권한을 담고 있습니다.

SecurityContext의 저장 과정

  1. 사용자 인증

    • 인증 필터(예: UsernamePasswordAuthenticationFilter)가 사용자의 ID/비밀번호를 검증합니다.
  2. Authentication 객체 생성

    • 인증이 성공하면 사용자의 정보와 권한을 포함한 Authentication 객체가 생성됩니다.
  3. SecurityContext에 저장

    • Authentication 객체SecurityContext에 저장됩니다.
  4. SecurityContextHolder를 통해 조회**

    • SecurityContextHolder를 사용하여 인증된 사용자의 정보를 조회합니다.

SecurityContextHolder

SecurityContextHolderSecurityContext를 저장하고 접근하는 역할을 합니다.

  • 기본적으로 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());
    }
}

정리

  1. Spring Security는 인증 성공 시 Authentication 객체를 생성하고 SecurityContext에 저장합니다.
  2. SecurityContextHolder를 통해 인증된 사용자 정보를 조회할 수 있습니다.
  3. SecurityContext는 기본적으로 ThreadLocal에 저장되며, 요청 스레드에서 접근 가능합니다.

이 정보는 인증 및 권한 검사를 수행하거나 현재 사용자의 정보를 확인하는 데 활용됩니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유