web-dev-qa-db-ja.com

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

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

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

mydomain.comで作成した場合、subdomain.mydomain.comwwwサブドメインなし)はcookieにアクセスできますか?

331
adam0101

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

たとえば、subdomain.mydomain.comから次のヘッダーを送信したとします。

Set-Cookie: name=value

そうすると、クッキーはmydomain.comへのリクエストに送信されません。ただし、次のものを使用すると、両方のドメインで使用可能になります。

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

RFC 2109 では、先頭にドットが付いていないドメインはサブドメインでは使用できないことを意味し、先頭のドット(.mydomain.com)だけが複数のサブドメインで使用できるようになります(ただし最上位ではありません)。ドメインなので、あなたが求めることは古い仕様では不可能でした)。

ただし、最近のすべてのブラウザは新しい仕様 RFC 6265 を尊重し、先頭のドットは無視します。つまり、最上位ドメインだけでなくサブドメインでもCookieを使用できます。

まとめると、mydomain.comから上記の2番目の例のようにcookieを設定した場合、subdomain.mydomain.comからアクセスでき、その逆も同様です。これはsub1.mydomain.comsub2.mydomain.comがクッキーを共有することを可能にするためにも使うことができます。

また見なさい:

509
cmbuckley

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

Cookieの属性が別の方法を示さない限り、CookieはOriginサーバーにのみ返され(サブドメインなどには返されません)、現在のセッションの終了時に期限切れになります(ユーザーエージェントの定義に従って)。ユーザーエージェントは認識できないクッキーを無視します。

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.

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

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

24
akostadinov

これは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 key は、ドメイン mydomain.com で(のみ)使用可能になります。


それでは、mydomain.comで次のJavaScriptを実行するとします。

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

Cookie key mydomain.com および subdomain.mydomain.com で使用可能になります。


最後に、subdomain.mydomain.comで次のコマンドを実行してみます。

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

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

16
llambda

どちらの場合も可能です、そしてこれがIEとEdge両方のデフォルトの振る舞いです。

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

3
DannyW