1. ホーム
  2. authentication

OAuthベースとTokenベースの認証の違いは何ですか?

2023-10-12 07:59:58

質問

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フローとペアにする必要はない、ということです。

これはテキストの壁ですが、より深くあなたの質問に答えることを願っています =)