すべてのWebリクエストがブラウザのCookieを送信しますか?


198

すべてのWebリクエストがブラウザのCookieを送信しますか?

ページビューではなく、画像や.jsファイルなどのリクエストです。

更新 Webページに50の要素がある場合、それは50のリクエストです。リクエストごとに同じCookieを送信するのはなぜですか。キャッシュされていないか、すでにあることを知っていますか?


8
この状況ではキャッシュが可能だとは思いません。つまり、ブラウザーがサーバーにデータを送信することであり、その逆ではありません。多くの理由により、ユーザーが1つのリクエストを送信した後、サーバーが「すでにサーバーにある」とは断言できません。互いに通信しないサーバーが多数存在する場合があります。サーバーは以前のリクエストについて何も覚えてほしくない(または余裕がない)かもしれません-HTTPはステートレスであることになっています。すべてのリクエストは、他のリクエストから独立している必要があります。このため、認証資格情報と同様に、すべてのリクエストでCookieを送信する必要があります。
イアンクレランド2009

私の回答の更新で、キャッシュがcookieに対して意味をなさない理由について述べました:stackoverflow.com/a/1336178/102960
igorsantos07

回答:


198

はい、リクエストされたURLがCookieで定義された同じドメインとパス内にある限り(および他のすべての制限(安全、httponly、期限切れなしなど))が保持されていれば、Cookieはすべてのリクエストに対して送信されます。


103
ちなみにこれが、Google Page SpeedやYahooのYSlowなどのページスピードツールが、Cookieを使用しない別のドメインから静的コンテンツを提供することを推奨している理由です。
ceejayoz 2009

更新された回答で、別のドメインからのコンテンツの提供について言及しました:stackoverflow.com/a/1336178/102960
igorsantos07

Site1からSite2へのHTTPリダイレクトがある場合、ブラウザーがSite2 Cookieを送信するのは本当ですか?
Zeigeist 2018年

92

他の人が言ったように、クッキーのホスト、パスなどの制限が満たされた場合、それは50回送信されます。

しかし、理由も尋ねました。CookieはHTTP機能であり、HTTPはステートレスだからです。HTTPは、サーバーがリクエスト間の状態を保存しなくても機能するように設計されています。

実際、サーバーには、どのユーザーが特定のリクエストを送信しているかを確実に認識する方法がありません。1つのWebプロキシ(つまりIPアドレス)の背後に1,000人のユーザーがいる可能性があります。Cookieがすべてのリクエストに送信されなかった場合、サーバーはどのユーザーがどのリソースをリクエストしているかを知る方法がありません。

最後に、ブラウザは、サーバーがCookieを必要とするかどうかの手がかりを持たず、サーバーがfoo.comへの要求に対するCookieを送信するように指示したことを知っているだけなので、そうします。画像に必要な場合もあれば(たとえば、ユーザーごとに動的に生成される場合もあります)、必要ない場合もありますが、ブラウザは認識できません。


1
これは、多重化スキームであるHTTP 1.1に当てはまりますか?つまり、リクエストは単一のTCP接続にバンドルされます。もちろん、すべてのリクエストはcookieのコピーが添付された状態で受信されます。しかし、懸念が多くの送信の重複である場合、HTTP 1.1は最適化する立場にあります。それが実際にあるかどうかはわかりませんが...
クリス・ノエ

1
次に、問題は「ブラウザがCookieを添付するつもりだったリクエストはどれですか」になります。サーバーはCookieを使用してポリシーを設定し、Cookieを送り返すドメインとURLパスを決定しますが、Cookieは忘れられます。接続内の特定のリクエストにCookieがあり、他のリクエストにはないことを指定する方法が必要です。これは、すべてのリクエストに明示的に含めることを除いて、HTTP / 1.1には存在しません。正直なところ、帯域幅を削減するためのより良い(標準互換)ソリューションは、クライアント側のgzipコンテンツエンコーディングですが、まだ誰もサポートしていません。
イアンクレランド2009

1
@Ian Clelland:クライアントは最初のメッセージを送信する必要があるため、サーバーがAccept-Encodingに何を送信するかがわかりません(サーバーがそのフィールドを送信した場合、HTTP / 1.1§14.3はその要求ヘッダーを示します)。また、問題は、同じサーバー上でもURLによって異なる可能性があり、時間とともに変化する可能性があるため、機能させることは簡単ではありません。
derobert 09

1
@Chris:いいえ、キープアライブはTCP接続のセットアップ/破棄のオーバーヘッドを節約するだけです。すべてのリクエストに対して、完全なヘッダーが引き続き送信されます。ただし、パイプライン処理(応答を待機せずに複数の要求を送信する)は非常に役立ちます。詳細については、HTTP / 1.1§8.1を参照してください。
derobert 2009

21

はい。すべてのリクエストは、同じドメインに属するCookieを送信します。HTTPはステートレスであるため、それらはキャッシュされません。つまり、すべてのリクエストは、サーバーがHTTPで何をすべきかを理解するのに十分でなければなりません。特定のユーザーだけがアクセスできる画像があるとします。あなたはそれらの50個のリクエストのそれぞれで認証Cookieを送信する必要あります。そうすることで、サーバーは、それが取得しているリクエストのプールの中で、それが他人やゲストではなく、あなたであることを認識します。

