JWT(JSON Web Token)는 클레임(주장)들을 담은 JSON을 서명해 만든, URL-safe한 자체 포함 토큰 형식입니다.
점(.)으로 구분된 세 부분 — 헤더.페이로드.서명 — 으로 이뤄지며, 서명 덕분에 내용의 무결성과 발급자를 검증할 수 있습니다.
가장 흔한 오해를 바로잡아야 합니다. 표준 JWT(JWS)는 '서명'된 것이지 '암호화'된 것이 아닙니다. 헤더와 페이로드는 단지 Base64URL로 인코딩됐을 뿐이라 누구나 디코드해 내용을 읽을 수 있습니다. 따라서 비밀번호·주민번호 같은 민감 정보를 페이로드에 넣으면 안 됩니다. 서명이 보장하는 것은 '내용이 변조되지 않았고 서명 키를 가진 발급자가 만들었다'는 사실이지, '내용의 비밀'이 아닙니다(진짜 암호화가 필요하면 JWE를 씁니다).
검증은 서명으로 합니다. 대칭키(HS256, 공유 비밀)나 비대칭키(RS256/ES256, 공개키로 검증)로 서명하고, 서버는 서명·발급자(iss)·수신자(aud)·만료(exp)를 확인합니다. 보안 함정으로 `alg: none` 허용, 알고리즘 혼동 공격(RS256을 HS256으로 속여 공개키를 비밀로 오용), 만료·검증 누락이 유명하니 라이브러리로 엄격히 검증해야 합니다. JWT의 장점은 상태를 서버에 두지 않아 확장에 유리한 것이고, 단점은 만료 전 즉시 무효화가 어렵다는 점입니다(짧은 수명 + 리프레시 토큰 또는 블록리스트로 보완). 액세스 토큰의 대표적 구현체가 바로 JWT입니다.