JWT

JWTとは

JWT(JSON Web Token)は、[[JSON]] 形式の情報に署名を付けてやり取りするトークンの標準形式です。「ジョット」と読みます。[[認証と認可]] の場面で「このユーザーは誰か」「どんな権限を持つか」をサーバー間・サーバーとクライアント間で安全に受け渡すために使われ、[[OAuth・OIDC]] の ID トークンにも採用されています。

構造: 3つのパートをドットでつなぐ

JWT は ヘッダー.ペイロード.署名 の3パートを . で連結した文字列です。

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMTIzIn0.XXXXXXXX
パート中身
ヘッダー署名アルゴリズムなどのメタ情報
ペイロードユーザーID・有効期限などの本体データ(クレーム)
署名ヘッダー+ペイロードから計算した署名([[電子署名とハッシュ]])

受け取った側は署名を検証することで、トークンが改ざんされていないこと信頼できる発行者が作ったことを確認できます。

最重要の注意: 署名は「暗号化」ではない

ヘッダーとペイロードは Base64URL という誰でも元に戻せるエンコードがされているだけです。つまり JWT の中身は、受け取った人なら誰でも読めます。

  • 署名で守れるのは「改ざんの検知」まで
  • パスワードや個人情報など、見られて困る情報をペイロードに入れてはいけません

セッション方式との比較

JWT[セッション管理]
状態の持ち方トークン自体に情報を持つサーバー側にセッション情報を保存
サーバーの負担保存不要でスケールしやすいセッションストアが必要
失効(ログアウト)有効期限まで無効化しにくいサーバー側で即時に破棄できる

JWT は発行後にサーバー側で取り消しにくいため、有効期限を短くし、リフレッシュトークンと組み合わせる運用が一般的です。

初学者向けポイント

  • 署名の検証を省略した実装は「誰でも偽造できるトークン」になります。ライブラリの検証機能を必ず使いましょう
  • 署名用の秘密鍵が漏れるとトークンを偽造されます。鍵は [[シークレット管理]] の対象です
  • 「JWT=暗号化されていて安全」という誤解が事故のもと。読める前提で設計します

関連技術とのつながり

  • [[認証と認可]] — JWT が運ぶのは「誰で、何ができるか」の情報
  • [[OAuth・OIDC]] — ID トークンとして JWT が使われる代表例
  • [[セッション管理]] — 対になる状態管理方式。トレードオフで選ぶ
  • [[電子署名とハッシュ]] — 改ざん検知を支える仕組みそのもの
  • [[JSON]] — ペイロードの表現形式
Q: JWTの署名で確認できることはどれ?
- [x] トークンが改ざんされていないこと
- [ ] ペイロードの中身が第三者に読めないこと
- [ ] 通信経路が暗号化されていること
解説: 署名は改ざん検知と発行者の確認のための仕組みです。ペイロードは Base64URL で誰でも読めます。

Q: JWTのペイロードに入れてはいけないものはどれ?
- [ ] ユーザーID
- [x] パスワードなどの秘密情報
- [ ] トークンの有効期限
解説: ペイロードは誰でも復元して読めるため、見られて困る情報を入れてはいけません。

Q: セッション方式と比べたJWTの弱点はどれ?
- [ ] サーバー側に保存領域が必要になる
- [x] 発行後に有効期限まで無効化しにくい
- [ ] トークンに情報を含められない
解説: JWT はサーバーに状態を持たない分、発行済みトークンの即時失効が難しく、短い有効期限での運用が基本です。