"JWT vs Cookie"に関するいくつかの投稿を読みましたが、混乱させられただけです...
私はいくつかの説明が欲しい、「トークンベースの認証vsクッキー」について話しているとき、cookiesここでは単にを参照しますセッションCookie?私の理解では、cookieは媒体のようなであり、トークンベースの認証を実装するために使用できます(クライアント側でログインしているユーザーを識別できるものを保存します)またはセッションベースの認証(サーバー側のセッション情報と一致する定数をクライアント側に保存します)
なぜJSON Webトークンが必要なのですか?標準のCookieを使用してトークンベースの認証を実装していました(セッションIDを使用せず、サーバーメモリまたはファイルストレージを使用しません):Set-Cookie: user=innocent; preferred-color=Azure
、そして私が観察した唯一の違いはJWT ペイロードと署名 ...の両方が含まれていますが、HTTPヘッダーの署名済みまたはプレーンテキスト Cookieを選択できます。私の意見では、署名されたクッキー(cookie:'time=s%3A1464743488946.WvSJxbCspOG3aiGi4zCMMR9yBdvS%2B6Ob2f3OG6%2FYCJM'
)はよりスペース効率が高く、唯一の欠点はクライアントがトークンを読み取れないこと、サーバーのみが読み取れることです...しかし、ちょうどclaimはJWTのオプションであり、トークンが意味を持つ必要はありません
ベアラートークンと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を使用するのが難しくなります。
求めているのは、クライアントからサーバーにJSON Web Token(JWT)を送信するためのCookieとベアラートークンの違いです。
Cookieとベアラートークンの両方がデータを送信します。
違いの1つは、Cookieは任意のデータの送信と保存に使用されるのに対して、ベアラートークンは認証データの送信に特に使用されることです。
そのデータは、多くの場合JWTとしてエンコードされます。
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
OpenID、OAuth、OpenID Connectなどのトークンベースの認証を行うと、信頼できる機関からaccess_token(および場合によってはid_token)を受け取ります。通常、保存して、保護されたリソースのHTTPリクエストとともに送信します。どうすればいいですか?
オプション1は、トークンをCookieに保存することです。これはストレージを処理し、各リクエストのCookie
ヘッダーでトークンをサーバーに自動的に送信します。次に、サーバーはCookieを解析し、トークンをチェックして、それに応じて応答します。
別のオプションは、トークンをローカル/セッションストレージに保存してから、各リクエストのAuthorization
ヘッダーを手動で設定することです。この場合、サーバーはヘッダーを読み取り、Cookieと同様に処理を進めます。
詳細については、リンクされたRFCを読む価値があります。
MvdDがCookieの自動送信について述べたことに加えて:
要約すると、あなたが読んでいる投稿はおそらく、JWTをベアラトークンとして、ブラウザからサーバーへの認証目的の認証Cookieと比較していることでしょう。しかし、JWTにはさらに多くの機能があり、おそらく考えているユースケース以外で使用するための標準化と機能をもたらします。