ブラウザのCookieドメインはどのように機能しますか?


380

ドメイン/サブドメインのCookieの奇妙な問題が発生しているため、ブラウザーがCookieを処理する方法を知りたいのですが。彼らが異なる方法でそれを行う場合、その違いを知っておくのも良いでしょう。

つまり、ブラウザがCookieを受信すると、そのCookieにはドメインとパスがアタッチされている場合があります。そうでない場合、ブラウザはおそらくそれらをいくつかのデフォルトに置き換えます。質問1:それらは何ですか?

その後、ブラウザがリクエストを送信しようとすると、そのCookieがチェックされ、そのリクエストに対して送信する必要のあるCookieが除外されます。これは、要求のパスとドメインに対してそれらを照合することによって行われます。質問2:マッチングルールとは何ですか?


追加:

私がこれを尋ねる理由は、いくつかのエッジケースに興味があるからです。お気に入り:

  • のCookieは.example.com利用できますwww.example.comか?
  • のCookieは.example.com利用できますexample.comか?
  • のCookieはexample.com利用できますwww.example.comか?
  • のCookieはexample.com利用できますanotherexample.comか?
  • www.example.comCookieを設定できるようになりexample.comますか?
  • www.example.comCookieを設定できるようになりwww2.example.comますか?
  • www.example.comCookieを設定できるようになり.comますか?
  • 等。

追加された2:

また、誰かが私がクッキーをどのように設定するべきかを提案することができます:

  • www.example.comまたはで設定できますexample.com
  • との両方www.example.comからアクセスできますexample.com

回答:


367

最近Cookie 定義する必要があるRFC 2965Set-Cookie2はすでにRFC 2109を廃止していました)がありますが、ほとんどのブラウザーはそれを完全にはサポートしていませんが、Netscapeによる元の仕様に準拠しています。

ドメイン属性値と有効なドメインには違いがあります。前者はSet-Cookieヘッダーフィールドから取得され、後者はその属性値の解釈です。RFC 2965によれば、以下が適用されます。

  • 場合のSet-Cookieヘッダーフィールドはありません持っているドメインの属性を、効果的なドメインは、要求のドメインです。
  • Domain属性が存在する場合、その値が有効なドメインとして使用されます(値がa .で始まらない場合は、クライアントによって追加されます)。

有効なドメインがあると、設定するために現在要求されているドメインとドメインが一致する必要があります。それ以外の場合、Cookieは更新されます。同じルールが、リクエストで送信されるCookieの選択にも適用されます。


この知識を質問にマッピングすると、以下が適用されます。

  • www.example.comで Cookieを使用できるDomain=.example.com ようになります
  • クッキーDomain=.example.com ますのために利用できるようにexample.com
  • クッキーDomain=example.comに変換されます.example.comので、とはなりものために利用できるようにwww.example.com
  • クッキーはDomain=example.comなりませんのために利用できるようにanotherexample.com
  • www.example.com example.comに Cookieを設定できるようになります
  • www.example.comwww2.example.comの Cookieを設定できません
  • www.example.com.comに Cookieを設定できません

また、www.example.comexample.comの Cookieを設定して読み取るには.www.example.com.example.comそれぞれとに設定します。ただし、最初の(.www.example.com)は、そのドメインの下にある他のドメイン(例:foo.www.example.comまたはbar.www.example.com.example.comからのみアクセスでき、example.comの下にある他のドメイン(例:foo。 example.comまたはbar.example.com)。


@Gumboでは、abcexample.comはドメインc.example.comでCookieにアクセスできますか?
パチェリエ

2
これに対する非常に遅いフォローアップ質問。私自身の経験とこれ:webmasters.stackexchange.com/questions/55790/…example.comのドメインはwww.example.comで利用できないことを示唆していますが、この例ではそうではありません。この例は間違っていますか、それとも私は(かなり可能性があります)誤解していますか?スレッドのネクロマンシーで申し訳ありませんが、このすばらしい答えが私のような将来の混乱した初心者のために100%正確であることを確認したいと思っていました:)
エラー14

7
この答えは少し時代遅れです。以下の私の答えを参照しください。
ZhongYu

