web-dev-qa-db-fra.com

Plusieurs en-têtes de cookie Ensemble à HTTP

J'écris une petite classe qui agit comme un client HTTP très basique. Dans le cadre d'un projet sur lequel je travaille, je suis au courant des cookies. Cependant, il n'est pas clair pour moi ce qui se passe lorsque mon client reçoit plusieurs en-têtes "Set-Cookie" de la même clé, mais différentes valeurs sont définies.

Par exemple,

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

Lequel d'entre eux est censé être la valeur pour phpsessid? Cela finit généralement par se produire lorsque vous appelez session_start (), puis session_regenèrent_id () sur la même page. Chacun définira sa propre tête. Tous les navigateurs semblent aller bien avec cela, mais je ne peux pas sembler obtenir mon client de choisir le bon.

Des idées?!

29
Scott

RFC 6265 Section 4.1.2 States:

Si l'agent utilisateur reçoit un nouveau cookie avec le même nom de cookie,
valeur de domaine et valeur de chemin comme un cookie qu'il a déjà stocké,
[.____] Le cookie existant est expulsé et remplacé par le nouveau cookie.
Remarquez que les serveurs peuvent supprimer des cookies en envoyant l'agent utilisateur A
[.____] Nouveau cookie avec un attribut expiré avec une valeur dans le passé.

Je traiterais donc les en-têtes en ordre donné et écrasez-les s'il y a duplicata. Donc, dans votre cas, vous auriez juste un phpsessid = ghi.

27
Snives

RFC 6265 états:

Les serveurs ne doivent pas inclure plus d'un champ d'en-tête Set-Cookie dans la même réponse avec le même nom de cookie.

Je serais donc très inquiet si votre service envoie plusieurs en-têtes de cookie dans la même clé. Surtout parce que j'ai vu des agents d'utilisateur et des mandataires se comporter de manière inattendue - prenant parfois la valeur de la première en-tête, réorganisant parfois des en-têtes.

En tant que client, le comportement typique de l'agent utilisateur semble être de prendre la valeur de la dernière en-tête. Le RFC fait allusion à ce comportement avec cette déclaration:

Si l'agent utilisateur reçoit un nouveau cookie avec le même nom de cookie, la même valeur de domaine et la même valeur de chemin comme cookie qu'il a déjà stocké, le cookie existant est expulsé et remplacé par le nouveau cookie.

19
Brad Koch

La réponse est censée être dans brouillon-ietf-httpstate-cookie .

2
Julian Reschke