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

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 イベントを監査ログに記録

参考リンク​