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