JWTとは何か:3パート構造の基礎
JWT(JSON Web Token、RFC 7519で標準化されたトークン形式)は、Header・Payload・Signatureの3つをBase64URLエンコードし、ドット.で連結した文字列です。サーバー側に状態を持たずに「このトークンは確かに自分が発行した」と検証できる点が最大の特徴です。
JWTは単独の仕様ではなく姉妹仕様の上に成り立ちます。署名はJWS(RFC 7515)、暗号化はJWE(RFC 7516)、利用可能な暗号アルゴリズムの定義はJWA(RFC 7518)が担当します。普段「JWT」と呼んでいるトークンの大半は、正確にはJWS(署名付きJWT)です。
登録済みクレームと署名アルゴリズムの選び方
Payloadには標準で7つの登録済みクレーム(iss発行者 / sub主体 / aud対象者 / exp有効期限 / nbf有効開始 / iat発行時刻 / jti一意ID)が定義されています。とくにexpとaudの検証は必須です。Headerに何が入っているかはJWTデコーダーですぐ確認できます。
署名アルゴリズムは対称鍵(HMAC系)か非対称鍵(公開鍵系)かで運用が大きく変わります。2026年のグリーンフィールド(新規)実装では、鍵サイズが小さく高速なES256、または次世代標準のEdDSAが推奨されます。
| 項目 | HS256 | RS256 | ES256 | EdDSA |
|---|---|---|---|---|
| 鍵種別 | 対称(共有秘密鍵) | 非対称(RSA) | 非対称(ECDSA) | 非対称(Edwards曲線) |
| 鍵サイズ目安 | 256bit以上 | 2048〜4096bit | 256bit | 256bit |
| マイクロサービス | 不向き(鍵共有が必要) | 向く | 向く | 向く |
| 演算速度 | 最速 | 遅い | 速い | 最速クラス |
| 2026年の位置づけ | 限定用途 | 可 | 推奨 | 追加推奨 |
HMACの共有秘密鍵は人間が覚えるパスワードではなく、256bit以上のランダム値を使ってください。鍵生成にはパスワード生成、ハッシュの確認にはMD5/SHAハッシュ生成が役立ちます。
JWT vs セッション認証:使い分け
JWTはステートレス(サーバーに状態を持たない)なためスケールアウトが容易で、DBへアクセスできないエッジランタイム(Cloudflare WorkersやVercel Edge Functions)でも検証できます。反面、発行済みトークンの即時失効が構造的に困難という弱点があります。
| 観点 | JWT(ステートレス) | セッション(ステートフル) |
|---|---|---|
| サーバー状態 | 持たない | DB/Redisに保持 |
| スケールアウト | 容易 | ストア共有が必要 |
| 即時失効 | 困難(短TTLで緩和) | 容易 |
| マイクロサービス | 向く | 難しい |
2026年の最新脅威と対策
alg:none とアルゴリズム混同攻撃
最も古く、いまだに出続けているのが署名検証バイパスです。alg:noneは「署名なし」を受け付けてしまう設定ミス、アルゴリズム混同攻撃はHeaderのalgをRS256からHS256へ書き換え、公開鍵をHMAC秘密鍵として悪用する手口です。
// 悪い例: トークン側のalgを信頼してしまう
jwt.verify(token, key);
// 良い例: 許可するアルゴリズムをサーバー側で固定
jwt.verify(token, key, { algorithms: ['RS256'] });
クレーム検証の落とし穴
RFC 8725(JWT Best Current Practices、BCP 225)が現行の公式指針ですが、実装現場ではaudクレーム未検証が約65%にのぼると報告されています。同一の認証基盤が複数サービスにトークンを発行する構成では、他サービス向けトークンを受け付ける置換攻撃の入口になります。
有効期限とリフレッシュトークン戦略
即時失効が苦手なJWTでは、アクセストークンを短命にし、リフレッシュトークンで再発行する構成が事実上の標準です。リフレッシュトークンは使用のたびに再発行し旧トークンを無効化する「Rotation」を実装し、旧トークンの再利用を検知したら全セッションを失効させます。
| 種別 | 実務での推奨TTL | 参考規制値 |
|---|---|---|
| アクセストークン | 15〜60分 | PCI DSS: 15分(不活動) |
| リフレッシュ(絶対) | 7〜14日 | NIST中保証: 12時間以内 |
| リフレッシュ(アイドル) | 3〜7日 | — |
保存場所はXSS・CSRF双方を緩和するHttpOnly Cookie+SameSite=Strictが現時点のベストプラクティスです。kid(Key ID)をDB問い合わせやURL解決にそのまま使うとSQLi・SSRFの入口になるため、必ずホワイトリストと照合してください。
まとめ
JWTは「中身は読めるが改ざんはできない」トークンです。署名アルゴリズムをサーバー側で固定し、expとaudを必ず検証し、短いTTLとリフレッシュRotationを組み合わせる——この3点を押さえれば、2026年の主要な脅威の大半は防げます。発行されたトークンの中身はJWTデコーダーで確認しながら実装を進めましょう。