はじめに
シングルサインオン(SSO)に関する説明は割りと世の中に多いですが、SAMLを用いたシングルログアウト(SLO)の流れや挙動を確認したいときに参考にできそうなものは比較的少ないという印象があります。SAMLを用いたSLOの理解に時間がかかってしまったので備忘の意味も込めて自分なりに整理したいと思います(特にセッションを終了するタイミングに関して)。
一般的な流れをまとめたつもりですが、IdPやSPの実装の違いにより若干の仕様の差が生じることもあるのでご留意ください
SLOの流れ
SLOの流れについて、種類ごとに分けて説明します。
ここではユーザーがSSOを用いて複数のSPにログインしている状態からSLOを開始する場面を想定します。
またブラウザ上でリダイレクトなどの処理を繰り返すことでSLOを行う、「フロントチャネル方式」を想定します。
IdP-Initiated
ユーザーがIdP側で「ログアウト」ボタンを押して開始するようなSLOです。
処理の流れは下図のようになります。
IdPがSPにログアウト処理を要求 → SPでセッション終了 (→ 繰り返し ) → IdP側でセッションを終了
という流れになります。
ここでログアウトの要求のために「LogoutRequest」というSAMLが用いられ、SPがログアウトしたことをIdPに通知するために「LogoutResponse」というSAMLが用いられます。
IdPは全てのSPに対してLogoutRequestを発行し、それらからLogoutResponseを受け取った時点でセッションを終了させます。
SP-Initiated (全てのSPのセッションを終了)
ユーザーがSP側で「ログアウト」ボタンを押して開始するようなSLOです。
処理の流れは下図のようになります。
SP側でセッションを終了 → IdPにログアウト処理を要求 → 他SPでもセッション終了 → IdP側でセッションを終了
という流れになります。
ここで、SLOを開始するSPでは、IdPにログアウトを要求する時点でセッションが終了することに注意が必要です。
またIdP-Initiatedの場合と異なり、LogoutRequestはSLOを開始するSPとIdPから、LogoutResponseはIdPとその他のSPから送信されることになります。
SP-Initiated (SLO開始元のSPのセッションのみを終了)
先ほどと同様、ユーザーがSP側で「ログアウト」ボタンを押して開始するようなSLOですが、セッションを終了するSPはSLO開始元のSPに限られます。
IdPの種類によりセッションの終了の方式は異なるようで、OktaなどのIdPではこのように他のSPに影響を与えないようなSLOの処理が進行します。
処理の流れは下図のようになります。
SP側でセッションを終了 → IdPにログアウト処理を要求 → IdP側でセッションを終了
という流れになります。
終わりに
SSOやSLOについては一度きちんと処理の流れを確認することで、コードの理解がスムーズにできるようになりました。実装から機能を確認するケースもあると思いますが、粗い理解から始めて徐々にコードの理解に進んでいくということについても意識していきたいです。