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 (権限スコープ) がある。
全体像を把握するには関連書籍も有用。