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

OpenID Connect Back-Channel Logout 1.0

Back-Channel Logout は、サーバー間の直接通信(バックチャネル)を使用して RP にログアウトを通知する仕様です。


第1部: 概要編

Back-Channel Logout とは?

Back-Channel Logout は、OP が各 RP のバックチャネルエンドポイントに直接 HTTP リクエストを送信してログアウトを通知する仕組みです。

Back-Channel Logout のフロー:

┌────────────┐ ログアウト ┌────────────┐
│ ユーザー │ ───────────────► │ OP │
└────────────┘ │ │
└────────────┘

サーバー間直接通信 │
┌────────────────────────┼────────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ RP 1 │ │ RP 2 │ │ RP 3 │
│ Server │ │ Server │ │ Server │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└── Logout Token ────────┴────── Logout Token ────┘

Front-Channel との違い

観点Back-ChannelFront-Channel
通信経路サーバー間直接ブラウザ経由
信頼性高い低い
Cookie利用不可利用可能
ブラウザ依存なしあり
ITP/Cookie制限影響なし影響あり

Logout Token

OP は Logout Token(JWT)を RP に送信します。

{
"iss": "https://op.example.com",
"sub": "user-123",
"aud": "s6BhdRkqt3",
"iat": 1704067200,
"jti": "logout-token-12345",
"events": {
"http://schemas.openid.net/event/backchannel-logout": {}
},
"sid": "session-abc123"
}

第2部: 詳細編

Logout Token の構造

クレーム必須説明
issOP の識別子
subログアウトするユーザーの識別子
audRP のクライアント ID
iat発行時刻
jtiトークンの一意識別子(リプレイ防止)
eventsログアウトイベント
sidセッション ID

注意: sub または sid のどちらかは必須です。

events クレーム

{
"events": {
"http://schemas.openid.net/event/backchannel-logout": {}
}
}

この形式は固定で、ログアウトイベントを示します。

クライアント登録

{
"client_id": "s6BhdRkqt3",
"redirect_uris": ["https://rp.example.com/callback"],
"backchannel_logout_uri": "https://rp.example.com/logout/backchannel",
"backchannel_logout_session_required": true
}
メタデータ説明
backchannel_logout_uriRP のバックチャネルログアウトエンドポイント
backchannel_logout_session_requiredsid を Logout Token に含めるか

OP から RP へのリクエスト

POST /logout/backchannel HTTP/1.1
Host: rp.example.com
Content-Type: application/x-www-form-urlencoded

logout_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...

RP のレスポンス

ステータス説明
200成功(ボディは空でも可)
400Logout Token が無効
501Back-Channel Logout をサポートしていない

RP の検証手順

Logout Token の検証:

1. JWT の形式検証
└── 正しい JWT か

2. 署名の検証
└── OP の公開鍵で署名を検証

3. iss の検証
└── 期待される OP か

4. aud の検証
└── 自分(RP)が対象か

5. iat の検証
└── 発行時刻が妥当か(未来すぎない、古すぎない)

6. events クレームの検証
└── http://schemas.openid.net/event/backchannel-logout が存在

7. nonce がないことを確認
└── Logout Token には nonce を含めてはならない

8. jti の検証(リプレイ防止)
└── 過去に使用されていないか

9. sub または sid の確認
└── どちらかが存在すること

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

{
"issuer": "https://op.example.com",
"backchannel_logout_supported": true,
"backchannel_logout_session_supported": true
}
メタデータ説明
backchannel_logout_supportedBack-Channel Logout をサポート
backchannel_logout_session_supportedsid をサポート

セキュリティ考慮事項

項目推奨事項
HTTPSbackchannel_logout_uri は HTTPS 必須
署名検証Logout Token の署名を必ず検証
jti キャッシュリプレイ攻撃防止のため jti をキャッシュ
iat 検証古すぎる・未来すぎるトークンを拒否
タイムアウトOP 側でタイムアウトを設定
非同期処理多数の RP がある場合は非同期で処理

エラーハンドリング

OP 側のエラーハンドリング:

1. RP が応答しない
└── タイムアウト後、ログを記録して続行

2. RP が 4xx を返す
└── ログを記録して続行

3. RP が 5xx を返す
└── リトライを検討

4. ネットワークエラー
└── リトライを検討

RP 側のエラーハンドリング:

1. 無効な Logout Token
└── 400 を返す

2. 処理中にエラー
└── 500 を返す(OP がリトライ可能)

jti キャッシュの管理


参考リンク