Chrome, Firefox, Edge y otros cambian su comportamiento predeterminado de acuerdo con la IETF propuesta, Cookies cada vez mejores de modo que:
- Las cookies sin un atributo
SameSite
se consideranSameSite=Lax
. lo que significa que el comportamiento predeterminado es restringir las cookies a las solo contextos. - Las cookies para el uso entre sitios deben especificar
SameSite=None; Secure
para y permitir la inclusión en contextos de terceros.
Si aún no lo has hecho, debes actualizar los atributos de tu cookies de terceros para que no se bloqueen en el futuro.
Casos de uso de las cookies entre sitios o de terceros
Hay una serie de casos de uso y patrones comunes en los que las cookies deben ser o enviarse en un contexto de terceros. Si proporcionas o dependes de uno de estos usos en este caso, asegúrate de que tú o el proveedor actualicen las cookies para a mantener el servicio funcionando de forma correcta.
Contenido en un <iframe>
El contenido de otro sitio que se muestra en una <iframe>
pertenece a un tercero
adicional. Los casos de uso estándar incluyen lo siguiente:
- El contenido incorporado y compartido desde otros sitios, como videos, mapas, muestras de código, y publicaciones de redes sociales.
- Widgets de servicios externos, como pagos, calendarios, reservas y y funciones de reservación.
- Widgets, como botones de redes sociales o servicios antifraude, que crean un entorno menos obvio
<iframes>
Aquí se pueden usar cookies para, entre otras cosas, mantener el estado de la sesión, almacenar preferencias generales, habilitar estadísticas o personalizar el contenido para los usuarios con cuentas existentes.
![Diagrama de una ventana del navegador en la que la URL del contenido incorporado no coincide con la de la página.](https://web.developers.google.cn/static/articles/samesite-cookie-recipes/image/diagram-a-browser-window-809ed902fbce7.png?authuser=7&hl=es-419)
Como la Web es componible de forma inherente, también se usa <iframes>
para incorporar.
contenido visto en un contexto propio o de nivel superior. Cualquier cookie del sitio
que se muestran en el iframe se consideran cookies de terceros. Si estás
crear sitios que quieres que otros sitios incorporen y necesitas cookies para hacerlos
también debes asegurarte de que estén marcados para uso entre sitios o que
pueden recurrir con elegancia sin ellos.
"No es seguro" solicitudes entre sitios
"No es seguro" puede sonar preocupante, pero se refiere a cualquier solicitud que
que se pretende cambiar de estado. En la Web, son principalmente solicitudes POST. Galletas
marcados como SameSite=Lax
se envían en navegaciones seguras de nivel superior, como cuando se hace clic en un
para ir a otro sitio. Sin embargo, algo como una entrega de <form>
a
otro sitio que usa POST no incluye cookies.
![Diagrama de una solicitud que se traslada de una página a otra.](https://web.developers.google.cn/static/articles/samesite-cookie-recipes/image/diagram-a-request-moving-46b47373768e3.png?authuser=7&hl=es-419)
Este patrón se utiliza para los sitios que pueden redireccionar al usuario a un sitio web
para que el servicio realice alguna operación antes de regresar, por ejemplo, redireccionar a
o un proveedor de identidad de terceros. Antes de que el usuario abandona el sitio, se crea una cookie
que contenga un único token de uso con la expectativa de que este se pueda
en la solicitud de retorno para mitigar
Falsificación de solicitudes entre sitios (CSRF)
de ataques de seguridad cibernética. Si esa solicitud devuelta proviene de POST, deberás marcar el
cookies como SameSite=None; Secure
.
Recursos remotos
Cualquier recurso remoto de una página, como las etiquetas <img>
o <script>
podrían depender del envío de cookies
con una solicitud. Entre los casos de uso comunes, se incluyen los siguientes:
los píxeles de seguimiento y la personalización del contenido.
Esto también se aplica a las solicitudes enviadas desde tu JavaScript con fetch
o
XMLHttpRequest
Si se llama a fetch()
con el elemento
Opción credentials: 'include'
,
es probable que esas solicitudes incluyan cookies.
Para XMLHttpRequest
, las cookies esperadas se suelen indicar con un
Valor withCredentials
por true
. Esas cookies deben estar debidamente marcadas para que se incluyan en
entre sitios.
Contenido dentro de WebView
Una WebView en una app específica de una plataforma funciona con la tecnología de un navegador. Los desarrolladores deben comprobar si las restricciones o los problemas que afectan a sus apps también se aplican los WebViews de su app.
Android también permite que las apps específicas de la plataforma configuren cookies directamente usando el
API de CookieManager.
Tal como sucede con las cookies configuradas con encabezados o JavaScript, considera incluir
SameSite=None; Secure
si están destinados al uso entre sitios.
Cómo implementar SameSite
hoy mismo
Marca como SameSite=Lax
las cookies que solo son necesarias en un contexto propio
o SameSite=Strict
según tus necesidades. Si no marcas estas cookies
y dependen del comportamiento predeterminado
del navegador para manejarlas, pueden comportarse
de forma inconsistente en los navegadores y pueden activar advertencias en la consola para cada
cookie.
Set-Cookie: first_party_var=value; SameSite=Lax
Asegúrate de marcar las cookies necesarias en un contexto de terceros como
SameSite=None; Secure
Ambos atributos son obligatorios. Si solo especificas
None
sin Secure
, se rechazará la cookie. Para tener en cuenta las diferencias
en implementaciones de navegadores, quizás debas usar algunas de las herramientas
estrategias descritas en Cómo manejar clientes incompatibles.
Set-Cookie: third_party_var=value; SameSite=None; Secure
Cómo controlar clientes incompatibles
Dado que estos cambios para incluir None
y actualizar el comportamiento predeterminado aún se mantienen
relativamente nuevos, los diferentes navegadores los manejan de distintas maneras. Puedes recomendar
a la página de actualizaciones en chromium.org
para obtener una lista de problemas conocidos, pero es posible que esta lista no sea exhaustiva.
Una posible solución alternativa es configurar cada cookie tanto en el estilo nuevo como en el anterior:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
Los navegadores que implementan el comportamiento más reciente configuran la cookie con el SameSite
.
valor. Los navegadores que no implementan el comportamiento nuevo ignoran ese valor y establecen
la cookie 3pcookie-legacy
Cuando procesas cookies incluidas, tu sitio debe
primero comprueba la presencia del nuevo estilo de cookie y, luego, recurre a
la cookie heredada si no puede encontrar una nueva.
En el siguiente ejemplo, se muestra cómo hacer esto en Node.js con el comando Framework Express y su middleware cookie-parser:
const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());
app.get('/set', (req, res) => {
// Set the new style cookie
res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
// And set the same value in the legacy cookie
res.cookie('3pcookie-legacy', 'value', { secure: true });
res.end();
});
app.get('/', (req, res) => {
let cookieVal = null;
if (req.cookies['3pcookie']) {
// check the new style cookie first
cookieVal = req.cookies['3pcookie'];
} else if (req.cookies['3pcookie-legacy']) {
// otherwise fall back to the legacy cookie
cookieVal = req.cookies['3pcookie-legacy'];
}
res.end();
});
app.listen(process.env.PORT);
Este enfoque requiere que hagas un trabajo adicional para configurar cookies redundantes cambia cuando se configura y se lee la cookie. Sin embargo, debería abarcan todos los navegadores, independientemente de su comportamiento, y mantienen las cookies de terceros en pleno funcionamiento.
Como alternativa, puedes detectar el cliente usando la cadena de usuario-agente cuando un
Se envió el encabezado Set-Cookie
. Consulta las
lista de clientes no compatibles,
y usar una biblioteca de detección
de usuario-agente adecuada para tu plataforma
ejemplo, la biblioteca ua-parser-js
en Node.js. Este enfoque solo requiere que hagas un cambio, pero el usuario-agente
o sniffing, es posible que no
atraiga a todos los usuarios afectados.
Compatibilidad con SameSite=None
en lenguajes, bibliotecas y frameworks
La mayoría de los lenguajes y las bibliotecas admiten el atributo SameSite
para
cookies. Sin embargo, dado que la adición de SameSite=None
sigue siendo relativamente
reciente, es posible que debas solucionar algún comportamiento estándar por ahora.
Estos comportamientos se documentan en el
Repositorio de ejemplos de SameSite
en GitHub.
Cómo obtener ayuda
Las cookies se usan en cualquier lugar de la Web, y es poco común que cualquier equipo de desarrollo tenga conocimiento absoluto del lugar donde se configura y usa su sitio, sobre todo en casos de uso entre sitios. Cuando encuentras un problema, es posible que sea la primera vez si alguien lo ha encontrado, no dudes en comunicarte con nosotros:
- Plantea un problema en el
Repositorio de ejemplos de
SameSite
en GitHub. - Haz una pregunta en el “mismositio” en StackOverflow.
- Si tienes problemas con el comportamiento de Chromium, informa un error en el Herramienta de seguimiento de errores de Chromium.
- Sigue el progreso de Chrome en la
Página de actualizaciones de
SameSite
.