web-dev-qa-db-ja.com

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

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

99
Rahul

HTTPクッキー

Cookieは、Webサイトがブラウザに状態情報を保存するために使用するキーと値のペアです。 Webサイト(example.com)があるとします。ブラウザーがWebページを要求すると、WebサイトはCookieを送信してブラウザーに情報を保存できます。

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

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日に期限切れになります。後続の各リクエストで、ブラウザはクッキーをサーバーに送り返します。

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

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

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

使用例

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

長所と短所

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

Cookie Pros:

  • スケーラビリティ:すべてのデータはブラウザに保存されるため、各リクエストはロードバランサーを介して異なるWebサーバーに送られ、リクエストをすべて満たすために必要なすべての情報が得られます。
  • ブラウザのjavascriptを介してアクセスできます。
  • サーバー上にいなくても、サーバーの再起動後も生き残ります。
  • RESTful:リクエストはサーバーの状態に依存しません

Cookieの短所:

セッションの長所:

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

セッションの短所:

  • スケーリングがより困難
  • webサーバーの再起動時に、すべてのセッションが失われるか、実装に依存しないことがあります
  • rESTfulではない
128
filippo

Http Only cookies とそのカウンターパートの違いを意味しているのでしょうか?

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

52
nikc.org

すべてのCookieはクライアントandserver

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

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

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

Cookieは基本的にname=valueペアですが、 値の後 は、セミコロンで区切られた属性の束であり、 Cookieifそれはクライアント(またはサーバー)によって実装されます。これらの属性には、ライフタイム、コンテキスト、およびさまざまなセキュリティ設定が含まれます。

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

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

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

「オンリーネス」を達成する代替案

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

29
GolezTrol
  1. はい、サーバー側でのみ読み取り可能なCookieを作成できます。これらは、他の回答ですでに説明されているように、「HTTP Only」-cookieと呼ばれます

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

  3. しかし、「client-only-cookies」のようなものが必要な場合は、「ローカルストレージ」を使用するという簡単な答えがあります。

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

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

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

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

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

3
Panu Logic