同じ名前の複数のCookieを処理する方法は?


92

たとえば、「a」という名前のCookieに設定する次のHTTPヘッダーを送信するアプリケーションがあるとします。

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

/exampleサーバーにアクセスすると、両方のパスが有効になるため、「a」という名前の2つのCookieがあります。ブラウザはパス情報を送信しないため、2つのCookieを区別することはできません。

Cookie: a=2; a=1

このケースはどのように処理する必要がありますか?最初のものを選びますか?すべてのCookie値を含むリストを作成しますか?それとも、そのような場合は開発者の間違いと見なされるべきですか?


クッキー名の重複を避けるために最善を尽くします(読む:できる限りのこと)。ほとんどの人はこの問題に遭遇したことがありません-正当な理由があります。

ウェブサイトはそれ自身のクッキーしか読むことができません。他のウェブサイト/ドメインのCookieを読み取ることはできません。このセキュリティはブラウザによって保証されます。これは全くの初心者のためのヒントかもしれません(私はこの混乱がありました)
Arun

回答:


38

SitePointのこの記事から:

同じ名前の複数のCookieが特定のリクエストURIに一致する場合、ブラウザによって1つが選択されます。

パスが具体的であるほど、優先順位は高くなります。ただし、ドメインを含む他の属性に基づく優先順位は指定されておらず、ブラウザによって異なる場合があります。つまり、「。example.org」と「www.example.org」に対して同じ名前のCookieを設定した場合、どちらが返送されるかわからないということです。

編集:2010年のこの情報は古くなっているようです。ブラウザは複数のCookieを送信できるようになりました。詳細については、以下の@Nateによる回答をご覧ください。


9
では、どうすれば複数の同一のCookieを削除できますか?私はこれを2日間叩きましたが、重複したCookieは破壊できないようです。
ボブジョーンズ

13
@Brantその記事は少し間違っているかもしれません-Chromeが同じ名前(ただしパスが異なる)の2つのCookieを送り返すのを見たので、「1つはブラウザによって選択されます」は必ずしも真実ではありません。最も深いパスのCookieが最初に送信されましたが、これは妥当なようです。そして、別のクッキーもその間にありました。
Jonas N

3
Firefox(15)も同じ名前の2つのCookieを送信します!ドメイン.a.comとホスト用の2つのCookieが発生した場合a.com
Taha Jahangir 2012

確かに、この情報は間違っています。@Nateの答えは正しいとマークされるべきです。
ダンミロン2014

4
404:有名な@Nateの答えが見つかりません。
d.popov

90

SitePointの記事を参照する答えは完全ではありません。参照してくださいRFC 6265を(この質問は以前より優先され、投稿された後に公平であるために、このRFCは2011年にリリースされたRFC 2965を2000からRFC 2109 1997から)。

セクション5.4、サブセクション2には、次のように書かれています。

ユーザーエージェントは、Cookieリストを次の順序で並べ替える必要があります。

  • パスが長いCookieは、パスが短いCookieの前に一覧表示されます。

注:すべてのユーザーエージェントがCookieリストをこの順序で並べ替えるわけではありませんが、この順序は、このドキュメントが作成されたときの一般的な慣行を反映しており、歴史的に、この順序に(誤って)依存していたサーバーがありました。

セクション4.2.2にもこの小さな宝石があります:

...サーバーはシリアル化の順序に依存すべきではありません。特に、Cookieヘッダーに同じ名前の2つのCookieが含まれている場合(たとえば、異なるパスまたはドメイン属性で設定されている場合)、サーバーはこれらのCookieがヘッダーに表示される順序に依存しないでください。

リクエストCookieの例(Cookie:a = 2; a = 1)では、パス/ examplea = 2)で設定されたCookieは、パス/a = 1)で設定されたCookieよりも長いパスを持っていることに注意してください。仕様の推奨事項と一致する最初の行で返送されます。したがって、最初の値を選択できるという仮定は多かれ少なかれ正しいです。

