tl; dr:これはすべてセキュリティ上の理由によるものです。
OAuth 2.0は、次の2つの基準を満たすことを望んでいました。
- すべての開発者がSSL対応サーバーを使用しているわけではなく、使用している場合は常に適切に構成されているとは限らないため、開発者が非HTTPSリダイレクトURIを使用できるようにする必要があります(非自己署名、信頼できるSSL証明書、同期サーバークロック...)。
- ハッカーがリクエストを傍受してアクセス/リフレッシュトークンを盗むことができるようにしたくありません。
以下の詳細:
暗黙的なフローは、セキュリティ上の理由から、ブラウザ環境でのみ可能です。
暗黙的なフローでは、アクセストークンは(URLパラメーターとしてではなく)ハッシュフラグメントとして直接渡されます。ハッシュフラグメントに関する重要なことの1つは、ハッシュフラグメントを含むリンクをたどると、ブラウザだけがハッシュフラグメントを認識することです。ブラウザは、ハッシュフラグメントを宛先Webページ(リダイレクトURI /クライアントのWebページ)に直接渡します。ハッシュフラグメントには、次のプロパティがあります。
- これらはHTTPリクエストの一部ではないため、サーバーで読み取ることができず、そのため、中間サーバー/ルーターで傍受することもできません(これは重要です)。
- これらはブラウザ(クライアント側)にのみ存在するため、ハッシュフラグメントを読み取る唯一の方法は、ページで実行されるJavaScriptを使用することです。
これにより、仲介サーバーによって傍受されるリスクなしに、アクセストークンをクライアントに直接渡すことができます。これには、クライアント側でのみ可能であるという警告があり、アクセストークンを使用するにはクライアント側でJavaScriptを実行する必要があります。
暗黙的なフローにはセキュリティの問題もあり、たとえば次のような回避策/回避策を追加する必要があります。
- 攻撃者は、別のWebサイト/アプリのユーザーからアクセストークンを取得し(たとえば、彼が他のWebサイト/アプリの所有者である場合)、そのトークンをWebサイトに記録し、それをWebサイトのURLパラメーターとして渡す可能性があります。したがって、Webサイトでユーザーになりすます。これを回避するには、アクセストークンに関連付けられているクライアントIDをチェックして(たとえば、Googleの場合はtokeninfoエンドポイントを使用できます)、トークンが独自のクライアントIDで(つまり、独自のアプリによって)発行されていることを確認するか、署名を確認する必要がありますIDTokenを使用している場合(ただし、クライアントシークレットが必要です)。
- 認証リクエストが独自のプロパティから発信されたものではない場合(セッション固定攻撃と呼ばれます)、これを回避するには、Webサイトからランダムなハッシュを生成し、それをCookieに保存して、同じハッシュを次の状態のURLパラメーターに渡します。 authリクエストでは、ユーザーが戻ってきたときに、Cookieを使用して状態パラメータを確認します。これは一致する必要があります。
承認コードフローでは、URLパラメータがHTTPリクエストの一部であるため、URLパラメータでアクセストークンを直接渡すことはできません。したがって、リクエストが通過する中間サーバー/ルーター(数百になる可能性があります)は、中間者攻撃と呼ばれる攻撃を許可する暗号化接続(HTTPS)を使用していない場合は、アクセストークンを読み取ります。
理論的には、アクセストークンをURLパラメータで直接渡すことは可能ですが、認証サーバーは、リダイレクトURIがTLS暗号化と「信頼できる」SSL証明書(通常は無料ではない認証局から)を使用するHTTPSを使用していることを確認する必要があります。宛先サーバーが正当であり、HTTP要求が完全に暗号化されていることを確認します。すべての開発者にSSL証明書を購入させ、ドメインでSSLを適切に構成させることは大きな苦痛であり、採用を大幅に遅らせることになります。これが、正当な受信者のみが交換できる(クライアントシークレットが必要なため)中間の1回限りの「認証コード」が提供され、暗号化されていないトランザクションでリクエストを傍受する潜在的なハッカーにはコードが役に立たない理由です。 (彼らはしないので
また、暗黙のフローの安全性が低く、リダイレクト時にドメインをスプーフィングするなどの潜在的な攻撃ベクトルがあると主張することもできます。たとえば、クライアントのWebサイトのIPアドレスを乗っ取るなどです。これが、暗黙的なフローがアクセストークン(使用時間が制限されていると想定される)のみを許可し、トークン(時間に制限がない)を更新しない理由の1つです。この問題を解決するには、可能な限りHTTPS対応サーバーでWebページをホストすることをお勧めします。