ブログ  前の記事  次の記事  2008-01-06 

たけまる / OpenID は「ログアウトしない」のかなぁ


2008-01-06

_ OpenID は「ログアウトしない」のかなぁ [openid]

工藤さん,返答エントリありがとうございました.
「ユーザが OpenID を使って RP にログイン → RP だけからログアウト → OpenID を使って RP に再ログイン」 のときに, 同一の IdP にある複数の OpenID を使いわけるというユースケース - tkudo's weblog about identity management

このエントリを読んで,調べて考えてみたんですが,極端に言えば
「OpenID はログアウトしない (ブラウザ終了時を除く)」と考えるべきな
のだろうと思うようになりました.そのような用途に使っていくのだろう
と.

以下,OpenID のログアウト処理がいい加減である理由を考えています.
また,工藤さんから提案いただいた解決策についても検討します.

# 内容が込み入っているため,論文調になっていて読みにくいかもしれません

■ OpenID はログアウトしない

まず,OpenID の基本的な特徴ですが,OP (IdP) と RP (Consumer) で別々
にログイン状態 (セッション状態) を保持します.このため,↓で指摘さ
れているように「OP (RP) からログアウトしたけど,RP (OP) でセッショ
ンが残っている」というようなことが起こります.
OpenID におけるセッション管理 - tkudo's weblog about identity management

OP と RP の両方のセッション状態をユーザに意識させるのは無理です.
OpenID のメーリングリストでは,OP に残されたセッション状態を利用し
て,ユーザを悪意のある RP にログインさせてしまう危険性について議論
されていたようです.
Users on Public Computers

シングルログアウトを完全に実現できるのでしょうか.そのためには,OP
と RP の間で同期をとる必要があります.RP が複数存在しうることを考え
ると,これは現実的な解決策とは言えないでしょう.メーリングリストで
も,「そのような複雑なことはしたくない」という意見が出ていたようで
す.
Issues with single sign out

ところで,そもそもユーザはログアウトするのでしょうか.僕は,金融機
関のサイトを除いてログアウトすることはありません.工藤さんのブログ
のコメントにも,
今、現在、実際のサイトにて、どれだけの割合の人が、「ログアウト」を
しているだろうか。
とあります.

OpenID は,あらゆる状況に対して完璧であることを目指すより,95% くら
いの状況で適切に動作することを目的としているように思います.その結
果,軽量で広く使えるプロトコルに仕上げたいのではないでしょうか.問
題となる状況に対しては,SAML を使うなり,シングルサインオンを諦める
なりするのだと思います.

工藤さんのブログには,シングルログアウト問題に対する 6 つの解決策が
提案されていました.
OpenID におけるセッション管理 - tkudo's weblog about identity management
1. OpenID の仕様上, これは期待どおりの挙動なので, なにも対応しない
2. はてなスター側でログイン・セッションを管理するけど, セッション
   の有効時間を比較的短くする (30 秒とか, 5 分とか)
3. OpenID でログインしている場合には 「xxx という OpenID でログイ
  ンしています. はてなスターからのログアウトはこちら」 と表示する
4. はてなスター側ではログイン・セッションを管理せずに, OpenID URL
   の妥当性を毎回確認する (かなり使い勝手が悪くなりそう)
5. OpenID プロバイダでログアウトしたときに, 同時に使っていた
   Relying Party でもログアウトするような, ブラウザのアドオンを開
   発する
6. OpenID におけるシングル・ログアウトの仕様を提案する

上の検討結果をふまえて,もう一つ追加したいと思います.
- ユーザがログアウトしたとき,OP/RP は「他のサイトにセッションが残っ
  ている可能性」を表示する
OpenID 仕様には手を加えずに,運用でなんとかしようということです.
このあたりが,OpenID としての落としどころなのかもしれません.

■ それはそれとして,OpenID を切り替えるベストな方法

シングルログアウトはいらないかもしれませんが,それはそれとして,複
数の OpenID を切り替える方法について考えてみます.工藤さんが2つの方
法を提案してくださったので,それらを検討してみます.

1. OP が openid.mode=cancel を返す

工藤さんの追試を再現してみようしたのですが,OpenID.sun.com で↓の
ように表示されてしまい,できませんでした…orz (Firefox, Safari).
Forbidden
Your client is not allowed to access the requested object.

というわけで,実証はしていないのですが,この方法だと次のような問題
点があると考えています.

ユーザが変更後の OpenID を入力すると,RP から OP に redirect された
後に,OP が openid.mode=cancel を返します.このとき,RP は「認証が
キャンセルされました」のような文字列を表示するでしょう.

ところが,これはユーザが OP で認証をキャンセルしたときに表示される
べき文字列です (たとえば,ユーザが OP の「キャンセル」ボタンをクリッ
クしたとき).キャンセルしてないのにこの文字列が表示されると,ユーザ
は混乱するかもしれません.

2. RP が PAPE max_auth_age=0 を設定する

この方法では,RP が OP にリクエストするときに,PAPE max_auth_age=0
を設定します.すると,(おそらく) OP で強制ログアウトすることになり,
めでたく変更後の OpenID URL でログインすることができます.ここまで
は問題ありません.

ここで,max_auth_age の意味について考えてみます.RP が max_auth_age=3600
のように設定すると,「1時間以内に認証していなければ,OP は再認証し
ろ」という意味になるようです.逆に言えば,1時間以内に認証済みであ
れば,OP の再認証なしに (ユーザによるユーザ名とパスワードの入力な
しに) RP にログインできるようです.

話を戻します.ユーザの使い勝手を上げるためには,max_auth_age を大き
めに設定して,ユーザ名とパスワードを入力する手間を省きたいところで
す.つまり,OpenID を切り替えるときに max_auth_age=0 とするのは仕方
ないけど,それ以外の時には max_auth_age >> 0 にしたいということです.

そのためには,RP は,あるログイン処理が「OpenID を切り替えるためな
のか,単なるログインなのか」を検知しないといけないように思います.
RP は,ブラウザが直前のログインに使った OpenID を調べて (Cookie を
使うなどして),max_auth_age の値を変更しなければなりません.

ブラウザの状態管理が他の用途にも役立つのであればいいのですが,
OpenID の切り替えに対応するためだけでは,割に合わないかもしれないで
す.

■ ブラウザのサポートは?

OpenID は既存のブラウザから使えるように設計されています.もちろん,
これは重要なことです.

それとは別に,ブラウザを拡張していく可能性を追求していかないと使え
るレベルにならないかもしれません (追求されているのかもしれませんが).
たとえば,シングルログアウトのサポートはもちろん,OpenID ログイン
画面になったら半自動的にログインしたり,ログインしているユーザ名を
常に表示したりすることは役に立ちそうです.

なにはともあれ,勉強不足すぎて議論できるレベルに達してないことがよ
く分かりました..

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→