非常に簡単に言えば、誰かがOAuth 2とOAuth 1の違いを説明できますか?
OAuth 1は現在廃止されていますか?OAuth 2を実装する必要がありますか?OAuth 2の実装はあまり見かけません。ほとんどはまだOAuth 1を使用しているため、OAuth 2を使用する準備ができているとは思えません。それは...ですか?
非常に簡単に言えば、誰かがOAuth 2とOAuth 1の違いを説明できますか?
OAuth 1は現在廃止されていますか?OAuth 2を実装する必要がありますか?OAuth 2の実装はあまり見かけません。ほとんどはまだOAuth 1を使用しているため、OAuth 2を使用する準備ができているとは思えません。それは...ですか?
回答:
Eran Hammer-Lahavは、彼の記事Introducing OAuth 2.0の違いの大部分を説明する優れた仕事をしました。要約すると、主な違いは次のとおりです。
非ブラウザーベースのアプリケーションのサポートを改善するためのより多くのOAuthフロー。 これは、ブラウザベースではないクライアントアプリケーションからのOAuthに対する主な批判です。たとえば、OAuth 1.0では、デスクトップアプリケーションまたは携帯電話アプリケーションは、ユーザーにブラウザーを開いて目的のサービスにアクセスさせ、サービスで認証し、トークンをサービスからアプリケーションにコピーして戻す必要がありました。ここでの主な批判は、ユーザーエクスペリエンスに対するものです。OAuth 2.0では、アプリケーションがユーザーの認証を取得するための新しい方法があります。
OAuth 2.0では、クライアントアプリケーションに暗号化機能が必要なくなりました。 これは、アプリケーションがHMACハッシュトークンとリクエスト文字列を必要としなかった古いTwitter Auth APIに戻ります。OAuth 2.0では、アプリケーションはHTTPS経由で発行されたトークンのみを使用してリクエストを行うことができます。
OAuth 2.0署名はそれほど複雑ではありません。特別な解析、並べ替え、エンコードは不要です。
OAuth 2.0アクセストークンは「短命」です。通常、OAuth 1.0アクセストークンは1年以上保存できます(Twitterが期限切れにすることはありません)。OAuth 2.0には、更新トークンの概念があります。これらが何であるかは完全にはわかりませんが、更新トークンが「有効期間」である可能性がある一方で、アクセストークンは短命(つまり、セッションベース)である可能性があります。ユーザーにアプリケーションを再承認させるのではなく、更新トークンを使用して新しいアクセストークンを取得します。
最後に、OAuth 2.0は、OAuth要求の処理を担当するサーバーとユーザー認証を処理するサーバーの間で役割を明確に分離することを目的としています。 詳細については、前述の記事を参照してください。
ここで素晴らしい答えを見つけましたが、見逃していたのはいくつかの図でした。SpringFrameworkを使用する必要があったので、私はそれらの説明に出会いました。
次の図は非常に役立ちます。OAuth2とOAuth1の関係者間の通信の違いを示しています。
OAuth 2
とステップ4になりOAuth 1
ます。
これまでの説明はすべて非常に詳細で複雑なIMOです。簡単に言うと、OAuth 2はセキュリティをHTTPSプロトコルに委任します。OAuth 1はこれを必要としなかったため、さまざまな攻撃に対処するための代替方法がありました。これらの方法では、複雑で実装が困難な特定のセキュリティプロトコルをアプリケーションで実行する必要がありました。したがって、アプリケーション開発者がHTTPSについて心配する必要がないように、セキュリティをHTTPSに依存するほうが簡単です。
他の質問については、答えは異なります。HTTPSの使用を必要としないサービス、OAuth 2より前に開発されたサービス、またはOAuth 2の使用を妨げるその他の要件があるサービスもあります。さらに、OAuth 2プロトコル自体については多くの議論があります。ご覧のように、Facebook、Google、およびその他いくつかのプロトコルには、それぞれ異なるバージョンのプロトコルが実装されています。したがって、異なるプラットフォーム間でより均一になるため、一部の人々はOAuth 1を使用しています。最近、OAuth 2プロトコルが完成しましたが、どのように採用されるかはまだわかりません。
Oauth 2の使用に対する重大なセキュリティの引数があることに注意してください。
これらはOauth 2の筆頭著者によるものです。
キーポイント:
Oauth 1はトランスポートに依存しませんが、Oauth 2はSSLに加えてセキュリティを提供しません。
ある意味では、SSLは安全ではありません。サーバーは接続を検証せず、一般的なクライアントライブラリを使用すると、失敗を簡単に無視できます。
SSL / TLSの問題は、クライアント側で証明書を検証できない場合でも、接続が機能することです。エラーを無視して成功する場合はいつでも、開発者はそれを実行します。サーバーには証明書の検証を強制する方法がありません。それが可能であったとしても、攻撃者は確かにそうしません。
OAuth 1.0で実行するのがはるかに難しい、セキュリティのすべてを手探りで削除できます。
2番目によくある潜在的な問題はタイプミスです。1つの文字(「https」の「s」)を省略するとトークンのセキュリティ全体が無効になるので、適切な設計だと思いますか?または、リクエストを(有効で検証済みのSSL / TLS接続を介して)間違った宛先(たとえば、「http://gacebook.com」?コマンドラインからOAuthベアラートークンを使用できることは、明らかにユースケースベアラートークンの支持者が推進していたことを覚えておいてください。
OAuth 1.0プロトコル(RFC 5849)のセキュリティは、クライアントアプリケーションに埋め込まれた秘密鍵を機密に保つことができるという前提に依存しています。ただし、この仮定は単純です。
OAuth 2.0(RFC 6749)では、このような単純なクライアントアプリケーションは機密クライアントと呼ばれます。一方、秘密鍵の秘匿が困難な環境にあるクライアントアプリケーションをパブリッククライアントと呼びます。2.1を参照してください。詳細については、クライアントタイプ。
その意味で、OAuth 1.0は機密クライアント専用の仕様です。
「OAuth 2.0 and the Road to Hell」は、OAuth 2.0は安全性が低いと述べていますが、OAuth 1.0クライアントとOAuth 2.0機密クライアントのセキュリティレベルには実際的な違いはありません。OAuth 1.0は署名を計算する必要がありますが、クライアント側の秘密鍵を機密に保つことができることがすでに保証されている場合、セキュリティは強化されません。シグネチャの計算は、実用的なセキュリティを強化することなく、面倒な計算です。私は、TLSを介してサーバとちょうどプレゼントにOAuth 2.0のクライアント接続されていることを簡潔に比べて、平均値client_id
とはclient_secret
、面倒な計算は、セキュリティの面で優れていると言うことはできません。
さらに、RFC 5849(OAuth 1.0)はオープンリダイレクタについて何も言及していませんが、RFC 6749(OAuth 2.0)は言及しています。つまりoauth_callback
、OAuth 1.0のパラメーターがセキュリティホールになる可能性があります。
したがって、OAuth 1.0はOAuth 2.0よりも安全だとは思いません。
OAuth 1.0のセキュリティは、署名の計算に依存しています。署名は、秘密鍵を使用して計算されます。秘密鍵は、HMAC-SHA1の共有鍵(RFC 5849、3.4.2)またはRSA-SHA1の秘密鍵(RFC 5849、3.4.3)です。秘密鍵を知っている人なら誰でも署名を計算できます。したがって、秘密鍵が危険にさらされている場合、署名計算の複雑さは、複雑であっても意味がありません。
つまり、OAuth 1.0のセキュリティは、署名の計算の複雑さとロジックに依存せず、秘密鍵の機密性にのみ依存します。つまり、OAuth 1.0のセキュリティに必要なのは、秘密鍵を秘密にしておくことができるという条件だけです。これは極端に聞こえるかもしれませんが、条件がすでに満たされている場合、署名の計算によってセキュリティが強化されることはありません。
同様に、OAuth 2.0 機密クライアントも同じ条件に依存しています。条件がすでに満たされている場合、TLSを使用して安全な接続を作成し、安全な接続を介して認証サーバーに送信client_id
しclient_secret
て問題はありますか?OAuth 1.0とOAuth 2.0の機密クライアントの両方が同じ条件に依存している場合、セキュリティレベルに大きな違いはありますか?
OAuth 1.0がOAuth 2.0のせいにする理由はありません。事実は、(1)OAuth 1.0は機密クライアントのみの仕様であり、(2)OAuth 2.0は機密クライアントとサポートされるパブリッククライアントのプロトコルも簡素化したということです。よく知られているかどうかに関係なく、スマートフォンアプリケーションはパブリッククライアント(RFC 6749、9)として分類され、OAuth 2.0の恩恵を受けます。
OAuth 2は明らかに時間の浪費です(これに深く関与している人の口から):
https://hueniverse.com/oauth-2-0-and-the-road-to-hell-8eec45921529
彼は言う(簡潔にするために編集され、強調のために太字にされている):
... OAuth 2.0標準に関連付けることができなくなりました。私は筆頭著者および編集者としての役割を辞任し、仕様から自分の名前を撤回し、ワーキンググループを去りました。文書から自分の名前を削除するのに3年間も苦労しましたが、20を超えるドラフトは簡単ではありませんでした。私が5年以上にわたって導いてきた努力から先に進むことを決心するのは苦痛でした。
...最後に、OAuth 2.0は悪いプロトコルであるという結論に達しました。WS- *悪い。私はもうそれに関連付けられたくないほど十分に悪いです。... OAuth 1.0と比較すると、2.0仕様はより複雑で、相互運用性が低く、有用性が低く、不完全であり、最も重要なこととして、安全性が低くなっています。
明確に言うと、Webセキュリティを深く理解している開発者の手元にあるOAuth 2.0は、安全な実装になります。ただし、ほとんどの開発者の手に-過去2年間の経験と同様に-2.0は安全でない実装を生成する可能性があります。
高度な説明が必要な場合は、両方の仕様を読む必要があります。
フローの違いについて明確な説明が必要な場合、これが役立ちます。
OAuth 1.0フロー
OAuth 2.0フロー
OAuth 2.0は、以下の方法で物事を簡素化することを約束します。
セキュリティの観点から、私はOAuth 1を選びます。OAuth2.0と地獄への道を参照してください
そのリンクからの引用:「現在1.0を正常に使用している場合、2.0は無視してください。1.0を超える本当の価値はありません(クライアント開発者が1.0の署名をすでに理解していると思います)。
この分野に不慣れで、自分をセキュリティの専門家だと考えている場合は、その機能を注意深く調べてから2.0を使用してください。エキスパートでない場合は、1.0を使用するか、信頼できるプロバイダーの2.0実装をコピーして正しく実装します(FacebookのAPIドキュメントが最初の出発点として最適です)。大規模には2.0の方が適していますが、大規模な運用を行っている場合は、サイトにセキュリティの専門家がいて、すべてを理解してくれるでしょう。」