OAuth 2.0 Token Introspection (RFC 7662) とローカルJWT検証の比較
OAuth2 Security Backend Architecture
結論
即時失効が必要な高リスク処理には Introspection、高トラフィック処理には ローカルJWT検証 です。
# RFC 7662 公式仕様:Token Introspection リクエストとアクティブ応答
POST /introspect HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
token=mF_9.B5f-4.1JqM&token_type_hint=access_token
# 認可サーバーからのリアルタイム応答
HTTP/1.1 200 OK
Content-Type: application/json
{
"active": true,
"scope": "read write",
"client_id": "s6BhdRkqt3",
"sub": "248289761001",
"exp": 1690000000
}
RFC 7662公式仕様:2つのトークン検証アプローチ比較
| 評価軸 | Token Introspection (RFC 7662) | ローカル JWT 署名検証 |
|---|---|---|
| 失効検知 (Revocation) | ◯ 認可サーバーへ直接確認し「即時検知」 | ❌ exp (有効期限) が切れるまで検知不可 |
| APIパフォーマンス | ❌ 毎回認可サーバーへのネットワークHTTP通信が発生 | ◯ メモリ内検証で超高速 (0ms) |
| 認可サーバーの負荷 | ❌ トラフィック増大に伴い認可サーバーがボトルネック化 | ◯ 極小 (初回JWKS取得のみ) |
| トークン形式 | 不透明 (Opaque) トークンでも使用可能 | 構造化された JWT (JSON) が必須 |
実際に起こる障害:ローカルJWT検証による「アクセス剥奪タイムラグ」事故
セキュリティ運用で最も問題となるのが、ローカル JWT 検証のみで構成されたWebシステムです。
管理者ユーザーが対象のアカウントを「凍結」または「権限剥奪」したり、パスワード変更による「全端末ログアウト」を実行しても、ローカル検証を行っている各APIサーバーは JWT 内の exp(有効期限:例 あと2時間)が切れるまで権限剥奪を検知できず、攻撃者に不正アクセスを許し続ける障害 が発生します。
ハイブリッド設計手順
- 管理者操作、決済、パスワード変更、個人情報書き換えなどの高リスクエンドポイントでは
Token Introspection (RFC 7662)を実行し、active: trueであることを同調確認する - タイムラグが数分間許容される一般的なデータ参照・閲覧系エンドポイントでは
ローカル JWT 署名検証を適用し、インフラ負荷を下げて応答速度を高める - ローカル検証を使用する場合は、アクセストークンの有効期限(
exp)を 5分〜15分 などの短い時間に設定し、リフレッシュトークン運用と組み合わせる