Compartir cookies entre subdominio y dominio
Tengo dos preguntas. Entiendo que si especifico el dominio como .example.com
(con el punto inicial) en la cookie, todos los subdominios pueden compartir una cookie.
¿ Se puede subdomain.example.com
acceder a una cookie creada en example.com
(sin el www
subdominio)?
¿ Se puede example.com
(sin el www
subdominio) acceder a la cookie si se creó en subdomain.example.com
?
Si configura una cookie como esta:
Set-Cookie: name=value
entonces la cookie solo se aplicará al dominio de solicitud y solo se enviará para solicitudes exactamente al mismo dominio, no a ningún otro subdominio. (Consulte ¿Qué es una cookie "solo de host"? )
Dos dominios diferentes (por ejemplo , y o example.com
y ) solo pueden compartir cookies si el atributo está presente en el encabezado:subdomain.example.com
sub1.example.com
sub2.example.com
domain
Set-Cookie: name=value; domain=example.com
El atributo de dominio debe coincidir con la URL de solicitud para que sea válido, lo que básicamente significa que debe ser el dominio de solicitud o un dominio "principal". Entonces, esto se aplica a ambos ejemplos de la pregunta, así como al uso compartido entre dos subdominios separados.
Esta cookie luego se enviaría a example.com
cualquier subdominio deexample.com
, incluidos los subdominios anidados como subsub.subdomain.example.com
. (Tenga en cuenta que hay otros atributos que podrían restringir el alcance de la cookie y cuándo es enviada por el navegador, como path
o Secure
).
Debido a la forma en que funciona la coincidencia de dominios, si desea sub1.example.com
compartir sub2.example.com
cookies, también deberá compartirlas con sub3.example.com
.
Ver también:
- www vs no-www y cookies
- setcookie.net : un sitio donde puedes probarlo (descargo de responsabilidad: desarrollado por mí, para esta pregunta)
Una nota sobre los puntos iniciales en domain
los atributos: a principios de RFC 2109domain=.example.com
, solo se podían usar dominios con un punto inicial ( ) en todos los subdominios. Pero esto no se pudo compartir con el dominio de nivel superior, por lo que lo que usted solicita no era posible en la especificación anterior.
Sin embargo, la especificación más reciente RFC 6265 ignora cualquier punto inicial, lo que significa que puede utilizar la cookie tanto en subdominios como en el dominio de nivel superior.
Tengan en cuenta que pueden configurar una cookie desde un subdominio en un dominio.
(enviado en la respuesta para solicitar subdomain.example.com
)
Set-Cookie: name=value; Domain=example.com // GOOD
Pero no puedes configurar una cookie de un dominio en un subdominio.
(enviado en la respuesta para solicitar example.com
)
Set-Cookie: name=value; Domain=subdomain.example.com // Browser rejects cookie
¿Por qué?
De acuerdo con las especificaciones, RFC 6265 sección 5.3.6 Modelo de almacenamiento ,
Si el host de solicitud canonicalizado no coincide con el atributo de dominio: ignore la cookie por completo y cancele estos pasos.
y RFC 6265 sección 5.1.3 Coincidencia de dominios ,
Coincidencia de dominio
Un dominio de cadena coincide con una cadena de dominio determinada si se cumple al menos una de las siguientes condiciones:
La cadena de dominio y la cadena son idénticas. (Tenga en cuenta que tanto la cadena de dominio como la cadena se habrán canonicalizado a minúsculas en este punto).
Se cumplen todas las condiciones siguientes:
* The domain string is a suffix of the string. * The last character of the string that is not included in the domain string is a %x2E (".") character. * The string is a host name (i.e., not an IP address).
Entonces subdomain.example.com
el dominio coincide example.com
, pero example.com
no el dominio coincidesubdomain.example.com
Compruebe esta respuesta también.
No estoy seguro de que la respuesta de cmbuckley muestre la imagen completa. Lo que leo es:
A menos que los atributos de la cookie indiquen lo contrario, la cookie se devuelve únicamente al servidor de origen (y no, por ejemplo, a ningún subdominio) y caduca al final de la sesión actual (según lo definido por el agente de usuario). Los agentes de usuario ignoran las cookies no reconocidas.
RFC 6265
También
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.
Para mí, eso significa que puede proteger las cookies para que no sean leídas por el subdominio/dominio, pero no puede evitar que se escriban cookies en los otros dominios. Por lo tanto, alguien puede reescribir las cookies de su sitio controlando otro subdominio visitado por el mismo navegador. Lo cual quizá no sea una gran preocupación.
Impresionante sitio de prueba de cookies proporcionado por cmbuckley y para aquellos que se lo perdieron en su respuesta como yo; vale la pena desplazarse hacia arriba.
- Prueba de galletas
A continuación se muestra un ejemplo que utiliza la API de cookies DOM , para que podamos ver el comportamiento por nosotros mismos.
Si ejecutamos el siguiente código JavaScript,
document.cookie = "key=value"
parece ser lo mismo que ejecutar:
document.cookie = "key=value;domain=example.com"
La clave de cookie estará disponible (únicamente) en el dominio ejemplo.com .
Ahora, si ejecuta el siguiente código JavaScript en example.com
,
documento.cookie = "clave=valor;dominio=.ejemplo.com"
la clave de cookie pasa a estar disponible example.com
también para subdomain.example.com
.
Finalmente, si intentara ejecutar lo siguiente en subdomain.example.com
,
document.cookie = "key=value;domain=.example.com"
¿La clave de cookies estará disponible para subdomain.example.com
? Me sorprendió un poco que esto estuviera permitido; Supuse que sería una violación de seguridad que un subdominio pudiera configurar una cookie en un dominio principal.