サーバー側Cookieとクライアント側Cookieの違いは何ですか?


120

サーバーとクライアントでCookieを作成することの違いは何ですか?これらはサーバー側Cookieとクライアント側Cookieと呼ばれますか?サーバーまたはクライアントでのみ読み取ることができるCookieを作成する方法はありますか?


15
「サーバー側のCookie」と「クライアント側のCookie」のようなものはありません。リクエストとレスポンスの両方を含むHTTPヘッダーで送信されるCookie、名前/値のペアのみがあります。
Dan Grossman、2011

1
サーバー上のデータを保持するセッション変数を参照している可能性があります。通常、クライアント側のCookieとして保持されるセッションIDがまだあります。
AndrewR

おそらく、質問は、サーバー側でCookieがエンコードされるさまざまな方法(「Cookie」および「Set-Cookie」応答ヘッダーでエンコードされる方法)とクライアント側(つまり、Cookieがエンコードされる方法)に関係しています'「Cookie」リクエストヘッダーでエンコードされています-$ Path変数とすべてのジャズ)。参照してくださいRFC 2109
オフィールRadnitz

回答:


146

HTTPクッキー

Cookieは、ブラウザに状態情報を保存するためにWebサイトで使用されるキーと値のペアです。あなたがウェブサイト(example.com)を持っているとしましょう。ブラウザがウェブページをリクエストすると、ウェブサイトはブラウザに情報を保存するためにクッキーを送ることができます。

ブラウザリクエストの例:

GET /index.html HTTP/1.1
Host: www.example.com

サーバーからの回答例:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest  of the response

ここでは、2つのクッキーfoo = 10とbar = 20がブラウザに保存されています。2つ目は9月30日に期限切れになります。後続の各リクエストで、ブラウザはCookieをサーバーに送り返します。

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*

セッション:サーバー側のCookie

サーバー側のCookieは「セッション」と呼ばれます。この場合のWebサイトは、一意のセッション識別子を含む単一のCookieをブラウザに保存します。ステータス情報(上記のfoo = 10およびbar = 20)はサーバーに格納され、セッションIDは要求をサーバーに格納されたデータと照合するために使用されます。

使用例

セッションとCookieの両方を使用して、認証データ、ユーザー設定、eコマースWebサイトのグラフのコンテンツなどを保存できます。

長所と短所

ソリューションの長所と短所を以下に示します。これらは私の頭に浮かぶ最初のものです、確かに他にもあります。

クッキーの長所:

  • スケーラビリティー:すべてのデータはブラウザーに保管されるため、各リクエストはロードバランサーを経由してさまざまなWebサーバーに送信され、リクエストをフルフィルするために必要なすべての情報を入手できます。
  • ブラウザーのjavascriptを介してアクセスできます。
  • サーバー上にない場合、サーバーの再起動後も存続します。
  • RESTful:リクエストはサーバーの状態に依存しません

クッキーの短所:

セッション長:

  • 一般的に使いやすく、PHPではおそらくそれほど大きな違いはありません。
  • 無制限のストレージ

セッションの短所:

  • スケーリングがより困難
  • Webサーバーの再起動時に、実装に応じてすべてのセッションが失われるか、失われない可能性があります
  • RESTfulではない

セッションのプロ:secure
user2167582 2015

1
なぜセッションはより安全ですか?HTTP経由でセッションCookieを送信すると、乗っ取られる可能性があります。サイトがhttpsを使用する場合、セキュリティは、安全なCookie(暗号化、署名など)を使用している限り同じでなければなりません
filippo

1
Cookieの短所:各リクエストが大きくなり、パフォーマンスに影響を与える可能性があります。数値はわかりませんが、人々はcookielessドメインを使用しているので、それは簡単ではないと思います。
maniexx

5
誤解を招く答え-セッションはCookieではありません。en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_sessionセッション管理は、サーバーでの実装方法に応じて、セッション変数を持つことができます。通常、セッションIDを保持することにより、セッション管理に関連する1つ以上のCookieがあります。また、RESTとRESTfulはCookieやセッション管理とは何の関係もありません。RESTとRESTfulの実装はセッションとCookieを持つことができます。
Zlatin Zlatev 2017年

2
stackoverflow.com/questions/35054840/…を参照してください。セッションは通常Cookieで実装されないが、セッション管理には他のオプションがあるため、サーバー側のCookieとしてセッション変数について説明するのは間違っています。上記のコメントで2017年に「RESTとRESTfulの実装にはセッションとCookieを含めることができる」と言ったときに、JWTについても触れていました。純粋主義者の中には、これがREST APIを実装するための適切な方法ではないと主張する人もいます。
Zlatin Zlatev

57

おそらく、Http Only Cookieと対応するCookieの違いを意味しますか?