1
www.example.comでexample.comの設定を使用できないのはなぜですか?(example.comの「www」サブなので
Nabeel Khan、2016

Set-Cookie2自体は廃止されています。Set-Cookieを引き続き使用します。
joeforker

122

以前の回答は少し時代遅れです。

RFC 6265は、当時のブラウザの合意に基づいて2011年に公開されました。それ以来、パブリックサフィックスドメインにいくつかの複雑化がありました。現在の状況を説明する記事を書きました-http://bayou.io/draft/cookie.domain.html

要約すると、Cookieドメインに関して従うべきルール:

  • Cookie ののドメインは、元のリクエストのドメインです。

  • 起点ドメインがIPの場合、Cookieのドメイン属性を設定しないでください。

  • Cookieのドメイン属性が設定されていない場合、Cookieは元のドメインにのみ適用されます。

  • Cookieのドメイン属性が設定されている場合、

    • Cookieはそのドメインとそのすべてのサブドメインに適用されます。
    • Cookieのドメインは、元のドメインと同じであるか、元のドメインの親である必要があります
    • Cookieのドメインは、TLD、パブリックサフィックス、またはパブリックサフィックスの親であってはなりません。

Cookieは常にその元のドメインに適用できることがわかります。

以下のようにCookieドメインは、先頭のドットを持つべきではない.foo.com、単に使用します-foo.com

例として、

  • x.y.z.com-自身や親にCookieドメインを設定することができx.y.z.comy.z.comz.com。ただしcom、これはパブリックサフィックスです。
  • ドメインとクッキーは= y.z.comに適用可能でありy.z.comx.y.z.coma.x.y.z.comなど

公共の接尾辞の例- 、comeduuk、、co.ukblogspot.comcompute.amazonaws.com


5
@roelleor-逆です。rfc6265は、実際にCookieが実際にどのように処理されたかを要約するために作成されました:)はい、rfcは主要なブラウザの動作をかなり正確に反映しています。ブラウザでの私の最近のテストはそれを確認しました。ただし、パブリックサフィックスを含むコーナーケースでは異なる場合があります。
ZhongYu 2015

2
先頭のドットの影響は何ですか?
UpTheCreek 2015年

3
@UpTheCreek-rfc6265によると、クライアントは先頭のドットを無視する必要があります
ZhongYu

2
x.y.z.comクッキーを設定できるのはおかしくないz.comですか?
Royi Namir

1
したがって、xyzcomがcookieをyzcomに設定でき、ドメインyzcomのcookieがwyzcomに適用できる場合...これは、xyzcomがcookieをwyzcomに設定できることを意味しますか?
イオアナ

9

広範囲にわたる報道については、RFC2965の内容を確認してください。もちろん、すべてのブラウザがまったく同じように動作するわけではありません。

ただし、一般に、Cookieに何も指定されていない場合のデフォルトのパスのルールは、Set-Cookieヘッダーが到着したURLのパスです。同様に、ドメインのデフォルトは、Set-Cookieが送信されたURLの完全なホスト名です。

ドメインの一致ルールでは、Cookieドメインが要求の送信先のホストと一致する必要があります。Cookieは*を含めることで、より広いドメイン一致を指定できます。Set-Cookieのドメイン属性(ブラウザーによって異なる可能性がある1つの領域)。パスの一致(ドメインが一致すると想定)は、要求されたパスがCookieで指定されたパス内にある必要があるという単純な問題です。通常、セッションCookieはpath = /またはpath = / applicationName /で設定されるため、アプリケーションへのすべてのリクエストでCookieを使用できます。


追加に対する応答:

  • .example.comのCookieはwww.example.comで利用できますか? はい
  • .example.comのCookieはexample.comで利用できますか? わからない
  • www.example.comでexample.comのCookieを使用できますか?すべきではない... *
  • example.comのCookieは別のexample.comで使用できますか? 番号
  • www.example.comはexample.comにCookieを設定できますか? はい
  • www.example.comはwww2.example.comのCookieを設定できますか? いいえ (.example.comを除く)
  • www.example.comは.comにCookieを設定できますか? いいえ (名前空間の上位にCookieを設定することはできません。また、.co.ukなどに設定することもできません)

*現在、これをテストすることはできませんが、少なくともIE7 / 6がパスexample.comをあたかも扱っているかのように扱うことになると思い .example.comます。


質問に興味深いエッジケースをいくつか追加しました。何か賞賛していただけませんか?
Vilx- 2009年

8

この問題の最後(正確には3番目)のRFCはRFC-6265です(RFC-2965は廃止され、RFC-2109は廃止されました)。

それによると、サーバーがドメイン属性を省略した場合、ユーザーエージェントはCookieを元のサーバー(特定のリソースが存在するサーバー)にのみ返します。ただし、一部の既存のユーザーエージェントが存在しないドメイン属性を、ドメイン属性が存在し、現在のホスト名が含まれているものとして扱うことも警告しています(たとえば、example.comがドメイン属性なしでSet-Cookieヘッダーを返す場合、これらのユーザーエージェントは誤ってcookieをwww.example.comにも送信します)。

