Digamos, por ejemplo, que tenía una aplicación que enviaba los siguientes encabezados HTTP para configurar una cookie llamada "a":
Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1
Si accedo /example
al servidor, ambas rutas son válidas, ¡así que tengo dos cookies llamadas "a"! Dado que el navegador no envía ninguna información de ruta, no se pueden distinguir las dos cookies.
Cookie: a=2; a=1
¿Cómo se debe manejar este caso? ¿Elige el primero? ¿Crear una lista con todos los valores de las cookies? ¿O debería considerarse tal caso como un error del desarrollador?
Respuestas:
De este artículo en SitePoint :
Editar: esta información de 2010 parece estar desactualizada, parece que los navegadores ahora pueden enviar múltiples cookies a cambio, vea la respuesta de @Nate a continuación para obtener más detalles
fuente
.a.com
y hosta.com
La respuesta que hace referencia a un artículo en SitePoint no está del todo completa. Consulte RFC 6265 (para ser justos, este RFC se publicó en 2011 después de que se publicara esta pregunta, que reemplaza al RFC 2965 anterior de 2000 y al RFC 2109 de 1997).
La sección 5.4 , subsección 2 tiene esto que decir:
También está esta pequeña joya en la sección 4.2.2 :
En su cookie de solicitud de ejemplo ( Cookie: a = 2; a = 1 ) tenga en cuenta que la cookie configurada con la ruta / ejemplo ( a = 2 ) tiene una ruta más larga que la que tiene la ruta / ( a = 1 ) y por lo tanto se le envía el primero en la fila, que coincide con la recomendación de la especificación. Por lo tanto, está más o menos en lo correcto al suponer que podría seleccionar el primer valor.
Desafortunadamente, el lenguaje utilizado en las RFC es extremadamente específico: el uso de las palabras DEBE y NO DEBE introducir ambigüedad en las RFC. Estos indican convenciones que deben seguirse, pero no es necesario que cumplan con la especificación. Si bien entiendo el RFC para esto bastante bien, no he hecho la investigación para ver qué hacen los clientes del mundo real; Es posible que uno o más navegadores u otros softwares que actúen como clientes HTTP no envíen la cookie de ruta más larga (por ejemplo: / ejemplo ) primero en el encabezado Cookie:.
Si está en condiciones de controlar el valor de la cookie y desea que su solución sea infalible, lo mejor es:
usando un nombre de cookie diferente para anular en ciertas rutas, como:
almacenar la ruta que necesita en el valor de la cookie en sí:
Ambas soluciones requieren lógica adicional en el servidor para elegir el valor de cookie deseado, comparando la URL solicitada con la lista de cookies disponibles. No es demasiado bonito. Es lamentable que el RFC no haya tenido la previsión de requerir que una ruta más larga anule por completo una cookie con una ruta más corta (por ejemplo: en su ejemplo, recibiría Cookie: a = 2 solamente ).
fuente
path=/;Path=/
Cumple la especificación FRC-6265? No encontré tal mención. Tomcat amenaza cualquier ";" en la ruta como símbolo incorrectoa=2&path=/example;Path=/example
así que no hay;
camino.No hay nada de malo en tener varios valores para el mismo nombre ... si los quiere. Incluso puede insertar contexto adicional en el valor.
Si no lo hace, por supuesto, diferentes nombres son una solución si desea ambos contextos.
La alternativa es enviar el mismo nombre de cookie con la misma ruta (y dominio) incluso desde las rutas más específicas. Las instrucciones establecidas para las cookies sobrescribirán el valor de esa cookie.
Ahora que conoce la parte más importante (cómo funcionan) y que puede lograr lo que necesita de diferentes maneras, mi respuesta a su pregunta es: este es un problema de desarrollador.
fuente
Ciertamente estoy al tanto de las aplicaciones que hacen esto de manera extensiva utilizando múltiples identificadores de sesión, y parecen funcionar de manera consistente. Sin embargo, no sé, y no tengo la intención de averiguarlo, si lo hacen porque el navegador devuelve las cookies en un orden coherente según cuándo se establecieron / para qué ruta se establecieron o si la aplicación intenta hacer coincidir cada uno. uno a una sesión existente.
Recomiendo encarecidamente que se evite esta práctica.
Sin embargo, si realmente desea saber cómo los navegadores (y las aplicaciones) manejan este escenario, ¿por qué no construir un equipo de prueba y probarlo?
fuente
Si usa el framework Java / Scala Play: ¡cuidado! Si una solicitud contiene varias cookies con el mismo nombre, Play solo presentará 1 de ellas en su código.
fuente
Si necesita distinguirlos, debe asignarles valores clave diferentes.
fuente