晴耕雨読

working in the fields on fine days and reading books on rainy days

認証認可におけるクレデンシャルの共有

認証の方法としてよくパターンは、ユーザがアプリに「ユーザ名」と「パスワード」を入力し、アプリがサービス(Web APIなど)にユーザ名とパスワードをそのまま送信するパターンです。 このパターンは以下のメリットとデメリットが存在します。

  • メリット :
    • 実装者視点でアプリとサービスの連携が簡単になる。
  • デメリット :
    • 利用者視点でアプリにパスワードを共有するため、信頼できるアプリか検証する必要がある。

例えばLDAP認証をする際、アプリはユーザが入力した「ユーザ名」と「パスワード」をそのままLDAPサーバに送信することで、有効なクレデンシャルかどうかは判断します。 これはある意味、中間者攻撃(Man-In-The-Middle Attack; MITM)になるのですが、多くのユーザはこのアプリ(中間者)が悪意のないものとして、アプリとクレデンシャルを共有しています。 しかし、もしアプリが悪意のあるもので、入力した「パスワード」を外部の別サーバに送信していたら大問題です。 また、サービスは認証が必要なアクセスが、正規ユーザからなのかアプリからなのか区別できない問題もあります。

アプリとサービスで情報を共有するためだけの「特別なパスワード」を発行して使う方法もありますが、クレデンシャルの生成・配布・管理に手間がかかるため、この方法は広く受け入れられていません。

この問題を解決するためのプロトコルがOAuthです。 OAuthは、制限されたクレデンシャルを発行し、それをサービス利用時に使えるような仕組みを提供するプロトコルです。