Recetas de galletas de SameSite

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 consideran SameSite=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.

Navegadores compatibles

  • Chrome: 51.
  • Límite: 16.
  • Firefox: 60.
  • Safari: 13.

Origen

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.
Si el contenido incorporado no proviene del mismo sitio que el del nivel superior de navegación, es contenido de terceros.

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.
Si la solicitud entrante usa un espacio método, la página envía cookies.

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: