JWT (JSON Web Token)

JWTについて公式サイトやRFCに基づいた情報を整理し、特徴・構成などを分かりやすくまとめました。
 
 

JWTの概要

JWTJson Web Token)とは、データを安全に送受信するための規格。
RFC 7519として標準化されている。公式サイトもあり、JWTを扱えるライブラリ一覧やJWTのデコーダを提供している。
「ジェー・ダブリュー・ティー」とは読まず「ジョット」と読むのが一般的。
 
 

JWTの構成と生成の流れ

JWTは「Header部」「Payload部」「Signature部」の3つの部分で構成されており、それぞれの値がBase64エンコードされ、「.」(ドット)繋ぎのデータとして送信される。
 
JWTの一例を以下に示す。(<Header部>.<Payload部>.<Signature部>)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6InNodWthcGluIiwiaWF0IjoxNTE2MjM5MDIyfQ.3L4Xp5IdML8ibBxiMe3abZCIBctdLkafSxyd1pU9vJM
 

JWTの生成手順

JWTが生成される手順を以下の図に示す。
  1. Header部とPayload部をそれぞれBase64という形式でエンコードする。
  1. エンコードしたHeader部とPayload部を「.」で結合し、JWTの発行者のみが持つシークレット鍵(下図の例では値「secret123」)を使ってハッシュ化する。(Signature部を生成する)
  1. エンコードしたHeader部とPayload部に加えてSignature部を「.」で結合したJWTが完成する。
 

JWTの各要素の詳細

JWTの各要素(Header部, Payload部, Signature部)の詳細について以降に示す。

Header部

Base64エンコードする前のHeader部は以下の通り。
 
以下の要素を含むことができる。「alg」のみ必須のパラメータ。
要素名概要名前の由来
alg署名で使用するアルゴリズム。HMAC SHA256(HS256)またはRSA(RS256)algorithm
typトークンのタイプ。type
jwkJWTの公開鍵の情報JSON Web Key
jkuJWTの公開鍵の検証サーバのURLJSON Web Key Set URL
kid署名検証に利用する鍵の識別子Key ID
 

Payload部

Base64エンコードする前のPayload部は以下の通り。Payload部の各要素はクレーム(claim)と呼ばれる。
以下の例のPayload部には、subクレーム、nameクレーム、iatクレームが含まれている。
 
クレーム(claim)は以下の表の3種類に分類される。
クレーム種別概要
Registeredクレーム予め定義されているクレーム。
Publicクレーム比較的広い範囲で利用される想定のクレーム。 他のPublicクレームと名前が重複することを防止するため、IANAの 「JSON Web Token Claims」に登録したり、衝突が起こりにくい名前を付けることが推奨されている。
Privateクレーム各システムで固有のクレーム。
 
JWTの仕様で予め定義されているRegisteredクレームのクレーム名一覧は以下の通り。
クレーム名概要名前の由来
issJWTの発行者。Issuer
subJWTの用途。Subject
audJWTの利用者と想定される対象。Audience
expJWT の有効期限。Expiration Time
nbfJWT が有効になる日時。Not Before
iatJWT を発行した時刻。Issued At
jtiJWTの識別子。JWT ID
 

Signature部

Base64エンコード済みのHeader部とPayload部を「.」(ドット)で繋いだ値を入力値として、JWTの発行者のみが知るシークレット鍵を使ってハッシュ化する。
利用する署名アルゴリズムはHeader部に記載されており、「HMAC SHA256(HS256)」または「RSA」が一般的。
 

JWTの特徴

JWTの主な特徴は以下の通り。

JSON形式→軽量で読みやすい

送受信するデータはJSON形式で記述できる。
JSONは他の形式(XMLなど)と比較してデータサイズが軽量で人間にとっても読みやすい。
 

署名を含む→改竄検知できる

JWTのSignature部には署名データが含まれる。
署名を検証することで、Header部またはPayload部の内容が改竄されていないかをチェックできる。
 

Base64でエンコード→Webアプリ上の不具合が起きにくい

Base64でエンコードされたデータはURLに含めることができる文字のみで構成される。(この特徴を「URL-Safe」という)
そのため、プログラムの処理でJWTを扱う上で不具合が起きにくく、Webの仕様と相性が良い。

関連リンク