# Cookie

## SameSite

Es un atributo de las cookies que especifica a los navegadores cuándo deben incluir las cookies de un sitio web en las solicitudes que se originan en otros sitios web.

### Strict

El navegador no envía la cookie en ninguna solicitud entre sitios.

### Lax

El navegador solo envía la cookie en solicitudes entre sitios, pero solo si se cumplen las dos condiciones siguientes:

* La solicitud utiliza el método `GET`.
* La solicitud fue el resultado de una navegación de nivel superior por parte del usuario, como hacer clic en un enlace.

Esto significa que la cookie no se incluye en las solicitudes entre sitios con método `POST`. Asimismo, la cookie no se incluye en solicitudes realizada desde JavaScript, iframes o referencias a imágenes y otros recursos.

### None

El navegador no aplica ninguna medida adicional. La cookie se envía con todas las solicitudes entre sitios. Al configurar una cookie con `SameSite=None`, también se debe incluir el atributo `Secure`, que garantiza que la cookie solo se envíe a través de HTTPS. De lo contrario, los navegadores rechazarán la cookie y no se configurará.

<table><thead><tr><th width="178" align="center">Tipo solicitud entre sitios</th><th width="363" align="center">Ejemplo de código</th><th align="center">Cookies enviadas cuando</th></tr></thead><tbody><tr><td align="center">Link</td><td align="center"><code>&#x3C;a href="">&#x3C;/a></code></td><td align="center">(*) No establecido SameSite=None SameSite=Lax</td></tr><tr><td align="center">Prerender</td><td align="center"><code>&#x3C;link rel="prerender" href=""/></code></td><td align="center">(*) No establecido SameSite=None SameSite=Lax</td></tr><tr><td align="center">Form GET</td><td align="center"><code>&#x3C;form method="GET" action=""></code></td><td align="center">(*) No establecido SameSite=None SameSite=Lax</td></tr><tr><td align="center">Form POST</td><td align="center"><code>&#x3C;form method="POST" action=""></code></td><td align="center">SameSite=None</td></tr><tr><td align="center">iframe</td><td align="center"><code>&#x3C;iframe src="">&#x3C;/iframe></code></td><td align="center">SameSite=None</td></tr><tr><td align="center">JavaScript</td><td align="center"><p><code>var xhr = new XMLHttpRequest();</code></p><p><code>xhr.open("GET", "", false);</code></p><p><code>xhr.withCredentials = true;</code></p><p><code>xhr.send();</code></p></td><td align="center">SameSite=None</td></tr><tr><td align="center">Image</td><td align="center"><code>&#x3C;img src=""/></code></td><td align="center">SameSite=None</td></tr></tbody></table>

{% hint style="info" %}
(\*) Desde 2021, Chrome aplica restricciones `SameSite=Lax` de manera predeterminada en aquellas cookies cuyo sitio emisor no especifique explícitamente un nivel de restricción mediante el atributo `SameSite`.
{% endhint %}

### same-site vs same-origin

* same-site: combinación de un esquema y la última parte del nombre de dominio, es decir, el dominio de nivel superior (TLD), por ejemplo `.com`, más un nivel adicional del nombre de dominio, que se suele denominar TLD+1.
* same-origin: combinación de un esquema, un nombre de dominio y un número de puerto.

| Solicitud desde            | Solicitud a           | ¿Mismo same-site? |
| -------------------------- | --------------------- | ----------------- |
| <http://es.example.com/>   | <http://example.com/> | Si                |
| <http://example.com:8080/> | <http://example.com/> | Si                |
| <http://example.org/>      | <http://example.com/> | No                |
| <https://example.com/>     | <http://example.com/> | No                |
