본문 바로가기

Back-End/Spring

SpringSecurity Authentication 객체와 Principal 객체

Authentication 객체와 Principal 객체 둘 다 로그인한 사용자와 관련된 정보를 담고 있어 헷갈리기 쉽습니다.
이번 주제로는 둘을 비교하며 쉽게 풀어보겠습니다.


1. 아주 간단한 정의

1. Principal : 인증된 사용자(user)가 누구인지에 대한 핵심 식별 정보

  • Ex. 사용자 이름, 이메일 혹은 CustomUserDetails 객체 자체

2. Authentication : 인증에 관한 전반적 상태 / 정보

  • 그 안에 Principal(사용자 식별 정보), 비밀번호나 토큰(자격증명), 권한 리스트, 추가세부 정보(IP, 세션 등)까지 종합하여 담고 있습니다.

스프링 시큐리티에서 인증이 끝나면 SecurityContextHolder.getContext().setAuthentication(…) 이렇게 최종적으로 Authentication 객체를 저장합니다. 그런데 그 Authentication 안에 Principal이 포함 되어 있습니다.


2. 비유로 표현하기

운전면허증 비유

  • Pincipal = 나의 이름(혹은 "누구냐?"를 나타내는 핵심 식별자)
  • Authentication = 운전면허증 전체
    • 이름(Principal), 사진, 생년월일, 주소, 발급기관 정보, 면허 등급 등
    • 본인이 정말 이 사람 맞다는 증명이 포함된 종합 문서

이 면허증(=Authentication)을 보면 이름(= Principal)이 OOO이고, 운전 등급(= 권한)이 1종 보통, 발급기관은 어디, 유효기간은 언제까지…등 추가 정보를 한꺼번에 확인할 수 있습니다.


3. 코드에서 어떻게 보이는가?

예를 들어 스프링 시큐리티가 만든 UsernamePasswordAuthenticationToken 객체를 보면

UsernamePasswordAuthenticationToken(
  principal = CustomUserDetails(userEntity),  // 사용자 식별 정보
  credentials = null,                        // 보통 인증 후엔 비번을 null 처리
  authorities = [ROLE_USER]                  // 사용자 권한
);
  • 여기서 principal 필드는 곧 누가 로그인했는가? 를 의미합니다.
  • 나머지 credentials, authorities, details 등을 합친 게 Authentication 객체 전체입니다.

4. 그래서 왜 둘 다 “인증된 객체”라 부르는 걸까?

  • Principal: 말 그대로 “인증된 사용자(주체)
  • Authentication: 인증 절차를 마친 결과물
    •  Principal(누구?), Credentials(어떻게 증명?), Authorities(권한?), isAuthenticated(인증 성공 여부?) 같은 필드를 모두 포함

즉, 인증 성공 후 Authentication “로그인 성공한 사용자 + 인증 방법 + 권한”을 담고 있는 종합 세트이고 그 종합 세트 안에 “사용자 자체”(Principal)가 들어 있다고 보시면 됩니다.