web-dev-qa-db-ja.com

WebアプリケーションのOAuth2はどの程度安全ですか?

HTMLとJavaScriptを使用して開発された単一ページのクライアント側アプリケーションについて考えてみましょう。

この場合、暗黙的または認証コードフローを使用してAccess Tokesを要求している場合でも、トークン要求を行っている可能性のあるJavascriptでclientIDとSecretが引き続き見つかります。さらに、リクエストヘッダー(またはクエリパラメーター)でアクセストークンを渡しても、ネットワークトレースに表示されます。さらに、アクセストークンはブラウザのローカルに保存する必要があります。

  • WebベースのアプリケーションにOAuth2を使用することはどの程度安全ですか?
  • クライアント(ブラウザ)が危険にさらされている場合に、ユーザー情報を保護する方法。

ありがとう。

2
Biswajit

oAuth2プロトコルに関してこのクライアント側アプリケーションを処理する方法に関する最近のガイダンスがあります: https://tools.ietf.org/html/draft-ietf-oauth-security-topics-11

TL; DR:PKCEを使用したOAuth2認証コードを先頭に配置することをお勧めします。実装の詳細については、この非常に優れた記事のみをお勧めします: https://auth0.com/blog/oauth2-implicit-grant-and-spa/

1
bertrand

通常OAuthは、OAuthフレームワークのクライアントであるサードパーティにリソースへのアクセス権を付与するためにユーザーによって使用されます。したがって、暗黙的なフローではユーザーにはアクセストークンが表示される場合がありますが、最初からアクセスできるため、問題ありません。

ただし、より安全な方法は、暗黙のフローを使用しないことです。これにより、アクセストークンを取得するためにクライアント資格情報と組み合わせる必要があるアクセスコードが提供されます。ユーザーのブラウザでJavaScriptを使用してこれを行うことはありません。代わりに、サーバー側のソフトウェアでアクセスコードをキャプチャし、認証サーバーへのバックチャネル呼び出しを行ってアクセストークンを取得します。これで、ユーザーや他の誰かが実際にアクセスして取得するのに十分な情報を入手することはありません。

したがって、手順は次のようになります。

  1. ユーザーを認証サーバーにリダイレクトする
  2. ユーザーが認証し、同意を提供する
  3. ユーザーはアクセスコード(またはエラーコード)でクライアントにリダイレクトされます
  4. クライアントのウェブサーバーがアクセスコードを取得する
  5. クライアントバックエンドは、認証サーバーへのダイレクトバックチャネルコールを介して、アクセストークンのアクセスコードを交換します(ユーザーのブラウザーはここには含まれないことに注意してください)。
  6. これでクライアントは、アクセストークンと可能なリフレッシュトークンを使用して、ユーザーがアクセスを提供しているリソースにアクセスできます。

上記のステップでは、ユーザーの部分はステップ3の後に行われます。そのため、ユーザーのブラウザーに依存してJavaScriptの実行を完了する必要はありません。これにより、説明したようにセキュリティの問題が発生するだけでなく、ステップ4、5、6の実行が不確実になり、長い処理タスクに固執する必要がある場合は、ユーザーエクスペリエンスが低下する可能性があります。代わりに、ユーザーが関与する必要なく、すべてをバックエンドで実行できます。

OAuthを正しく実装すれば、非常に安全な方法で認証できます。

2
Brandhout

すべてがJavaScriptである場合、ブラウザーを信頼することができないため、パブリックエンドポイント(client_secretなし)を使用することをお勧めします。実際には、ユーザー名/パスワードをCookieと交換することと何の違いもありません。

1
mlbiam