サブドメインとドメイン間でCookieを共有する


420

2つの質問があります。.mydomain.comCookieでドメインを(先頭にドットを付けて)指定すると、すべてのサブドメインがCookieを共有できることを理解しています。

(サブドメインなしで)でsubdomain.mydomain.com作成されたCookieにアクセスできますか?mydomain.comwww

で作成された場合mydomain.com、(wwwサブドメインなしで)Cookieにアクセスできますsubdomain.mydomain.comか?


3
はい、あなたは...下のリンクを参照してくださいすることができますcodeguru.com/csharp/csharp/cs_internet/article.php/c19417/...
ラウール・ジャイン


あなたはこの質問を見てくださいすることができstackoverflow.com/questions/38351769/...
Jayavardhan Gange

1
@ adam0101ドメインとサブドメインが異なるサーバーでホストされている場合はどうなりますか?
user3782114 16

3
@ user3782114、それらが異なるサーバー上にあるかどうかは問題ではありません。私の場合、それらは異なるサーバー上にあるだけでなく、各ドメインが複数のサーバー間で負荷分散されていました。「dev.oursite.com」、「test」のように名前を付けたため、これを実行すると、下位の環境(dev、test、uatなど)も同じcookieを共有し始めたことが1つありました。 oursite.com "など。そこにあるトリック(少なくとも.Netでは)は、環境ごとに個別のマシンキーを生成し、それをWeb.configに保存することです(各環境の構成を変換すると想定)。
adam0101 16

回答:


653

2つのドメイン。Cookie mydomain.comsubdomain.mydomain.com共有できるのは、ドメインがSet-Cookieヘッダーで明示的に指定されている場合のみです。それ以外の場合、Cookieのスコープはリクエストホストに制限されます。(これは「ホストオンリーCookie」と呼ばれます。ホストオンリーCookieとはを参照してください

たとえば、次のヘッダーをから送信した場合、subdomain.mydomain.comへのリクエストに対してCookieは送信されませんmydomain.com

Set-Cookie: name=value

ただし、以下を使用すると、両方のドメインで使用できます。

Set-Cookie: name=value; domain=mydomain.com

このCookieは、mydomain.comのすべてのサブドメインに送信されますsubsub.subdomain.mydomain.com

ではRFC 2109、それはサブドメインで使用することができなかったことを意味先頭のドットなしのドメイン、およびだけ先頭のドットは(.mydomain.com)あなたがた尋ねるだから何、それは複数のサブドメイン(ではなくトップレベルドメインにまたがって使用することができるようになります古い仕様では不可能です)。

ただし、すべての最新のブラウザは新しい仕様RFC 6265を尊重し、先頭のドットを無視します。つまり、サブドメインとトップレベルドメインでCookieを使用できます。

要約すると、上の2番目の例のようにからCookieを設定すると、はにmydomain.comアクセスできsubdomain.mydomain.com、その逆も同様です。これは、Cookieの許可sub1.mydomain.comsub2.mydomain.com共有にも使用できます。

以下も参照してください。


3
ありがとう。ドットの重要性についてのメモを追加しました。
cmbuckley 14

2
なぜ先頭に "。"を付けないのかわかりません。新旧との最大の互換性のためにドメイン上で
アランマクドナルド

12
以前の標準では、を使用したCookie domain=.mydomain.comは裸のmydomain.comには無効であるため、2つのRFCは互いに互換性がありません。
cmbuckley

4
@フランク、はい、知っています。私のコメントは、私の質問が2つのサブドメイン間ではなく、ドメインとサブドメイン間でのCookieの共有に関するものであることを明確にすることでした。
adam0101 2018

3
これをどこに置くかわからないので、受け入れられた回答のコメントを選択します。名前にドットを含むlocalhostを呼び出さなければならないことに気付くまで、私のローカルホストで上記を証明するには長い時間がかかり、実験に失敗しました。「localhost.com」のようなものです。次に、この回答でここに書かれた説明に従って、すべての「Cookieの設定」動作が開始されました。これが誰かを助けることを願っています。
Cesc

32

@cmbuckleyの回答が全体像を示しているかどうかはわかりません。私が読んだものは:

Cookieの属性がそうでないことを示していない限り、Cookieは元のサーバーにのみ返され(たとえば、サブドメインには返されません)、現在のセッションの終了時に期限切れになります(ユーザーエージェントによって定義されます)。ユーザーエージェントは、認識されないCookieを無視します。

RFC 6265

また

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

つまり、Cookieがサブドメイン/ドメインによって読み取られるのを防ぐことはできますが、他のドメインへのCookieの書き込みを防ぐことはできません。そのため、誰かが同じブラウザがアクセスする別のサブドメインを制御することにより、サイトのCookieを書き換えることがあります。これは大きな問題ではないかもしれません。

@cmbuckleyが提供する素晴らしいcookieテストサイト/私のように彼の答えでそれを逃した人のために; 上にスクロールして投票する価値がある/:


4
それは私が言っていることに同意するようです:を指定しない限りdomain、Cookieはリクエストホストにのみ使用されます。これは、サブドメインへのリクエストではSet-Cookie: name=valuefrom mydomain.comが送信されないことを意味します。でプレーしていこのテストスクリプトを過ぎます。
cmbuckley

@cmbuckley、わかりました、あなたの言ったことは正しいようです。答えを書き直します。指摘いただきありがとうございます。
akostadinov

指摘する必要があるのは、セクション4.1.2(最初の引用)は規範的ではないということです
Velda

cmbuckleyリンクに感謝します。それがどのように素早く機能するかをテストするのは素晴らしいことです。
lawphotog

22

これはDOM cookie API(https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie)を使用した例なので、動作を自分で確認できます。

次のJavaScriptを実行すると、

document.cookie = "key = value"

それは実行と同じように見えます:

document.cookie = "key = value; domain = mydomain.com"

cookie キーは、ドメインmydomain.comで(のみ)使用可能になります。


ここで、mydomain.comで次のJavaScriptを実行すると、

document.cookie = "key = value; domain = .mydomain.com"

クッキーのキーが利用できるようになりmydomain.comなどsubdomain.mydomain.com


最後に、subdomain.mydomain.comで以下を実行しようとした場合:

document.cookie = "key = value; domain = .mydomain.com"

cookie キーsubdomain.mydomain.comで利用できるようになりますか?これが許可されていることに少し驚きました。親ドメインにCookieを設定できるのはサブドメインのセキュリティ違反だと思っていました。


1
これによりhttponly、作成するCookieの種類とCookieの動作を記述する個別の仕様があるかどうか疑問に思います。
adam0101 2017

3
あなたが投稿したドキュメントは、あなたの発言に同意しません。最初の2つの例は同等ではありませんdomain属性によりCookieはサブドメインで機能しますが、そのような属性では機能しません)。先頭のドットは無視され、最悪の場合はアクティブにブロックされます。
cmbuckley 2018年

