OpenID Connectでは、RPでログアウトを実行したときにOPからもログアウトする方法(RP-Initiated Logout)が OpenID Connect Session Management 1.0 (draft 28) という仕様で定義されている。
この仕様を実装する際のベストプラクティスについて、RFCや各社の実装をもとに検討した。
ベストプラクティス
-
DOS攻撃(CSRF等でのend_session_endpointへのリクエスト送信)対策
- First PatryのSSO連携で利用する場合はid_token_hintの指定を必須とする。
- id_token_hint指定を強制できない場合は、ログアウト確認ダイアログを挟む。
-
post_logout_urlの検証
- id_token_hintの指定を必須とできる場合は、IDトークンのaudに指定されるクライアントに登録された値と検証するのが手軽。
- そうでない場合は、登録された全てのクライアントの登録値と検証するか、SSOでログイン中のクライアントに絞って検証することもできる。
RFCから読み取れること
- id_token_hintの指定はRECOMMENDED、post_logout_uriとstateの指定はOPTIONALとなっている。
- post_logout_uriは事前の登録が必要となっているが、検証ロジックの詳細は記載されていない。
- OPはユーザーにOPからもログアウトを希望するかを確認すべき(SHOULD)となっている。
- id_token_hintが指定されない場合は、DOS攻撃を防ぐためにユーザーにログアウトをするか確認するという方法が、Security Considerationで言及されている。
各社の実装仕様
- id_token_hintを指定すると、ログアウトを実行するか確認するダイアログ表示をスキップできる。
- post_logout_redirect_uri、stateはid_token_hintを指定した場合のみ利用可能となる。
- ガイドライン上はid_token_hint、session_idを指定しない場合もOPでのログアウトが実行されるとあるが、APIリファレンスではid_token_hintが必須となっている。(APIリファレンスの方が誤植?)
- post_logout_redirect_uriの検証は、SSOに参加しているクライアントのいずれかに登録された値である場合に正当となる。
- post_logout_redirect_uriを指定しない場合もOPでのログアウトは実行されるが、HTTP 400ステータスコードが返却される。
- id_token_hintは指定を推奨とされている。
- post_logout_redirect_uriはid_token_hintを指定した場合のみ利用可能となる。
- id_token_hintが必須指定となっている。
- GitHub Issueのコメントからは、id_token_hintからclient_id(aud)を取得してpost_logout_redirect_uriの検証を行っているようである。
- id_token_hintが必須指定となっている。
- post_logout_redirect_uriは任意指定であり、指定しない場合はOPのログイン画面にリダイレクトされる。
Azure Active Directory B2C(参考)
- id_token_hintは任意指定であるが、post_logout_redirect_uriを利用するためには指定が必要となる。(id_token_hintに紐づくクライアント設定からpost_redirect_uriの検証をしているようである。)
- 「ログアウト要求にIDトークンを必要としない」という設定をした場合には、id_token_hintの代わりにclient_idを指定できるようになる。