サーバーとクライアントでCookieを作成することの違いは何ですか?これらはサーバー側Cookieとクライアント側Cookieと呼ばれますか?サーバーまたはクライアントでのみ読み取ることができるCookieを作成する方法はありますか?
サーバーとクライアントでCookieを作成することの違いは何ですか?これらはサーバー側Cookieとクライアント側Cookieと呼ばれますか?サーバーまたはクライアントでのみ読み取ることができるCookieを作成する方法はありますか?
回答:
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は「セッション」と呼ばれます。この場合のWebサイトは、一意のセッション識別子を含む単一のCookieをブラウザに保存します。ステータス情報(上記のfoo = 10およびbar = 20)はサーバーに格納され、セッションIDは要求をサーバーに格納されたデータと照合するために使用されます。
セッションとCookieの両方を使用して、認証データ、ユーザー設定、eコマースWebサイトのグラフのコンテンツなどを保存できます。
ソリューションの長所と短所を以下に示します。これらは私の頭に浮かぶ最初のものです、確かに他にもあります。
クッキーの長所:
クッキーの短所:
セッション長:
セッションの短所:
secure
?
おそらく、Http Only Cookieと対応するCookieの違いを意味しますか?
Http Only Cookieはクライアント側のJavaScriptではアクセス(読み取りまたは書き込み)できず、サーバー側のみです。Http Onlyフラグが設定されていない場合、またはCookieが(クライアント側)JavaScriptで作成されている場合、Cookieはサーバー側だけでなく(クライアント側)JavaScriptでも読み書きできます。
すべてのクッキーはクライアントとサーバーです
違いはありません。通常のCookieは、サーバー側またはクライアント側に設定できます。「クラシック」Cookieはリクエストごとに返送されます。サーバーによって設定されたCookieは、応答でクライアントに送信されます。サーバーは、明示的に設定または変更された場合にのみCookieを送信しますが、クライアントは要求ごとにCookieを送信します。
しかし、本質的には同じCookieです。
しかし、行動は変わる可能性があります
Cookieは基本的にname=value
ペアですが、値の後にセミコロンで区切られた一連の属性があり、クライアント(またはサーバー)によって実装された場合、Cookieの動作に影響します。これらの属性は、有効期間、コンテキスト、およびさまざまなセキュリティ設定に関するものです。
HTTPのみ(サーバーのみではない)
これらの属性の1つをサーバーが設定して、HTTPのみのCookieであることを示すことができます。つまり、Cookieは引き続き送受信されますが、JavaScriptでは使用できません。ただし、Cookieはまだ残っていることに注意してください。これはブラウザに組み込まれている保護機能にすぎませんが、誰かがIE5のような途方もなく古いブラウザやカスタムクライアントを使用する場合、実際にはCookieを読み取ることができます。
したがって、「サーバーCookie」があるように見えますが、実際にはありません。これらのCookieは引き続きクライアントに送信されます。クライアントでは、Cookieがサーバーに送信されるのを防ぐ方法はありません。
「唯一性」を達成するための選択肢
サーバーにのみ、またはクライアントにのみ値を格納する場合は、サーバー上のファイルやデータベース、クライアント上のローカルストレージなど、他の種類のストレージが必要になります。
document.cookie="foo=bar"
後にfetch("/foobar", {credentials: 'include'} )
が含まれているCookieが送信されていない場合foo=bar
。DevToolsとコンソールを使用して、このサイトでそのコードを直接試しました。
はい、サーバー側でのみ読み取ることができるCookieを作成できます。他の回答ですでに説明されているように、これらは「HTTPのみ」と呼ばれます。
いいえ、クライアント側でのみ読み取ることができる「Cookie」を作成する方法はありません(私は知っています)。Cookieは、クライアントとサーバー間の通信を容易にするためのものです。
しかし、「クライアントのみのCookie」などが必要な場合は、「ローカルストレージ」を使用するという簡単な答えがあります。
ローカルストレージは実際にはCookieよりも構文的に簡単に使用できます。Cookieとローカルストレージの簡単な要約は、次の場所にあります。
ポイント:JavaScriptで作成されたCookieを使用して、クライアント側でのみ必要なGUI関連のものを保存できます。ただし、Cookieはすべてのリクエストに対してサーバーに送信され、http-requestヘッダーの一部になるため、リクエストに多くのデータが含まれ、送信が遅くなります。
ページに画像、CSSファイル、スクリプトなどの50のリソースがある場合、Cookieは(通常)リクエストごとに送信されます。この詳細については、すべてのWebリクエストがブラウザのCookieを送信しますか?
ローカルストレージには、データ転送に関連するこれらの欠点はありません。データは送信されません。それは素晴らしいです。