web-dev-qa-db-ja.com

HTTPの複数のSet-Cookieヘッダー

私は非常に基本的なHTTPクライアントとして機能する小さなクラスを書いています。私が取り組んでいるプロジェクトの一環として、私はそれをCookieに対応させています。ただし、クライアントが同じキーを持つ複数の "Set-Cookie"ヘッダーを受信したが、異なる値が設定されている場合、どうなるかは不明です。

例えば、

Set-Cookie: PHPSESSID=abc; path=/
Set-Cookie: PHPSESSID=def; path=/
Set-Cookie: PHPSESSID=ghi; path=/

これらのうちどれがPHPSESSIDの値になるはずですか?これは通常、同じページでsession_start()を呼び出してからsession_regenerate_id()を呼び出すと発生します。それぞれが独自のヘッダーを設定します。すべてのブラウザでこれは問題ないようですが、クライアントに適切なブラウザを選択させることができません。

何か案は?!

29
Scott

RFC 6265セクション4.1.2 の状態:

ユーザーエージェントが同じcookie-nameを持つ新しいcookieを受け取った場合、
domain-value、およびpath-valueがすでに格納されているCookieとして、
既存のCookieは削除され、新しいCookieに置き換えられます。
サーバーがユーザーエージェントに
過去の値を持つExpires属性を持つ新しいCookie。

そのため、指定された順序でヘッダーを処理し、重複がある場合は上書きします。したがって、あなたの場合、PHPSESSID = ghiは1つだけです。

27
Snives

RFC 6265 状態:

サーバーは、同じcookie-nameを持つ同じ応答に複数のSet-Cookieヘッダーフィールドを含めないでください。

したがって、サービスが同じキーを使用して複数のSet-Cookieヘッダーを送信する場合、私は非常に心配します。特に、ユーザーエージェントとプロキシが予期しない動作をすることを確認したため、最初のヘッダーの値を取得したり、ヘッダーを並べ替えたりすることがあります。

クライアントとしての典型的なユーザーエージェントの動作は、最後のヘッダーの値を取ることです。 RFCは次のステートメントでその動作をほのめかしています。

ユーザーエージェントが、既に保存されているCookieと同じcookie-name、domain-value、およびpath-valueを持つ新しいcookieを受信した場合、既存のcookieは削除され、新しいcookieに置き換えられます。

19
Brad Koch

答えは draft-ietf-httpstate-cookie にあるはずです。

2
Julian Reschke