【じょっと】

JWT とは?

最終更新:
💡 情報を運ぶトークンは、読めても検証が必要

JSONのクレーム(伝える情報)を、JWSやJWEの形式で表すトークン。署名やMACで改ざんを検知する形式と、暗号化する形式があり、受け手は用途に応じて検証する。

📌 このページのポイント
JWT:読めても検証が必要 署名・MAC付きJWSの3パート Header 方式など Payload クレーム Signature 署名・MAC . . PayloadはBase64url:暗号化ではない 受け手が検証して使う 信頼する鍵・許可した方式 発行者・宛先・期限・用途 デコード ≠ 検証
署名やMAC付きJWS形式の構造。実際の文字列では各パートをBase64urlで表し、ドットで区切る。暗号化するJWEのコンパクト形式は5パート。JWT全体が常に署名付き・3パートという意味ではない。
ひよこ ひよこ
JWTって何が入ってるの?
ペンギン先生 ペンギン先生
利用者を示すsub、発行者のiss、宛先のaud、有効期限のexpなど、用途に応じたクレームが入るよ。よく見る署名やMAC付きのJWS形式はHeader.Payload.Signatureの3パート。暗号化するJWEのコンパクト形式は5パートなので、すべてが3パートではないんだ。
ひよこ ひよこ
署名があれば、中身は秘密なの?
ペンギン先生 ペンギン先生
署名やMACは改ざんの検知に使い、暗号化とは違うよ。JWSのPayloadはBase64urlで表しただけなので、入手した人は読める。機密情報を安易に入れないことと、トークン自体の漏えいを防ぐことが大切だね。
ひよこ ひよこ
中身をデコードできたら信用していい?
ペンギン先生 ペンギン先生
それだけではだめだよ。受け手が許可した方式と信頼する鍵で検証し、発行者、宛先、期限や用途に合うクレームも確認する。トークンが指定した方式を無条件に受け入れないようにしよう。署名付きの認証に、未署名のalg: noneを混ぜて受け入れてはいけないんだ。
ひよこ ひよこ
JWTならセッション保存もログアウト処理も不要?
ペンギン先生 ペンギン先生
内容を検証して利用できるけれど、保存や無効化は別の設計だよ。利用者が手元のトークンを消すだけでは、コピーされたトークンまで失効しない。受け手が失効情報を確認する方式なら期限前に拒否できるが、その管理が必要になる。短い期限も選択肢だけれど、JWTに必須の15分という規則はないんだ。
ひよこ ひよこ
HS256は使ってはいけないの?
ペンギン先生 ペンギン先生
一律に禁止される方式ではないよ。HS256は共有秘密を使うMACなので、検証する側も同じ秘密を持ち、トークンを作れてしまう。公開鍵で検証する署名との違いを踏まえ、信頼関係に合う方式と十分な強さの鍵を選ぶ。人が覚えられるパスワードをそのままMACの鍵にしないことも必要だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「JWT」って出てきたら「JSONの情報を運び、用途に合う検証をして使うトークン」と思えばだいたいOK!
📖 おまけ:英語の意味
「JSON Web Token」 = JSONウェブトークン
💬 JSONで表したクレームを運ぶ形式の名前だよ。RFC 7519では「ジョット」という読み方を示しているんだ。

参考資料

← 用語集にもどる