そうは言っても、HTTPS設定、パス、ドメインなど、他の応答で言及されている他の制限がある場合、Cookieは送信されない可能性があります。特に、注意すべき重要な点があります。Cookieはドメイン間で共有されません。これは、言及した画像やスクリプトなどの静的ファイルに対するHTTP呼び出しのサイズを削減するのに役立ちます。
例:に4つのCookieがありwww.stackoverflow.comます。にリクエストするとwww.stackoverflow.com/images/logo.png、これらの4つのCookieがすべて送信されます。
ただし、リクエストする場合stackoverflow.com/images/logo.png(サブドメインの変更に注意)またはimages.stackoverflow.com/logo.png、これらの4つのCookieは存在しませんが、これらのドメインに関連するCookieは存在する可能性があります。

たとえば、このStackOverflowブログ投稿で、Cookieと画像のリクエストについて詳しく読むことができます。


10

いいえ。すべてのリクエストがCookieを送信するわけではありません。Cookieの構成とクライアント/サーバー接続によって異なります。

たとえば、Cookieのsecureオプションがに設定されている場合はtrue、安全なHTTPS接続を介して送信する必要があります。セキュアフラグがtrueであるため、HTTPプロトコルを使用するWebサイトが表示された場合、これらのCookieはブラウザーによって送信されません。


7

Cookieには「パス」プロパティがあります。「path = /」の場合、答えは「はい」です。


はい、Cookieを必要とするすべてのURLが同じようにサイト/アプリの構造を構成できます/app/。冗長なオーバーヘッドを排除するために個別のサブドメインを必要とせずに、移植性を維持します。または、最初は役に立たなくなったGoogleアナリティクスを破棄することもできます。私はクッキーのヘッダーを長い間見てきましたが、祖母がそれらを編み込んでいたのではないかと思います。
ジェイク

7

3年が経ちました

ブラウザがCookieを送信しない別の理由があります。タグにcrossOrigin属性を<script>、値をに追加できます"anonymous"。これにより、Cookieが宛先サーバーに送信されなくなります。99.9%の時間、JavaScriptは静的ファイルであり、リクエストのCookieに基づいてそのjsコードを生成しません。1KBのCookieがあり、ページに200のリソースがある場合、ユーザーは200KBをアップロードしており、3Gでは時間がかかる可能性があり、結果ページへの影響はありません。訪問HTML属性:crossorigin参考のために。


説明してください。
2017年

4
@Jakeでは、<script>タグにcrossOrigin属性を追加し、値を "anonymous"に追加できます。これにより、Cookieが宛先サーバーに送信されなくなります。99.9%の時間、JavaScriptは静的ファイルであり、リクエストのCookieに基づいてそのjsコードを生成しません。1KBのCookieがあり、ページに200のリソースがある場合、ユーザーは200KBをアップロードしており、3Gでは時間がかかる可能性があり、結果ページへの影響はありません。参考として、developer.mozilla.org / en-US / docs / Web / HTML /…にアクセスてください。
ギルム

4

私はこれが古いスレッドであることを知っています。しかし、末尾のドットを追加すると、ほとんどのブラウザーがドメインのCookieを送信しないことに気づきました。たとえば、http://example.com.に設定され.example.comたCookieを受信しません。一方、Apacheはそれらを同じホストとして扱います。これは、含める外部リソースのクロスドメイントラッキングを困難にするのに役立ちますが、パフォーマンス上の理由から使用することもできます。これにより、https証明書の検証が妨げられることに注意してください。browsershotsと自分のデバイスを使用していくつかのテストを実行しました。ハックは、リクエストにCookieが含まれるSafari(モバイルおよびデスクトップ)を除くほとんどすべてのブラウザで機能します。


どのようにして「含まれる外部リソースのクロスドメイントラッキングを困難にする」のですか?Farcebook Likeやそのようなウィジェットについて話していますか-偶然ログインしたユーザーのブラウジングを追跡していることを知っていますか?
Jake

はい。ほとんどのブラウザーはCookieを一緒に送信しないため、これはより困難になります。したがって、たとえばgoogle.comから何かを含めており、googleにログインしている場合、googleは2つのリクエストをリンクできません。これは厳しい保証はありません。一部のブラウザーはとにかくCookieを送信し、まだ機能するユーザー(IPアドレスなど)を特定するための信頼性が低く、使用方法が少ないです。最大の欠点は、HTTPSを使用できないことです。これは、今日では役立たずになっています。
Gellweiler 2017年

0

短い答えははいです。以下の行はJSドキュメントからのものです

Cookieはかつて一般的なクライアント側のストレージに使用されていました。これがクライアントにデータを保存する唯一の方法であった場合、これは正当でしたが、現在は最新のストレージAPIを使用することが推奨されています。Cookieはリクエストごとに送信されるため、パフォーマンスが低下する可能性があります(特にモバイルデータ接続の場合)。

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