## 개요
토큰을 표현하는 형식 중 하나.
JWT 용어를 하나하나 분해해보자
* JSON: 가볍고 사람이 읽을 수 있는 데이터 포맷. 키-값 구조.
* Web: 웹 환경에서 주로 쓰인다.
* Token: 어떤 종류의 "권한 증명"이나 "정보 조각"이다.
JWT의 탄생 목적은 본질적으로 **Authentication**. 사용자가 누구인지 확인하는 과정에 사용된다는 것이다. 물론 토큰 안에 관리자/일반 사용자 같은 권한 정보도 넣을 수 있지만 본질적으로는 인증에 사용된다고 생각하자
## 구조
JWT는 3개의 부분으로 구성된다.
1. Header (헤더): 어떤 알고리즘으로 서명했는지, 타입은 뭔지 알려줌.
2. Payload (내용): 인증 관련 정보나 기타 데이터를 담음. 예: 사용자 ID, 권한 등.
3. Signature (서명)
* 데이터 위조를 막기 위해 사용하는 서명 값
* JWT의 위조와 변조를 방지한다
* 누군가 토큰을 조작하면 서명이 깨져서 인증에 문제가 생긴다
>[!note]
이 세 구조는 **Base64로 인코딩**되어 점(.)으로 연결된다.
`xxxxx.yyyyy.zzzzz`
이 말은 암호화(Encrytion)되지 않았다는 것이다.
그러므로 JWT안에 민감한 정보를 넣어서는 안된다.
## 특징
1. JWT는 Stateless Authentication을 가능하게 하는 구성요소이다.
1. 전통적인 서버 세션 기반 인증 방식은 **사용자의 로그인 상태(Session)** 를 서버가 메모리 또는 저장소에 유지한다. 반면, JWT 기반 인증은 사용자 인증 정보를 토큰 내부에 **자체적으로 포함(Self-contained)** 하며, 서버는 이 상태를 별도로 저장하지 않는다. 따라서 인증 상태를 클라이언트가 유지하게 되며, 서버는 **Stateless(무상태)** 하게 요청을 처리할 수 있다. 이는 REST API의 무상태 통신 철학과 매우 잘 맞는다.
2. JWT는 일반적으로 Access Token과 Refresh Token으로 구성된다.
1. Access Token: 클라이언트가 API 요청 시 사용하며, 유효 기간이 짧다. 료되면 보호된 자원에 접근할 수 없다.
2. Refresh Token: Access Token이 만료되었을 때, 재로그인 없이 새 토큰을 발급받기 위한 용도로 사용된다. Refresh Token은 보통 더 긴 수명을 가지며, 서버 측 저장이 요구되기도 한다 (보안 강화 목적).
3. 클라이언트는 API 요청 시 JWT를 Authorization 헤더에 포함해 전송한다.
```
Authorization: Bearer <access_token>
```
서버는 이 토큰의 서명(Signature)을 검증하고, Payload의 클레임 정보를 기반으로 사용자를 식별 및 인가한다.
# 관련 개념
***
[[OAuth 2.0]]
[[OpenID Connect]]
[[TLS (Transport Layer Security)]]