JWT
JSON Web Token の略で、署名付きの JSON でユーザー情報を安全に伝達するトークン形式
JWT とは
JWT (JSON Web Token) は、署名付きの JSON でユーザー情報 (クレーム) を安全に伝達するトークン形式である。サーバーサイドのセッション管理が不要で、ステートレスな認証に適する。
JWT の構造
JWT はドット (.) で区切られた 3 つのパートで構成される。Header にアルゴリズムとトークン種別、Payload にユーザー情報や有効期限などのクレーム、Signature に改ざん検知用の署名が含まれる。Header と Payload は Base64URL エンコードされているだけで暗号化はされていないため、機密情報を Payload に含めてはならない。
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 とセッションの違いを以下にまとめる。
| 観点 | JWT | セッション |
|---|---|---|
| 状態管理 | ステートレス | サーバーに保存 |
| スケーラビリティ | 高い (DB 不要) | セッションストアが必要 |
| 無効化 | 困難 (有効期限まで有効) | 即座に無効化可能 |
| サイズ | 大きい (ペイロードを含む) | 小さい (ID のみ) |
| サーバーレス | ✅ 最適 | △ セッションストアが必要 |
API Gateway が JWT を自動検証し、Lambda に到達する前に認証を完了する。
JWT のセキュリティ
トークン漏洩には短い有効期限 (15 分程度) で対処し、無効化の困難さにはリフレッシュトークンを組み合わせる。ペイロードの改ざんは署名 (RS256) で検証し、alg: none 攻撃にはアルゴリズムをサーバー側で固定して防ぐ。
署名アルゴリズムは、単一サービスなら共有秘密鍵の HS256、マイクロサービスなら公開鍵/秘密鍵の RS256 を使う。Cognito は RS256 を採用しており、公開鍵は JWKS エンドポイントで公開される。
JWT に含めるべき情報
標準的なクレームとして、sub (ユーザー ID)、exp (有効期限)、iss (発行者)、aud (対象者)、scope (権限スコープ) がある。
全体像を把握するには関連書籍も有用。
この記事は役に立ちましたか?
関連用語
リフレッシュトークン
アクセストークンの有効期限切れ後に、再認証なしで新しいアクセストークンを取得するためのトークン
OpenID Connect
OAuth 2.0 の上に構築された認証レイヤーで、ユーザーの身元情報を ID トークンとして提供する
レート制限パターン
API やサービスへのリクエスト数を制限し、過負荷やリソース枯渇を防ぐ設計パターン
ケイパビリティベースセキュリティ
リソースへのアクセス権を偽造不可能なトークン (ケイパビリティ) として管理するセキュリティモデル
OAuth 2.0
ユーザーのパスワードを渡さずに、リソースへの限定的なアクセスを許可する認可フレームワーク
Template Method パターン
アルゴリズムの骨格を親クラスで定義し、具体的なステップをサブクラスに委ねるデザインパターン