[解決済み】OAuth 2の暗黙のグラント承認タイプの目的は何ですか?
質問
私の盲点なのか何なのかわかりませんが、OAuth 2 仕様書を何度も読み返し、メーリングリストのアーカイブも熟読しましたが、なぜアクセストークンを取得するための Implicit Grant フローが開発されたのか、まだ良い説明を見つけられずにいます。Authorization Code Grant と比較すると、あまり説得力のない理由でクライアント認証を諦めているように見えます。スクリプト言語を使ってブラウザで実装されたクライアントに最適化されている(仕様書を引用)のはなぜでしょうか?
どちらのフローも出だしは同じです(ソースはこちら。 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-22 ):
- クライアントは、リソース所有者のユーザーエージェントを認可エンドポイントに誘導することで、フローを開始する。
- 認可サーバーは、(ユーザーエージェントを介して)リソース所有者を認証し、リソース所有者がクライアントのアクセス要求を許可するか拒否するかを確立します。
- リソース所有者がアクセスを許可したと仮定すると、認可サーバーは、先に(リクエスト内またはクライアント登録時に)提供されたリダイレクトURIを使用して、ユーザーエージェントをクライアントにリダイレクトします。
- リダイレクトURIに認証コードが含まれている(認証コードフロー)
- リダイレクトURIがURIフラグメントにアクセストークンを含む(暗黙のフロー)
ここでフローが分かれる。どちらの場合も、この時点でのリダイレクトURIは、クライアントがホストしている何らかのエンドポイントへのものです。
- 認可コードフローでは、ユーザーエージェントがURIの認可コードでエンドポイントをヒットすると、そのエンドポイントのコードは認可コードをクライアント認証情報と一緒にアクセストークンに交換し、必要に応じて使用することができます。例えば、そのアクセストークンをウェブページに書き込んで、ページ上のスクリプトがアクセスできるようにすることができます。
-
Implicitフローでは、このクライアント認証のステップを完全にスキップして、クライアントスクリプトを含むウェブページをロードするだけです。URL の断片を使ったかわいいトリックがあり、アクセストークンがあまり回されないようになっていますが、最終的な結果は基本的に同じです。
そこで質問ですが、クライアント認証のステップをスキップすることで何が得られるのでしょうか?
解決方法は?
以下は私の考えです。
認証コードとトークンを認可コードフローに含める目的は、トークンとクライアントシークレットがサーバー間で移動するため、リソース所有者に公開されることがないためです。
一方、暗黙の許可フローは、リソース所有者のブラウザで実行される、完全にjavascriptを使用して実装されたクライアントのためのものです。このフローを使用するために、サーバーサイドのコードは必要ありません。なぜなら、トークンやクライアントシークレットは、リソースオーナーと共有されるからです。なぜなら、トークンやクライアントシークレットは依然としてリソース所有者と共有されるからです。認証コードやクライアントシークレットを含めることは、実際のセキュリティを追加することなく、フローをより複雑にするだけです。
つまり、「何が得られたか」という問いに対する答えは、「シンプルであること」なのです。
関連
-
[解決済み] JWTとBearer Tokenの違いは何ですか?
-
[解決済み] OpenIDとOAuthの違いは何ですか?
-
[解決済み】OAuth2の「暗黙の」フローはとてもうまく機能しているのに、なぜ「認証コード」フローがあるのですか?
-
[解決済み】OAuth 2の暗黙のグラント承認タイプの目的は何ですか?
-
[解決済み】アクセストークンが失効するのはなぜですか?
-
[解決済み】OAuth 2は、Security Tokenを使用したリプレイ攻撃などからどのように保護するのでしょうか?
-
[解決済み】OAuth: ローカルのURLでテストする方法は?
-
[解決済み] OAuth Authorization CodeとImplicitワークフローの違いは何ですか?それぞれを使用するタイミングは?
-
[解決済み] リソースサーバーのOAuth 2.0アクセストークンを検証する方法とは?
-
[解決済み] JWT (Json Web Token) Audience "aud" vs Client_Id - 違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JWTとBearer Tokenの違いは何ですか?
-
[解決済み】OAuth2の「暗黙の」フローはとてもうまく機能しているのに、なぜ「認証コード」フローがあるのですか?
-
[解決済み】OAuth2.メリットとユースケース - なぜ?
-
[解決済み】OAuth 2の暗黙のグラント承認タイプの目的は何ですか?
-
[解決済み】OAuth 2.0 Bearer Tokenとは、具体的にどのようなものですか?
-
[解決済み】OAuth: ローカルのURLでテストする方法は?
-
[解決済み] OAuth Authorization CodeとImplicitワークフローの違いは何ですか?それぞれを使用するタイミングは?
-
[解決済み] リソースサーバーのOAuth 2.0アクセストークンを検証する方法とは?
-
[解決済み] OAuthでREST APIを保護しつつ、サードパーティのOAuthプロバイダによる認証を許可する(DotNetOpenAuthを使用する)
-
[解決済み] JWT (Json Web Token) Audience "aud" vs Client_Id - 違いは何ですか?