스프링

트러블슈팅 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와 함께 사용되어, 인증된 사용자의 정보를 메소드에 자동으로 주입하는 방식으로, 주로 웹 애플리케이션에서 사용됩니다.

개발중 사용방법이 왜 그런지 알기위해 사용하엿다.