前回の勉強会で議論になったので,ここでも話題提起.

iOS本体のSafariでOAuthの認証ページは開くべきか?

ネイティブのアプリケーションで,OAuthを使ってWebサービスを使うとき,ユーザにユーザ名とパスワードを入力してもらい,そのサービスにログインし,ユーザに,そのアプリケーションに対して,ユーザが持つコンテンツへのアクセス権を委譲してもらう必要がある. このとき,サービスにログインするWebの画面は,Safari.appなどの第三者が介在できないWebビューで行うべきだというのが,私の考えだ. なぜなら,そうすれば,ネイティブのアプリケーションの作者は,少なくとも体面上,もっともユーザが入力するユーザ名とパスワードにアクセスすることがむずかしくなると考えるからだ.

OAuthの基本コンセプト

そもそもOAuth2のコンセプトは,Webサービスへのアクセスを,第三者が作成したアプリケーションや別のWebアプリケーションに委譲するときに,直接ユーザ名とパスワードのセットをその第三者に教えないようにすることにある(違う?). OAuthの仕組みでは,ユーザは第三者に特定の権限だけを委譲したり,Webサービス上で第三者が委譲されたアクセス権を停止したりすることができる. 事実上,従来通りにユーザ名とパスワードを第三者に教えてしまうと,第三者が悪意を持った場合やセキュリティに問題が発露したときに,その行動を掣肘する手立てがない.

OAuthの流れは,

  1. ユーザがOAuthによる権限委譲を開始する
  2. アプリケーションが自分の識別するためのIDを指定して,OAuthの認証ページをユーザに提示する
  3. ユーザは,認証ページでユーザ名とパスワードを入力する
  4. 認証ページが委譲する権限内容をユーザに提示し,承認の可否を問う
  5. 承認されると,Webサービス側がリダイレクトURLを発行し,アプリケーション側にアクセス用のtokenを含んだ情報を返す.
  6. アプリケーションは,受け取ったtokenを使ってWebサービスにアクセスする

のはず・・・・.

ユーザは,このtokenを停止することでアプリケーションに委譲した権限を任意のタイミングで実行することができる.

安全な答えは実際ない.

アプリケーションが自分の識別するためのIDを指定して,OAuthの認証ページをユーザに提示する

このとき,私はiOSならばSafari.appだと考える. ユーザの観点からは,OAuthを使う限り,ユーザ名とパスワードを第三者のアプリケーションに見せたくないというのが大前提なのだから,アプリケーションに組み込まれたWebViewを使うのは,WebViewにJS等で自由にアクセスできる以上,論外だろう. Safari.appを使えば,基本的には第三者はSafari上でユーザが行う入力作業に手出しできないはずなので,入力された情報の,アプリケーションに対する秘匿性は確保出来るはずだ.

一方,アプリケーションがそのような愚行に走る可能性があると思うなら,そもそも,そんな怪しいアプリケーションを使わないという見方もできるので考え過ぎとも言える. また,外部のSafari.appを使ったから安全とも言い切れない. これまた,アプリケーションが悪意をもってtoken委譲ページの偽ページにSafari上で誘導し,ユーザがURLやユーザ名とパスワードを入力すればマルっと盗まれてしまう. AppleのSSLポリシーが機能していれば,幼稚なオレオレ証明書を使った中間者攻撃も防ぐことができるが,安全とは言い切れない.

というわけで,セキュリティの脅威はいたるところに存在するわけで,どれを使えば安全というものはないのだが,もっともマシということでSafari.appを私は選択する.

まとめとその他の話題

アプリケーションが自分の識別するためのIDを指定して,OAuthの認証ページをユーザに提示する

この処理には.他にも深刻な課題がある. アプリケーションの識別のための情報の秘匿だ. この問題は,アプリケーションのデベロッパに対するセキュリティ問題なので,上記課題とは少々異なる. この識別情報の秘匿は散々議論されているが,インストールベースのアプリケーションを使う限り,それを防ぐ手立ては事実上ない(と思う). インストールされたバイナリは,どうやってもクラックされてしまうので,バイナリにアクセスキーを含めた瞬間に悪意のある第三者がそのインストールしたアプリケーションになりすまして,ユーザに権限委譲を求めることはできてしまう[1],[2].facebookは,バイナリにアクセスキーを含めることを明示的に禁じている. このようなサービス提供者はfacebookのようにその他の権限委譲の仕組みを用意する必要があるだろうし,インストールベースのアプリケーションのアクセスキーに関する問題にどこか引っかかるデベロッパはOAuthを使うなということなるのかもしれない. これもまた,上記の問題と同様に難しい課題だ・・・・.

結論が出ないままになったけど,セキュリティは常々意識しないといけない・・・・ということなのだろう.