OAuthプロトコルについて少し調べてみると、OAuth 2規格)の明白な批判と、セキュリティが劣ると思われることを避けるのは難しいと思います。各プロトコルのフローの違いを概説しているため、stackoverflow suggests に関する回答
OAuth 1.0フロー
- クライアントアプリケーションは、Twitterなどのプロバイダーに登録します。
- Twitterは、そのアプリケーションに固有の「コンシューマシークレット」をクライアントに提供します。
- クライアントアプリsignsすべてOAuth Twitterへのリクエストwith独自の「コンシューマシークレット」
- OAuthリクエストのいずれかの形式が正しくない、データが欠落している、または不適切に署名されている場合、リクエストは拒否されます。
OAuth 2.0フロー
- クライアントアプリケーションは、Twitterなどのプロバイダーに登録します。
- Twitterは、そのアプリケーションに固有の「クライアントシークレット」をクライアントに提供します。
- クライアントアプリケーションincludes“ client secret”witheveryhttpヘッダーとして一般的にリクエストします。
- OAuthリクエストのいずれかの形式が正しくない、データが欠落している、または間違ったシークレットが含まれている場合、リクエストは拒否されます。
私の理解では、これは、「client_secret」がネットワーク経由で繰り返し送信されているため、クライアントが誤って「client_secret」をリークするリスクが高いことを示唆しています。もちろん、あるレベルでは、httpsはシークレットを送信するのに十分安全であると想定する必要があります。これは、登録プロセスで最初にGoogleがクライアントにシークレットを送信するためです。
それでも、両方の当事者がその価値をすでに知っていると思われる場合、「秘密」がネットワークを介して繰り返し送信されるべきであるのは奇妙に思われます。これは署名の典型的な使用例ではありませんか?
したがって、私の主な質問は、OAuth 2標準は、クライアントが秘密鍵を公開するリスクを高めるのですか?
陰謀のために触れるべきボーナストピック:
なぜGoogleのような大手企業はすべて、GoogleログインなどのサービスにOAuth 2を採用しているように見えるのですか?
リスクが高まっている場合、クライアントが自分自身とユーザーを保護するために何ができる/すべきですか?
「承認コード」の流れを見ていきましょう。その過程で、ポイントを明確にして対処します。
OAuth2.0標準にはいくつかの付与タイプがありますが、私が説明する最も一般的なものは認証コードフローです。
リソース(Googleカレンダーなど)へのアクセスを必要とするWebアプリケーションがあるとします。 Webアプリケーションは、ブラウザーを開いてgoogle.com承認ページにアクセスすることにより、Googleアカウントへのアクセスを要求します。許可をクリックすると、ブラウザーのURLでアプリにリダイレクトが送信され、authorization code
が渡されます。
アプリケーションのバックエンドはそのauthorization code
を受け取り、client_secret
およびその他のパラメーターとともに、認証サーバーにアクセストークンを要求します。これは1回発生します!
Webアプリがaccess token
を受信すると、アプリケーションは、有効である限り、リソースサーバーにAPIリクエストを送信できます。
あなたの問題に対処するため。 いいえ、より安全です、client_secret
はネットワーク経由で1回だけ送信されるため、毎回ではないです。 access token
を取得したら、それがネットワーク経由で送信される唯一の機密情報です。また、有限の寿命があります。これが、より安全な理由です。 client_secret
は機密のバックエンドサーバーによって送信され、ブラウザーに公開されないため、公開のリスクがさらに制限されます。