JWT (JSON Web Token)
JWTについて公式サイトやRFCに基づいた情報を整理し、特徴・構成などを分かりやすくまとめました。
JWTの概要JWTの構成と生成の流れJWTの生成手順JWTの各要素の詳細Header部Payload部Signature部JWTの特徴JSON形式→軽量で読みやすい署名を含む→改竄検知できるBase64でエンコード→Webアプリ上の不具合が起きにくい関連リンク
JWTの概要
JWT(Json Web Token)とは、データを安全に送受信するための規格。
「ジェー・ダブリュー・ティー」とは読まず「ジョット」と読むのが一般的。
JWTの構成と生成の流れ
JWTは「Header部」「Payload部」「Signature部」の3つの部分で構成されており、それぞれの値がBase64エンコードされ、「.」(ドット)繋ぎのデータとして送信される。
JWTの一例を以下に示す。(<Header部>.<Payload部>.<Signature部>)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6InNodWthcGluIiwiaWF0IjoxNTE2MjM5MDIyfQ.3L4Xp5IdML8ibBxiMe3abZCIBctdLkafSxyd1pU9vJM
JWTの生成手順
JWTが生成される手順を以下の図に示す。
- Header部とPayload部をそれぞれBase64という形式でエンコードする。
- エンコードしたHeader部とPayload部を「.」で結合し、JWTの発行者のみが持つシークレット鍵(下図の例では値「secret123」)を使ってハッシュ化する。(Signature部を生成する)
- エンコードしたHeader部とPayload部に加えてSignature部を「.」で結合したJWTが完成する。
JWTの各要素の詳細
JWTの各要素(Header部, Payload部, Signature部)の詳細について以降に示す。
Header部
Base64エンコードする前のHeader部は以下の通り。
以下の要素を含むことができる。「alg」のみ必須のパラメータ。
要素名 | 概要 | 名前の由来 |
---|---|---|
alg | 署名で使用するアルゴリズム。HMAC SHA256(HS256)またはRSA(RS256) | algorithm |
typ | トークンのタイプ。 | type |
jwk | JWTの公開鍵の情報 | JSON Web Key |
jku | JWTの公開鍵の検証サーバのURL | JSON 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クレームのクレーム名一覧は以下の通り。
クレーム名 | 概要 | 名前の由来 |
---|---|---|
iss | JWTの発行者。 | Issuer |
sub | JWTの用途。 | Subject |
aud | JWTの利用者と想定される対象。 | Audience |
exp | JWT の有効期限。 | Expiration Time |
nbf | JWT が有効になる日時。 | Not Before |
iat | JWT を発行した時刻。 | Issued At |
jti | JWTの識別子。 | 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の仕様と相性が良い。