2つの質問があります。.mydomain.com
Cookieでドメインを(先頭にドットを付けて)指定すると、すべてのサブドメインがCookieを共有できることを理解しています。
(サブドメインなしで)でsubdomain.mydomain.com
作成されたCookieにアクセスできますか?mydomain.com
www
で作成された場合mydomain.com
、(www
サブドメインなしで)Cookieにアクセスできますsubdomain.mydomain.com
か?
2つの質問があります。.mydomain.com
Cookieでドメインを(先頭にドットを付けて)指定すると、すべてのサブドメインがCookieを共有できることを理解しています。
(サブドメインなしで)でsubdomain.mydomain.com
作成されたCookieにアクセスできますか?mydomain.com
www
で作成された場合mydomain.com
、(www
サブドメインなしで)Cookieにアクセスできますsubdomain.mydomain.com
か?
回答:
2つのドメイン。Cookie mydomain.com
をsubdomain.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.com
とsub2.mydomain.com
共有にも使用できます。
以下も参照してください。
domain=.mydomain.com
は裸のmydomain.comには無効であるため、2つのRFCは互いに互換性がありません。
@cmbuckleyの回答が全体像を示しているかどうかはわかりません。私が読んだものは:
Cookieの属性がそうでないことを示していない限り、Cookieは元のサーバーにのみ返され(たとえば、サブドメインには返されません)、現在のセッションの終了時に期限切れになります(ユーザーエージェントによって定義されます)。ユーザーエージェントは、認識されないCookieを無視します。
また
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テストサイト/私のように彼の答えでそれを逃した人のために; 上にスクロールして投票する価値がある/:
domain
、Cookieはリクエストホストにのみ使用されます。これは、サブドメインへのリクエストではSet-Cookie: name=value
from mydomain.com
が送信されないことを意味します。でプレーしていこのテストスクリプトを過ぎます。
これは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を設定できるのはサブドメインのセキュリティ違反だと思っていました。
httponly
、作成するCookieの種類とCookieの動作を記述する個別の仕様があるかどうか疑問に思います。
domain
属性によりCookieはサブドメインで機能しますが、そのような属性では機能しません)。先頭のドットは無視され、最悪の場合はアクティブにブロックされます。
ドメインのサブドメインから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つが満たされた場合に、指定されたドメイン文字列と一致します。
ドメイン文字列と文字列は同じです。(この時点では、ドメイン文字列と文字列の両方が小文字に正規化されていることに注意してください。)
次の条件がすべて満たされます。
ドメイン文字列は、文字列のサフィックスです。
ドメイン文字列に含まれていない文字列の最後の文字は、%x2E( "。")文字です。
文字列はホスト名です(つまり、IPアドレスではありません)。
したがって、「subdomain.mydomain.com」は「mydomain.com」に一致しますが、「mydomain.com」は「subdomain.mydomain.com」に一致しません
この回答も確認してください。
どちらの場合も可能です。これはIEとEdgeの両方のデフォルトの動作です。
他の回答は貴重な洞察を追加しますが、主にChromeでの動作を説明します。IEでは動作が完全に異なることに注意することが重要です。CMBuckleyの非常に役立つテストスクリプトは、(たとえば)Chromeでは、ドメインが指定されていない場合、ルートドメインとサブドメイン間でCookieが共有されないことを示しています。ただし、IEでの同じテストは、それらが共有されていることを示しています。このIEのケースは、CMBuckleyのwww-or-not-wwwリンクの持ち帰りの説明に近いものです。ルートとサブドメインの両方で異なるservicestack cookieを使用するシステムがあるため、これが事実であることはわかっています。誰かがIEでアクセスし、2つのシステムがセッションCookieを勝ち取り、キャッシュを破壊するまで、問題なく動作しました。
localhostで作業している場合は注意してください。次のようにあなたのクッキーをjsに保存すると:
document.cookie = "key=value;domain=localhost"
など、サブドメインにアクセスできない場合がありますsub.localhost
。この問題を解決するには、仮想ホストを使用する必要があります。たとえば、仮想ホストを設定してServerName
localhost.com
、次のようにドメインとサブドメインにCookieを保存できます。
document.cookie = "key=value;domain=localhost.com"
シンプルなソリューション
setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);
Setcookieの5番目のパラメータは、Cookieが利用可能な(サブ)ドメインを決定します。(EXAMPLE.COM)に設定すると、すべてのサブドメイン(例:SUBDOMAIN.EXAMPLE.COM)で使用できるようになります。