残念ながら、RFCで使用される言語は非常に具体的です。「SHOULD」および「SHOULDNOT」という単語を使用すると、RFCにあいまいさが生じます。これらは、従う必要のある規則を示していますが、仕様に準拠している必要はありません。私はこれに関するRFCをよく理解していますが、実際のクライアントが何をしているのかを調べるための調査は行っていません。HTTPクライアントとして機能する1つ以上のブラウザまたは他のソフトウェアが、Cookie:ヘッダーの最初に最長パスのCookie(例:/ example)を送信しない可能性があります。

Cookieの値を制御する立場にあり、ソリューションを確実なものにしたい場合は、次のいずれかを実行するのが最善です。

  1. 次のような特定のパスでオーバーライドするために別のCookie名を使用する。

    • Set-cookie:a-global = 1; Path = /; Version = 1
    • Set-cookie:a-example = 2; Path = / example; Version = 1
  2. 必要なパスをCookie値自体に保存します。

    • Set-cookie:a = 1&path = /; Path = /; Version = 1
    • Set-cookie:a = 2&pat​​h = / example; Path = / example; Version = 1

これらの回避策はどちらも、要求されたURLを使用可能なCookieのリストと比較することにより、サーバー上で目的のCookie値を選択するための追加のロジックを必要とします。あまりきれいではありません。残念ながら、RFCには、長いパスが短いパスのCookieを完全にオーバーライドすることを要求する先見性がありませんでした(たとえば、この例では、Cookie:a = 2 のみを受け取ります)。


2
これらのいまいましいRFCからこれを掘り下げてくれてありがとう!//誰もこれらの推奨事項に従わないのに、なぜわざわざそれらを読むのか?..
最終

3
Wildfly 8.0はCookieの順序に注意を払い、最初のCookieを使用しているようです。これにより、「ネストされた」コンテキストで別のアプリを実行できます。ただし、一部のブラウザがRFCの推奨事項に従わない場合は失敗します。JSESSIONID2のように、セッションCookieの別の名前を設定するための正しい方法。
honzajde 2015年

2
私はあなたの答えを読んだ後、主要なブラウザをテストしました:Chrome 63 / Opera 55 / IE11 / Edge 16 / Safari 11 / Firefox 58そして、長いパスのCookieが短いパスのCookieよりも前にあることをすべて正しく処理しているようです。また、PHP(バージョン7でテスト済み)では、$ _ COOKIE変数に設定されている最初のCookieのみを読み取ります。
アレクサンダーシュランツ2018

1
path=/;Path=/仕様はFRC-6265に準拠していますか?私はそのような言及を見つけませんでした。 Tomcatは「;」を脅かします 誤ったシンボルとしてパスに
Hubbitus 2018

1
@Hubbitus注意してください、それはパスにa=2&path=/example;Path=/exampleないの;でです。
フランクリンユー

2

同じ名前に複数の値を設定しても問題はありません...必要に応じて。値に追加のコンテキストを埋め込むこともできます。

そうでない場合は、もちろん、両方のコンテキストが必要な場合は、異なる名前が解決策になります。

別の方法は、より具体的なパスからでも同じパス(およびドメイン)で同じCookie名を送信することです。これらの設定されたCookie命令は、そのCookieの値を上書きします。

最も重要な部分(それらがどのように機能するか)を理解し、いくつかの異なる方法で必要なことを達成できるようになったので、あなたの質問に対する私の答えは、これは開発者の問題です。


0

私は確かに、複数のセッションIDを使用してこれを広範囲に実行するアプリケーションを認識しており、一貫して機能しているようです。ただし、ブラウザがCookieをいつ設定されたか、どのパスに設定されたか、またはアプリがそれぞれに一致させようとするかどうかに応じて一貫した順序でCookieを返すため、Cookieが返されるかどうかはわかりません。既存のセッションに1つ。

この方法は避けることを強くお勧めします。

ただし、ブラウザー(およびアプリ)がこのシナリオをどのように処理するかを本当に知りたい場合は、テストリグを作成して試してみてください。


2
サーバーは、ブラウザーからサーバーに送信される内容を制御できません。それでも処理する必要があります。
マーティンオコナー

0

Java / Scalaフレームワークを使用している場合Play:気を付けてください!リクエストに同じ名前の複数のCookieが含まれている場合、Playはそのうちの1つのみをコードに提示します。


-2

それらを区別する必要がある場合は、異なるキー値を指定する必要があります。

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