## 개요 토큰을 표현하는 형식 중 하나. 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)]]