ドメイン属性が指定されている場合、完全なドメイン名として扱われます(属性に先頭のドットがある場合は無視されます)。サーバーは、このCookieを取得するために、属性で指定されたドメインと完全に一致する必要があります(まったく同じドメイン名を持っているか、そのサブドメインである必要があります)。より正確には、ここ指定されています

したがって、たとえば:

  • cookie属性Domain=.example.comは以下と同等ですDomain=example.com
  • このようなドメイン属性を持つCookieは、example.comおよびwww.example.comで利用できます。
  • このようなドメイン属性を持つCookieは、 another-example.com では使用できません
  • like cookie属性を指定するDomain=www.example.comと、www4.example.comへの道が閉ざさます

PS:ドメイン属性の末尾にコンマがあると、ユーザーエージェントは属性=(


6

2019年に最新のChrome、Firefox、Safariですべてのケースをテストしました。

追加に対する応答:

  • .example.comのCookieはwww.example.comで利用できますか?はい
  • .example.comのCookieはexample.comで利用できますか?はい
  • www.example.comでexample.comのCookieを使用できますか?NO、ワイルドカードなしのドメインはそれ自体とのみ一致します。
  • example.comのCookieは別のexample.comで使用できますか?番号
  • www.example.comはexample.comにCookieを設定できますか?いいえ、「。example.com」にはcookieを設定できますが、「example.com」には設定できません。
  • www.example.comはwww2.example.comのCookieを設定できますか?いいえ。ただし、www2.example.comがアクセスできる.example.comのCookieを設定できます。
  • www.example.comは.comにCookieを設定できますか?番号


3

ブラウザがSet-header応答ヘッダー(サーバー側のCookie書き込み)を受け入れるかどうかを決定するルールがあります。これは、JavaScriptを使用して設定されたCookieのわずかに異なるルール/解釈です(私はVBScriptをテストしていません)。

次に、ブラウザがページリクエストとともにCookieを送信するかどうかを決定するルールがあります。

主要なブラウザエンジンには、ドメインの一致の処理方法、およびパス値のパラメータの解釈方法に違いがあります。いくつかの実証的な証拠は、異なるブラウザが異なる方法でCookieを処理する方法の記事で見つけることができます。


2

Cookieの拒否に関するセクション3.3.2を読んで驚いた:

http://tools.ietf.org/html/rfc2965

これは、「xy」にドットが含まれているため、ブラウザがドメイン.z.comのxyzcomからのCookieを拒否する必要があることを示しています。したがって、上記のRFCや質問を誤解しない限り、質問が追加される可能性があります。

.example.comのCookieはwww.yyy.example.comで利用できますか?番号。

オリジンサーバーwww.yyy.example.comによってドメイン.example.comで設定されたCookieの値は、ユーザーエージェントによってxxx.example.comに送信されますか?番号。


2
そのrfcは古くなっています。ブラウザコンセンサスに基づく新しいRFC 6265には、クッキーを可能z.comに適用するz.com、すべてのサブドメイン。
ZhongYu

1

www.example.comCookieを設定できるようになり.comますか?

いいえ、ただしexample.com.frのCookieを設定できる場合がありますexample2.com.fr。FirefoxはTLDのリストを維持することでこれから保護します:http : //securitylabs.websense.com/content/Blogs/3108.aspx

どうやらInternet Explorerが、私は理由を説明すると仮定セットクッキーに2文字のドメインを許可していませんo2.ie単ににリダイレクトo2online.ie。私はしばしばそれを疑問に思いました。


「com.fr」は「パブリックサフィックス」と呼ばれています。Cookieドメインをパブリックサフィックスにすることはできません。6265 RFCを参照してpublicsuffix.org
ZhongYu

はい、解決策はありますが、それは非常に厄介なものです。この種のラベル付けは、アドホックベースで個別に行われるのではなく、DNSに組み込まれる必要があります。
TRiG

確かに、多分あなたは「dbound」を参照しています。しかし、それはより多くの問題を引き起こすかもしれません。のような、httpクライアントの実装に挑戦を提起します。
ZhongYu

この情報がブラウザからJavaScriptに何らかの方法で公開されていると便利です。そうしないと、特定のレベルのドメインにCookieを設定できるかどうかをプログラムで判断することはできません。結局のところ、すべての通話でそのリストを確認することはできません。
Dtipson 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.