JWT

JSON Web Token の略で、署名付きの JSON でユーザー情報を安全に伝達するトークン形式

認証セキュリティ

JWT とは

JWT (JSON Web Token) は、署名付きの JSON でユーザー情報 (クレーム) を安全に伝達するトークン形式である。サーバーサイドのセッション管理が不要で、ステートレスな認証に適する。

JWT の構造

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiQWxpY2UifQ.signature
|--- Header ---|.|----- Payload -----|.|- Signature -|

Header:  { "alg": "RS256", "typ": "JWT" }
Payload: { "sub": "123", "name": "Alice", "exp": 1700000000 }
Signature: RS256(header + "." + payload, privateKey)

JWT vs セッション

観点 JWT セッション
状態管理 ステートレス サーバーに保存
スケーラビリティ 高い (DB 不要) セッションストアが必要
無効化 困難 (有効期限まで有効) 即座に無効化可能
サイズ 大きい (ペイロードを含む) 小さい (ID のみ)
サーバーレス ✅ 最適 △ セッションストアが必要

API Gateway が JWT を自動検証し、Lambda に到達する前に認証を完了する。

JWT のセキュリティ

トークン漏洩には短い有効期限 (15 分程度) で対処し、無効化の困難さにはリフレッシュトークンを組み合わせる。ペイロードの改ざんは署名 (RS256) で検証し、alg: none 攻撃にはアルゴリズムをサーバー側で固定して防ぐ。

署名アルゴリズムは、単一サービスなら共有秘密鍵の HS256、マイクロサービスなら公開鍵/秘密鍵の RS256 を使う。Cognito は RS256 を採用しており、公開鍵は JWKS エンドポイントで公開される。

JWT に含めるべき情報

標準的なクレームとして、sub (ユーザー ID)、exp (有効期限)、iss (発行者)、aud (対象者)、scope (権限スコープ) がある。

全体像を把握するには関連書籍も有用。

関連用語