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)가 들어 있다고 보시면 됩니다.
'Back-End > Spring' 카테고리의 다른 글
| Spring은 어떻게 객체를 관리할까? (0) | 2025.02.25 |
|---|---|
| Self-Invocation(자기호출) 문제 (0) | 2025.02.25 |
| SpringSecurity + JWT를 활용한 로그인 (0) | 2025.01.23 |
| Spring Security + OAuth2.0 + Jwt 활용 소셜 로그인 기능 만들기 (0) | 2025.01.21 |
| 스프링 트랜잭션의 이해(feat. 전파) (0) | 2025.01.20 |