これは、ホストヘッダーに依存したくない場合に最適なソリューションです。私はそれとその動作をチェックしました
Szymon

14

ドメインのサブドメインからCookieを設定できることにご注意ください。

(リクエストに対する応答で送信されますsubdomain.mydomain.com

Set-Cookie: name=value; Domain=mydomain.com // GOOD

ただし、サブドメインのドメインからCookieを設定することはできません

(リクエストに対する応答で送信されますmydomain.com

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

どうして ?

仕様RFC 6265のセクション5.3.6ストレージモデルによると

正規化されたリクエストホストがドメイン属性とドメイン一致しない場合:Cookieを完全に無視し、これらの手順を中止します。

およびRFC 6265セクション5.1.3ドメインマッチング

ドメインマッチング

文字列domain-matchは、次の条件の少なくとも1つが満たされた場合に、指定されたドメイン文字列と一致します。

  1. ドメイン文字列と文字列は同じです。(この時点では、ドメイン文字列と文字列の両方が小文字に正規化されていることに注意してください。)

  2. 次の条件がすべて満たされます。

    • ドメイン文字列は、文字列のサフィックスです。

    • ドメイン文字列に含まれていない文字列の最後の文字は、%x2E( "。")文字です。

    • 文字列はホスト名です(つまり、IPアドレスではありません)。

したがって、「subdomain.mydomain.com」は「mydomain.com」に一致しますが、「mydomain.com」は「subdomain.mydomain.com」に一致しません

この回答も確認してください。


これは私にとって最も役立つ答えでした。
Toby

3

どちらの場合も可能です。これはIEとEdgeの両方のデフォルトの動作です。

他の回答は貴重な洞察を追加しますが、主にChromeでの動作を説明します。IEでは動作が完全に異なることに注意することが重要です。CMBuckleyの非常に役立つテストスクリプトは、(たとえば)Chromeでは、ドメインが指定されていない場合、ルートドメインとサブドメイン間でCookieが共有されないことを示しています。ただし、IEでの同じテストは、それらが共有されていることを示しています。このIEのケースは、CMBuckleyのwww-or-not-wwwリンクの持ち帰りの説明に近いものです。ルートとサブドメインの両方で異なるservicestack cookieを使用するシステムがあるため、これが事実であることはわかっています。誰かがIEでアクセスし、2つのシステムがセッションCookieを勝ち取り、キャッシュを破壊するまで、問題なく動作しました。


0

localhostで作業している場合は注意してください。次のようにあなたのクッキーをjsに保存すると:

document.cookie = "key=value;domain=localhost"

など、サブドメインにアクセスできない場合がありますsub.localhost。この問題を解決するには、仮想ホストを使用する必要があります。たとえば、仮想ホストを設定してServerName localhost.com、次のようにドメインとサブドメインにCookieを保存できます。

document.cookie = "key=value;domain=localhost.com"

-12

シンプルなソリューション

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

Setcookieの5番目のパラメータは、Cookieが利用可能な(サブ)ドメインを決定します。(EXAMPLE.COM)に設定すると、すべてのサブドメイン(例:SUBDOMAIN.EXAMPLE.COM)で使用できるようになります。

リファレンス:http : //php.net/manual/en/function.setcookie.php


17
この質問はPHP固有ではありません。有効だとは思われません。
sergelerator

1
Sergelerator、私は質問をしませんでした。私はOPに応答していました。
法律2009

4
@Lawes sergelatorは、OPの質問がPHP固有のものではないことを意味しますが、あなたの回答はPHPのみのソリューションのようで、OPの質問には当てはまりません。
ミラージュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.