メインコンテンツまでスキップ

RFC 7009 - OAuth 2.0 Token Revocation

RFC 7009 は、クライアントが不要になったアクセストークンやリフレッシュトークンを認可サーバーに対して無効化(失効)するための仕様です。


第1部: 概要編

Token Revocation とは?

Token Revocation は、クライアントがトークンを認可サーバーに返却し、無効化する仕組みです。

なぜ Revocation が必要か?

1. ログアウト時
ユーザーがログアウト → トークンを無効化
→ 盗まれても使えなくなる

2. アプリのアンインストール
アプリ削除 → トークンを無効化
→ 不要なアクセス権を削除

3. セキュリティインシデント
トークン漏洩の疑い → 即座に無効化
→ 被害を最小化

┌────────────┐ ┌────────────┐
│ Client │ │ AS │
│ │ │ │
│ Token を │ POST /revoke │ Token を │
│ 無効化 │ ─────────────────► │ 無効化 │
│ したい │ token=xxx │ │
│ │ ◄───────────────── │ │
│ │ 200 OK │ │
└────────────┘ └────────────┘

Introspection との違い

機能Token Revocation (RFC 7009)Token Introspection (RFC 7662)
目的トークンを無効化トークンの状態を確認
操作書き込み(状態変更)読み取り(状態確認)
主な利用者クライアントリソースサーバー
エンドポイント/revoke/introspect

ユースケース

シナリオ説明
ユーザーログアウトセッション終了時にトークンを無効化
権限変更ユーザーの権限が変わった時に古いトークンを無効化
デバイス紛失ユーザーがデバイスを紛失した場合に無効化
アプリ連携解除サードパーティアプリの連携を解除
セキュリティ対応不正アクセスの疑いがある場合に即座に無効化

第2部: 詳細編

Revocation エンドポイント

認可サーバーは /revoke エンドポイントを提供します。

リクエスト

POST /revoke HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

token=45ghiukldjahdnhzdauz
&token_type_hint=refresh_token

パラメータ

パラメータ必須説明
token無効化するトークン
token_type_hintトークンの種類のヒント

token_type_hint の値

説明
access_tokenアクセストークン
refresh_tokenリフレッシュトークン

注意: token_type_hint はあくまでヒントです。認可サーバーは実際のトークンの種類を確認する必要があります。

レスポンス

成功

HTTP/1.1 200 OK

Revocation は常に 200 OK を返します。これはセキュリティ上の理由です:

  • トークンが存在しない場合でも 200 を返す
  • トークンがすでに無効な場合でも 200 を返す
  • クライアントに不要な情報を与えない

エラー

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": "invalid_request",
"error_description": "Missing required parameter: token"
}
エラー説明
invalid_requestリクエストが不正
invalid_clientクライアント認証に失敗
unsupported_token_typeトークンタイプがサポートされていない

クライアント認証

Revocation エンドポイントへのリクエストには、クライアント認証が必要です。

client_secret_basic

POST /revoke HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

token=45ghiukldjahdnhzdauz

client_secret_post

POST /revoke HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

token=45ghiukldjahdnhzdauz
&client_id=s6BhdRkqt3
&client_secret=gX1fBat3bV

private_key_jwt

POST /revoke HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

token=45ghiukldjahdnhzdauz
&client_id=s6BhdRkqt3
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIs...

Revocation の動作

リフレッシュトークンの Revocation

リフレッシュトークンを無効化すると、関連するアクセストークンも無効化されます(SHOULD)。

リフレッシュトークン無効化の影響:

┌─────────────────────────────────────────┐
│ Refresh Token │
│ (revoke されたトークン) │
└─────────────────────────────────────────┘

│ 関連付け

┌─────────────────────────────────────────┐
│ Access Token(s) │
│ (これらも無効化される - SHOULD) │
└─────────────────────────────────────────┘

アクセストークンの Revocation

アクセストークンのみを無効化した場合、リフレッシュトークンは有効なままです(実装依存)。

アクセストークン無効化の影響:

┌─────────────────────────────────────────┐
│ Access Token │
│ (revoke されたトークン) │
└─────────────────────────────────────────┘

│ 再発行可能
┌─────────────────────────────────────────┐
│ Refresh Token │
│ (有効なまま - 実装依存) │
└─────────────────────────────────────────┘

ディスカバリーメタデータ

{
"issuer": "https://auth.example.com",
"revocation_endpoint": "https://auth.example.com/revoke",
"revocation_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post",
"private_key_jwt"
],
"revocation_endpoint_auth_signing_alg_values_supported": [
"RS256",
"PS256",
"ES256"
]
}

JWT アクセストークンの Revocation

JWT(自己完結型トークン)の場合、Revocation は追加の考慮が必要です。

JWT の Revocation の課題:

JWT は自己完結型
→ リソースサーバーは AS に問い合わせずに検証可能
→ Revocation を即座に反映できない

解決策:

1. 短い有効期限
exp を短く設定(5分など)
→ 自然に失効するまで待つ

2. Revocation リスト
無効化された JWT の jti をリストで管理
→ リソースサーバーがリストを確認

3. Introspection との併用
リソースサーバーが /introspect で確認
→ リアルタイムに状態を確認

4. Token Binding (DPoP/mTLS)
トークンを特定のクライアントにバインド
→ 盗まれても使用不可

Revocation リストの実装例

セキュリティ考慮事項

項目推奨事項
クライアント認証必須:不正な Revocation を防止
HTTPS必須:トークン漏洩を防止
レスポンス常に 200 OK:トークンの存在を推測させない
所有者検証クライアントが所有するトークンのみ無効化可能
関連トークンリフレッシュトークン無効化時はアクセストークンも無効化
ログRevocation イベントを監査ログに記録

参考リンク