OpenID Connectのセッションに関する3つの仕様について

おはようございます、ritouです。

OpenID Summit Tokyo 2015までもうちょいですね。
プログラムを見てみましょう。
OpenID Summit Tokyo 2015
仕様の話もありそうですね。
今回はRFCXXXXとして発行された系ではなく、OpenID Foundationで策定が進んでいるOpenID Connect関連の仕様を紹介します。
ドラフト仕様も、いろいろあります。
Specifications | OpenID

このうち、今回は次の3個の仕様をとりあげます。

  • Session Management – (Optional) Defines how to manage OpenID Connect sessions, including postMessage-based logout functionality
  • HTTP-Based Logout – (Optional) Defines an HTTP-based logout mechanism that does not use an OP iframe on RP pages
  • Back-Channel Logout – (Optional) Defines a logout mechanism that uses back-channel communication between the OP and RPs being logged out

この説明だけ見ると、みんなlogout言ってます。
これらがどう違うのかを確認していきましょう。

OpenID Connect Session Management 1.0 - draft 25

Draft: OpenID Connect Session Management 1.0 - draft 28

ざっくり書くと、

  • RPはAuthN Response(OAuthでいうところのAuthZ Response)でセッションに紐づく、session_stateという値を受け取る
  • RPはiframe + postMessageをつかって、OPにsession_stateを送り、状態変更があったかどうかを問い合わせる
  • RP始動なログアウトのときは、OPのログアウト用URL(end_session_endpoint)にリダイレクトする

という感じです。

そういえばずっと前に記事を書いた気がします。

ritou.hatenablog.com

この時点から、そんなに変わってないです。

OpenID Connect HTTP-Based Logout 1.0 - draft 03

Spec obsoleted by openid-connect-frontchannel-1_0

(Session Managementに対して)RP上にiframeを必要としないHTTPベースのログアウトメカニズムを定義するとあります。

  • RPはログアウト用エンドポイントとセッションIDが必須かどうかをOPに登録、OPからiframeでそのエンドポイントを呼び出されたらログインセッションをクリアする
  • OPはログイン状態のRPを"visited site"Cookieのようなもので管理しておき、ログアウト時にiframeでそれぞれのログアウトURIを呼び出すことでRPに通知する
  • Session Management同様、RP始動なログアウトのときは、OPのログアウト用URLにリダイレクトする

ということで、Session Managementと並行して実装することもできます。
iframe対応をしなくてもOPの状態変更を知ることができるのは便利そうですね。

OpenID Connect Back-Channel Logout 1.0 - draft 01

Draft: OpenID Connect Back-Channel Logout 1.0 - draft 04

HTTP-Based Logoutとは異なり、OP-RP(複数の場合もあり)間のバックチャンネルコミュニケーションを用いてログアウトさせます。
Session Managementなんかはiframeで問い合わせるページをユーザが開いていなければチェックができないなどUser-Agentがアクティブである必要がありますが、バックチャンネルだと気にしなくていいです。
その代わり、CookieとかHTML Strageとかでさくっと実装できる感じではないので、サーバサイドでセッションを切るような作りにしなければとか、よくあるFirewall/NATの話とかがIntroductionに書いてあります。

定義されているものは

  • OPはログイン状態のRPを覚えておく必要がある(セッションに対して、ユーザーとRP一覧を紐づけておく)
  • ID Tokenに似ているLogout Tokenと呼ばれるものがバックチャンネルで送られる。Logout Tokenのsub/sidあたりを
  • 上記2つの仕様と同様、RP始動なログアウトのときは、OPのログアウト用URLにリダイレクトして、OPに行った後はそのあとバックチャンネルの処理になる

という感じです。詳細は長くなるので省略します。

気になるこまけぇこと

  • Session StateでAuthN Responseで受け取るユーザのログイン状態はsession_state
  • 他の2つのLogout関連の仕様では、セッション識別子はsidとしてID Tokenに含まれる

用途としてはたしかに別なので、こうなる気持ちはわかります。
が、一般的にユーザがログアウトしたらセッションIDを破棄すべきという話もあるので、session_stateとsidは統一できそうな気がします。
渡し方については...これはちょっと考えないといけませんね...

まとめ

  • OpenID Connectのセッション関連の仕様は3つある
  • Session Management : iframeを用いたRP->OPのログイン状態の問い合わせ方とRP始動ログアウト時のOPへのリダイレクト
  • HTTP-Based Logout : RPはOPからiframeで対象エンドポイントが呼び出されたらログアウト処理
  • Back-Channel Logout : RPはバックチャンネルでlogout tokenを受け取ったらログアウト処理

なんとなく違いがおわかりいただけたでしょうか。
このあたりは、時間を見つけてデモ環境を作りたいと思います。

ではまた!