web-dev-qa-db-ja.com

トークンベース認証のJWTとCookie

"JWT vs Cookie"に関するいくつかの投稿を読みましたが、混乱させられただけです...

  1. 私はいくつかの説明が欲しい、「トークンベースの認証vsクッキー」について話しているとき、cookiesここでは単にを参照しますセッションCookie?私の理解では、cookieは媒体のようなであり、トークンベースの認証を実装するために使用できます(クライアント側でログインしているユーザーを識別できるものを保存します)またはセッションベースの認証(サーバー側のセッション情報と一致する定数をクライアント側に保存します)

  2. なぜJSON Webトークンが必要なのですか?標準のCookieを使用してトークンベースの認証を実装していました(セッションIDを使用せず、サーバーメモリまたはファイルストレージを使用しません):Set-Cookie: user=innocent; preferred-color=Azure、そして私が観察した唯一の違いはJWT ペイロードと署名 ...の両方が含まれていますが、HTTPヘッダーの署名済みまたはプレーンテキスト Cookieを選択できます。私の意見では、署名されたクッキー(cookie:'time=s%3A1464743488946.WvSJxbCspOG3aiGi4zCMMR9yBdvS%2B6Ob2f3OG6%2FYCJM')はよりスペース効率が高く、唯一の欠点はクライアントがトークンを読み取れないこと、サーバーのみが読み取れることです...しかし、ちょうどclaimはJWTのオプションであり、トークンが意味を持つ必要はありません

63
watashiSHUN

ベアラートークンとCookieの最大の違いは、ブラウザーがCookieを自動的に送信することです HTTPリクエストに明示的に追加する必要があります。

この機能により、Cookieは、ユーザーがログインしてリンクを使用してページ間を移動するWebサイトを保護するための優れた方法になります。

クッキーを自動的に送信するブラウザには大きなマイナス面もあります。これは CSRF 攻撃です。 CSRF攻撃では、悪意のあるWebサイトは、ブラウザーがそのドメインへの要求に認証Cookieを自動的に添付し、ブラウザーをだまして要求を実行するという事実を利用します。

https://www.example.com のWebサイトで、認証されたユーザーがPOST- https:// www。 example.com/changepassword ユーザー名や古いパスワードを投稿する必要はありません。

そのアドレスにPOSTをトリガーするブラウザーのページを読み込む悪意のあるWebサイトにアクセスしたときにまだそのWebサイトにログインしている場合、ブラウザーは認証Cookieを忠実に添付し、攻撃者が変更できるようにしますあなたのパスワード。

CookieはWebサービスを保護するためにも使用できますが、最近ではベアラートークンが最も頻繁に使用されます。 Cookieを使用してWebサービスを保護する場合、そのサービスは same-Origin policy が別のドメインにCookieを送信しないため、認証Cookieが設定されているドメインに存在する必要があります。

また、Cookieを使用すると、ブラウザベース以外のアプリケーション(モバイルアプリからタブレットアプリなど)がAPIを使用するのが難しくなります。

97
MvdD

概要

求めているのは、クライアントからサーバーにJSON Web Token(JWT)を送信するためのCookieとベアラートークンの違いです。

Cookieとベアラートークンの両方がデータを送信します。

違いの1つは、Cookieは任意のデータの送信と保存に使用されるのに対して、ベアラートークンは認証データの送信に特に使用されることです。

そのデータは、多くの場合JWTとしてエンコードされます。

Cookie

Cookieは名前と値のペアであり、Webブラウザーに保存され、有効期限と関連付けられたドメインがあります。

JavaScriptまたはHTTP応答ヘッダーを使用して、CookieをWebブラウザーに保存します。

document.cookie = 'my_cookie_name=my_cookie_value'   // JavaScript
Set-Cookie: my_cookie_name=my_cookie_value           // HTTP Response Header

Webブラウザーは、CookieのドメインへのすべてのリクエストでCookieを自動的に送信します。

GET http://www.bigfont.ca
Cookie: my_cookie_name=my_cookie_value               // HTTP Request Header

ベアラートークン

ベアラートークンは、HTTP要求のAuthorizationヘッダーに入る値です。自動的にどこにも保存されず、有効期限も関連付けられたドメインもありません。それはただの価値です。クライアントにその値を手動で保存し、その値をHTTP Authorizationヘッダーに手動で追加します。

GET http://www.bigfont.ca
Authorization: Bearer my_bearer_token_value          // HTTP Request Header

JWT およびトークンベースの認証

OpenID、OAuth、OpenID Connectなどのトークンベースの認証を行うと、信頼できる機関からaccess_token(および場合によってはid_token)を受け取ります。通常、保存して、保護されたリソースのHTTPリクエストとともに送信します。どうすればいいですか?

オプション1は、トークンをCookieに保存することです。これはストレージを処理し、各リクエストのCookieヘッダーでトークンをサーバーに自動的に送信します。次に、サーバーはCookieを解析し、トークンをチェックして、それに応じて応答します。

別のオプションは、トークンをローカル/セッションストレージに保存してから、各リクエストのAuthorizationヘッダーを手動で設定することです。この場合、サーバーはヘッダーを読み取り、Cookieと同様に処理を進めます。

詳細については、リンクされたRFCを読む価値があります。

58
Shaun Luttin

MvdDがCookieの自動送信について述べたことに加えて:

  1. Cookieは媒体になる場合がありますが、その最も重要な機能は、Cookieとブラウザーとの対話方法です。 Cookieはサーバーによって設定され、非常に具体的な方法でリクエストで送信されます。一方、JWTは排他的な媒体であり、特定の構造内のいくつかの事実の表明です。あなたがそのように熱心なら、JWTを認証Cookieとして置くことができます。それらを比較する記事を読むとき、彼らは通常、フロントエンドコードによってベアラトークンとして送信されるJWTと、バックエンドのキャッシュセッションまたはユーザーデータに対応する認証Cookieを使用することについて話します。
  2. JWTは多くの機能を提供し、それらを標準に入れて、パーティ間で使用できるようにします。 JWTは、さまざまな場所でいくつかの事実の署名されたアサーションとして機能できます。 Cookieは、どのデータを入れても、または署名したとしても、ブラウザと特定のバックエンドの間で使用するのが本当に理にかなっています。 JWTは、ブラウザーからバックエンド、異なるパーティによって制御されるバックエンド間(OpenId Connectが例)、または1つのパーティのバックエンドサービス内で使用できます。署名済みCookieの特定の例については、おそらくそのユースケースのJWTと同じ機能(「セッションIDを使用せず、サーバーメモリまたはファイルストレージを使用しない」)を達成できますが、ライブラリとピアレビューを失いますこの標準は、CSRFの問題に加えて、他の回答で話しました。

要約すると、あなたが読んでいる投稿はおそらく、JWTをベアラトークンとして、ブラウザからサーバーへの認証目的の認証Cookieと比較していることでしょう。しかし、JWTにはさらに多くの機能があり、おそらく考えているユースケース以外で使用するための標準化と機能をもたらします。

12
kag0