스프링
트러블슈팅 JWT와 @AuthenticationPrincipal의 차이점
148june
2025. 4. 28. 20:13
# JWT vs @AuthenticationPrincipal
## 1. **JWT (JSON Web Token)**
### 개념
JWT는 사용자 인증을 위해 서버와 클라이언트 간에 전달되는 JSON 형식의 토큰입니다. 주로 **상태 없는 인증(stateless authentication)** 시스템에서 사용됩니다.
### 동작 원리
- JWT는 세 부분으로 구성됩니다:
1. **Header**: 토큰의 타입과 서명 알고리즘 정보를 포함.
2. **Payload**: 인증된 사용자 정보 및 기타 클레임(claim)을 포함.
3. **Signature**: 서명은 토큰의 무결성을 보장하기 위해 사용됩니다.
- 클라이언트는 로그인 후 서버로부터 JWT를 받습니다.
- 이후 클라이언트는 요청을 보낼 때마다 HTTP 헤더(`Authorization: Bearer <token>`)에 JWT를 포함시켜 보냅니다.
- 서버는 JWT의 서명을 검증하여 사용자를 인증하고, 유효한 토큰이면 요청을 처리합니다.
### 사용 예시
- JWT는 API 인증에 주로 사용됩니다.
- 모바일 애플리케이션, SPA(Single Page Application), 분산 시스템에서 많이 사용됩니다.
- 예:
- `Authorization: Bearer <JWT>`
### 장점
- 서버가 상태를 저장하지 않으므로 서버 부하가 적고 확장성이 뛰어납니다.
- 분산 시스템에서 여러 서버 간에 인증 정보를 공유할 필요가 없습니다.
### 단점
- JWT 토큰 자체가 클라이언트 측에 저장되므로 보안상 취약할 수 있습니다.
- 만료된 토큰을 서버에서 관리하지 않기 때문에, 클라이언트에서 토큰 갱신을 처리해야 합니다.
---
## 2. **@AuthenticationPrincipal**
### 개념
`@AuthenticationPrincipal`은 Spring Security에서 사용되는 어노테이션으로, 현재 인증된 사용자의 정보를 메소드 인자로 직접 주입할 수 있게 해줍니다.
### 동작 원리
- Spring Security에서는 로그인 인증 후 `SecurityContextHolder`에 현재 인증된 사용자의 정보가 저장됩니다.
- `@AuthenticationPrincipal` 어노테이션을 사용하면, 이 정보를 자동으로 메소드 파라미터에 바인딩하여 사용할 수 있습니다.
- `@AuthenticationPrincipal`을 사용하면 현재 사용자의 `Principal` 객체(일반적으로 `UserDetails` 객체)가 주입됩니다.
### 사용 예시
- **컨트롤러 메소드**에서 현재 인증된 사용자의 정보를 쉽게 가져오기 위해 사용됩니다.
- 예:
```java
@GetMapping("/profile")
public ResponseEntity<UserProfileDto> getProfile(@AuthenticationPrincipal UserDetails userDetails) {
String username = userDetails.getUsername();
return ResponseEntity.ok(new UserProfileDto(username));
}
장점
- 현재 인증된 사용자의 정보를 쉽게 접근할 수 있습니다.
- 코드가 간결하고 직관적입니다.
단점
- @AuthenticationPrincipal을 사용하려면, Spring Security에서 인증된 사용자가 존재해야 합니다.
3. JWT와 @AuthenticationPrincipal의 차이점
항목 JWT (JSON Web Token) @AuthenticationPrincipal
목적 | 사용자 인증 정보 전달 및 상태 없는 인증 | 현재 인증된 사용자의 정보를 메소드에 주입 |
---|---|---|
동작 방식 | 클라이언트가 서버에 JWT를 보내면, 서버는 이를 검증하여 인증 | 서버에 인증된 사용자의 정보를 자동으로 주입 |
상태 관리 | 상태 없음(stateless): 서버는 인증 상태를 관리하지 않음 | 상태 있음(stateful): 서버에서 인증 상태 관리 |
사용 예시 | API 인증, 분산 시스템, 모바일 애플리케이션 | Spring Security 환경에서 인증된 사용자 정보 사용 |
보안 | 토큰 자체에 인증 정보가 포함되므로, 탈취된 토큰으로 인증할 수 있음 | 서버에서 관리되는 인증 정보에 의존하므로, 서버에 의한 보안 관리가 중요 |
토큰 저장 위치 | 클라이언트(로컬 스토리지, 세션 스토리지, 쿠키 등) | 서버의 SecurityContextHolder에 저장된 정보에서 자동으로 주입 |
만료 처리 | 클라이언트에서 JWT 만료를 관리하고 갱신해야 함 | 서버에서 인증된 사용자 정보가 관리되므로 별도의 만료 처리 없음 |
결론
- JWT는 주로 API 인증, 모바일 애플리케이션, 분산 시스템에서 사용되며, 인증 상태를 서버가 관리하지 않기 때문에 확장성에 유리합니다.
- @AuthenticationPrincipal은 Spring Security와 함께 사용되어, 인증된 사용자의 정보를 메소드에 자동으로 주입하는 방식으로, 주로 웹 애플리케이션에서 사용됩니다.
개발중 사용방법이 왜 그런지 알기위해 사용하엿다.