Http Only Cookieはクライアント側のJavaScriptではアクセス(読み取りまたは書き込み)できず、サーバー側のみです。Http Onlyフラグが設定されていない場合、またはCookieが(クライアント側)JavaScriptで作成されている場合、Cookieはサーバー側だけでなく(クライアント側)JavaScriptでも読み書きできます。


38

すべてのクッキーはクライアントサーバーです

違いはありません。通常のCookieは、サーバー側またはクライアント側に設定できます。「クラシック」Cookieはリクエストごとに返送されます。サーバーによって設定されたCookieは、応答でクライアントに送信されます。サーバーは、明示的に設定または変更された場合にのみCookieを送信しますが、クライアントは要求ごとにCookieを送信します。

しかし、本質的には同じCookieです。

しかし、行動は変わる可能性があります

Cookieは基本的にname=valueペアですが、値の後にセミコロンで区切られた一連の属性があり、クライアント(またはサーバー)によって実装された場合、Cookieの動作に影響します。これらの属性は、有効期間、コンテキスト、およびさまざまなセキュリティ設定に関するものです。

HTTPのみ(サーバーのみではない)

これらの属性の1つをサーバーが設定して、HTTPのみのCookieであることを示すことができます。つまり、Cookieは引き続き送受信されますが、JavaScriptでは使用できません。ただし、Cookieはまだ残っていることに注意してください。これはブラウザに組み込まれている保護機能にすぎませんが、誰かがIE5のような途方もなく古いブラウザやカスタムクライアントを使用する場合、実際にはCookieを読み取ることができます。

したがって、「サーバーCookie」があるように見えますが、実際にはありません。これらのCookieは引き続きクライアントに送信されます。クライアントでは、Cookieがサーバーに送信されるのを防ぐ方法はありません。

「唯一性」を達成するための選択肢

サーバーにのみ、またはクライアントにのみ値を格納する場合は、サーバー上のファイルやデータベース、クライアント上のローカルストレージなど、他の種類のストレージが必要になります。


こんにちは、私はこれらの概念に非常に慣れていないので、いくつか疑問があります。申し訳ありません、私の質問はばかげているように聞こえるかもしれませんが、私はまだ尋ねます。任意の助け、大歓迎です-クライアント側で設定されたCookieを任意のドメインに送信できますか?つまり、それはセキュリティの脅威ではありませんか?また、APIなどのブラウザ以外のクライアントではどのように機能しますか?
Karan Chadha

1
こんにちは@KaranChadha。質問がある場合は、ページの上部にある[質問する]ボタンを使用して、正式な質問として質問してください。7年前の質問へのコメントスレッドは、おそらくそれに適切な注意を向けないでしょう。このQ&Aへのリンク、または具体的にはこの回答へのリンクを追加することは、もちろん問題ありません。そのためには、各投稿の下部にある[共有]ボタンを使用できます。
GolezTrol

これは本当ですか?クライアントが生成したCookieは転送されていないようです。実行したdocument.cookie="foo=bar"後にfetch("/foobar", {credentials: 'include'} )が含まれているCookieが送信されていない場合foo=bar。DevToolsとコンソールを使用して、このサイトでそのコードを直接試しました。
オリゴフレン2018

はい、それは本当です、docsも言いますが、期限切れの属性が欠落しているなど、これを引き起こす可能性があるいくつかの詳細があります。
GolezTrol 2018

1
@MarinosAnはい、できます。しかし、Cookieの動作を変更する属性に関しては、私の答えは少し簡潔だったので、少し拡張しました。
GolezTrol 2019

4
  1. はい、サーバー側でのみ読み取ることができるCookieを作成できます。他の回答ですでに説明されているように、これらは「HTTPのみ」と呼ばれます。

  2. いいえ、クライアント側でのみ読み取ることができる「Cookie」を作成する方法はありません(私は知っています)。Cookieは、クライアントとサーバー間の通信を容易にするためのものです。

  3. しかし、「クライアントのみのCookie」などが必要な場合は、「ローカルストレージ」を使用するという簡単な答えがあります。

ローカルストレージは実際にはCookieよりも構文的に簡単に使用できます。Cookieとローカルストレージの簡単な要約は、次の場所にあります。

https://courses.cs.washington.edu/courses/cse154/12au/lectures/slides/lecture21-client-storage.shtml#slide8

ポイント:JavaScriptで作成されたCookieを使用して、クライアント側でのみ必要なGUI関連のものを保存できます。ただし、Cookieはすべてのリクエストに対してサーバーに送信され、http-requestヘッダーの一部になるため、リクエストに多くのデータが含まれ、送信が遅くなります。

ページに画像、CSSファイル、スクリプトなどの50のリソースがある場合、Cookieは(通常)リクエストごとに送信されます。この詳細については、すべてのWebリクエストがブラウザのCookieを送信しますか?

ローカルストレージには、データ転送に関連するこれらの欠点はありません。データは送信されません。それは素晴らしいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.