OAuthベースとTokenベースの認証の違いは何ですか?
質問
OAuthは基本的にトークンベースの認証仕様だと思っていたのですが、ほとんどのフレームワークが両者に違いがあるかのように振る舞っています。例えば、以下の図のように Jhipster はOAuthベースの認証とトークンベースの認証のどちらを使うか聞いてきます。
これらは同じものではありませんか?どちらも実装にトークンを含んでいるので、具体的にどのような違いがあるのでしょうか?
どのように解決するのですか?
これは良い質問です。トークンとOAuthの周りには多くの混乱があります。
まず最初に、あなたがOAuthについて言及するとき、おそらくは OAuth2 標準 . これは OAuth プロトコルの最新版であり、ほとんどの人が「OAuth」と言ったときに具体的に話しているものです。
OAuthプロトコルは、いくつかの異なるタイプの認証と認可をサポートしています(正確には4つ)。
第二に、OAuthプロトコルは、トークンを介してユーザーを認証することによって動作します。ここでの考え方はこうです。
ユーザーがリクエストごとに実際の認証情報をサーバーに送信するのではなく(Basic Authでは、ユーザーはリクエストごとにユーザー名/パスワードをサーバーに送信します)、OAuthではまずユーザーの認証情報を「トークン」に交換し、この「トークン」に基づいてユーザーを認証します。
OAuth の考え方は、ユーザーがネットワーク上で機密の認証情報を渡すことをより頻繁に要求しないようにすることで、悪いことが起こるのをより少なくするというものです。(これはとにかくアイデアです)。
OAuth 仕様はトークンの概念を中心に構築されていますが、トークンが何であるかは明記されていません。
最も「一般的な」意味では、トークンはユーザーを一意に識別する文字列にすぎません。それだけです。
人々はこのことに気づき、トークンを作成するための新しい標準を開発しました。 JSON ウェブ トークン標準 . この標準は基本的に、非常に特殊な方法でトークンを作成するための一連のルールを提供し、一般にトークンをより有用なものにします。
JWTを使用すると、次のようなことができます。
- トークンに暗号署名を行い、トークンがユーザーによって改ざんされていないことを確認できるようにする。
- トークンを暗号化し、プレーンテキストで内容を読み取ることができないようにします。
- 標準的な方法で、トークン文字列の内側にJSONデータを埋め込みます。
さて、ほとんどの場合、開発コミュニティのほぼ全員が、何らかの OAuth を使用している場合、使用しているトークンは JSON Web トークンであるべきだということに同意しています。
==========
OK! さて、裏話はこれくらいにして、質問にお答えしましょう。
上記の選択は、認証/承認のためのOAuth2仕様(これは非常に複雑です)を完全に有効にしたいかどうか、または単に基本的な「トークン認証」をしたいかどうかということです。
OAuthプロトコルは、標準に準拠した方法で認証するための複数の異なる方法を提供するため、ほとんどの認証システムに多くの複雑さを追加しています。
このため、多くのフレームワークがOAuth2パスワード付与フローの「ダムドダウン」バージョンを提供しており、これは本質的にシンプルな方法で、以下のようになります。
- ユーザーはユーザー名/パスワードを /login のような URL でサーバーに送信します。
- サーバーはそのユーザーのためにJWTトークンを生成します。
- サーバーはそのトークンをユーザーに返します。
- ユーザーはこのトークンを Cookie、モバイル デバイス、または可能な限り API サーバーに保存し、そこでリクエストを行うために使用します。
繰り返しますが、上記のフローはOAuthに準拠していませんが、トークンを使用する少しシンプルなバージョンです。
ここでの主なポイントは、トークン(JWT)は一般的に有用であり、OAuthフローとペアにする必要はない、ということです。
これはテキストの壁ですが、より深くあなたの質問に答えることを願っています =)
関連
-
[解決済み] OpenIDとOAuthの違いは何ですか?
-
[解決済み] JWT認証とOAuth認証の主な違いは何ですか?
-
[解決済み] JAX-RSとJerseyでRESTトークンベースの認証を実装する方法
-
[解決済み】OAuth v2には、なぜアクセス・トークンとリフレッシュ・トークンの両方があるのでしょうか?
-
[解決済み】OAuth 2の暗黙のグラント承認タイプの目的は何ですか?
-
[解決済み】OAuth 2は、Security Tokenを使用したリプレイ攻撃などからどのように保護するのでしょうか?
-
[解決済み] Socket.IO 認証
-
[解決済み] OAuthの認可と認証
-
[解決済み] SAMLとOAuthによる連携ログインの比較
-
[解決済み] アクセストークンとアクセストークンシークレット、コンシューマーキーとコンシューマーシークレットとは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] GitHub アカウントのユーザー名を変更する
-
[解決済み】node.jsのユーザー認証ライブラリは?
-
[解決済み] マイクロサービス認証戦略
-
[解決済み] ステートレス(=セッションレス)認証の場合、CSRFトークンは必要ですか?
-
[解決済み] OpenIDとOAuthの比較 [重複]について
-
[解決済み] OAuthの認可と認証
-
[解決済み] AWS CognitoのJWTをAPIバックエンドで確認する方法とは?
-
[解決済み] OpenIDプロバイダーのURLの一覧はどこにありますか?[クローズド]
-
外部ソース(ExcelやWordなど...)からリンクをクリックすると、Cookieが認識されないのはなぜですか?
-
node.jsでログイン認証を実装する方法