HTTPQUERY
Español

Set-Cookie

Uso

La cabecera Set-Cookie indica al cliente que almacene un par nombre-valor junto con atributos opcionales que controlan el ámbito, la duración y las propiedades de seguridad de la cookie. Cada cabecera Set-Cookie establece exactamente una cookie. Los servidores que envían varias cookies incluyen varias cabeceras Set-Cookie en la misma respuesta.

La sintaxis general consiste en un nombre de cookie y un valor separados por un signo igual, seguidos de atributos opcionales delimitados por punto y coma.

Set-Cookie: <name>=<value>; <attributes>

El nombre de la cookie admite caracteres US-ASCII salvo caracteres de control, espacios, tabulaciones y los caracteres separadores ( ) < > @ , ; : \ ” / [ ] ? = { }. El valor de la cookie admite caracteres US-ASCII excluyendo caracteres de control, espacios en blanco, comillas dobles, comas, puntos y comas y barras invertidas. Los valores se pueden envolver opcionalmente entre comillas dobles.

Los navegadores impiden que el JavaScript del frontend lea la cabecera Set-Cookie mediante la Fetch API y XMLHttpRequest. En la especificación Fetch, esta cabecera es un nombre de cabecera de respuesta prohibido. Las cookies de las respuestas CORS se ignoran salvo que la solicitud incluya credenciales.

Los prefijos del nombre de cookie imponen restricciones adicionales que el navegador hace cumplir, lo que ofrece garantías sobre dónde y cómo se estableció una cookie.

El prefijo __Secure- exige el atributo Secure y un origen HTTPS. Esto impide que sitios que solo usan HTTP establezcan cookies que compartan nombre con una cookie segura.

Set-Cookie: __Secure-ID=abc; Secure; Path=/

El prefijo __Host- añade requisitos más estrictos: el atributo Secure, ningún atributo Domain y Path fijado en /. Esto vincula la cookie al nombre de host exacto del origen, lo que evita la interferencia de los subdominios.

Set-Cookie: __Host-ID=abc; Secure; Path=/

El prefijo __Http- exige a la vez los atributos Secure y HttpOnly y solo puede establecerse mediante la cabecera Set-Cookie, no a través de JavaScript.

Set-Cookie: __Http-ID=abc; Secure; HttpOnly

El prefijo __Host-Http- combina las restricciones de __Host- y __Http-, y crea la vinculación de cookie más restrictiva disponible.

Set-Cookie: __Host-Http-ID=abc; Secure; HttpOnly; Path=/

Nota

Los prefijos __Http- y __Host-Http- proceden de una propuesta de prefijos de cookie independiente, distinta de los consolidados prefijos __Secure- y __Host- que los navegadores aplican de forma generalizada. Los prefijos más recientes siguen en fase de propuesta.

Impacto en SEO

Googlebot envía cookies cuando el origen las establece, pero no las conserva entre sesiones de rastreo independientes. Las cookies de gran tamaño en dominios de recursos aumentan el tamaño de las solicitudes durante el renderizado. Usar un dominio sin cookies para los recursos estáticos evita esa sobrecarga. Evite condicionar el contenido a una lógica dependiente de cookies que impida a los rastreadores ver la página.

Expires

El atributo Expires fija una fecha de expiración absoluta en formato HTTP-date. Después de esa fecha, el cliente deja de enviar la cookie. Cuando se omite junto con Max-Age, la cookie se convierte en una cookie de sesión que se elimina al cerrarse el cliente. Los navegadores corrigen el desfase de reloj usando la cabecera Date de la respuesta.

Expires=Thu, 31 Dec 2026 23:59:59 GMT

Nota

Los navegadores limitan el valor de Expires a 400 días desde el momento en que se establece la cookie. Este límite permite que los sitios visitados aproximadamente una vez al año mantengan sus cookies, a la vez que evita una persistencia indefinida.

Max-Age

El atributo Max-Age fija la duración de la cookie en segundos a partir del momento en que el cliente recibe la respuesta. Un valor cero o negativo hace que la cookie expire de inmediato. Cuando Expires y Max-Age están presentes a la vez, Max-Age tiene prioridad.

Max-Age=2592000

La Cookie Store API de JavaScript también expone una opción maxAge mediante el método cookieStore.set(), que refleja este atributo para la gestión programática de cookies. La API no permite establecer expires y maxAge en la misma cookie.

Nota

Los navegadores limitan el valor de Max-Age a 400 días (34.560.000 segundos), en consonancia con el límite de Expires.

Domain

El atributo Domain especifica qué hosts reciben la cookie. Cuando se establece, la cookie está disponible para el dominio indicado y todos sus subdominios. Cuando se omite, la cookie queda restringida de forma predeterminada al host de origen exacto, excluyendo los subdominios (una cookie limitada al host). Solo son válidos el dominio actual o un dominio padre del host actual. Los puntos iniciales se ignoran.

Domain=example.re

Path

El atributo Path limita la transmisión de la cookie a las solicitudes que coinciden con el prefijo de ruta URL indicado. La barra inclinada / delimita los segmentos de la ruta. Una cookie con Path=/docs coincide con /docs, /docs/ y /docs/Web/HTTP, pero no con / ni /docsets.

Path=/

Nota

El atributo Path no es un mecanismo de seguridad. Cualquier script del mismo origen tiene acceso a todas las cookies, independientemente de las restricciones de ruta.

Secure

El atributo Secure restringe la cookie a conexiones HTTPS. El navegador nunca envía una cookie segura por HTTP sin cifrar. Los orígenes inseguros no pueden establecer cookies con este atributo. Localhost queda exento del requisito de HTTPS durante el desarrollo.

HttpOnly

El atributo HttpOnly bloquea el acceso de JavaScript a la cookie mediante document.cookie, la Cookie Store API y otras interfaces del DOM. La cookie se sigue enviando con las solicitudes HTTP que JavaScript inicia mediante fetch() y XMLHttpRequest. Este atributo mitiga los ataques de scripting entre sitios (XSS) que intentan robar valores de cookies.

SameSite

El atributo SameSite controla si el navegador envía la cookie con solicitudes entre sitios. Hay tres valores definidos.

Strict envía la cookie únicamente con solicitudes del mismo sitio. Las navegaciones entre sitios, incluido hacer clic en un enlace desde un sitio externo, no incluyen la cookie.

Lax envía la cookie con solicitudes del mismo sitio y con navegaciones de nivel superior entre sitios en las que cambia la barra de direcciones. Las solicitudes de subrecursos, las llamadas fetch() y las navegaciones en iframes no incluyen la cookie. La mayoría de los navegadores usan Lax de forma predeterminada cuando no se especifica el atributo SameSite.

None envía la cookie con todas las solicitudes, incluidas las solicitudes entre sitios. El atributo Secure es obligatorio al usar SameSite=None. Las cookies procedentes de un esquema diferente (HTTP frente a HTTPS) se tratan como entre sitios.

SameSite=Lax

Partitioned

El atributo Partitioned almacena la cookie en un almacenamiento particionado cuya clave es tanto el origen de la cookie como el sitio de nivel superior. Una cookie particionada establecida por cdn.example.re incrustado en shop.example.org solo se envía cuando cdn.example.re está incrustado en shop.example.org, y no cuando está incrustado en otros sitios.

Este atributo forma parte de la propuesta Cookies Having Independent Partitioned State (CHIPS). El atributo habilita casos de uso legítimos de cookies entre sitios, como widgets incrustados, equilibrio de carga de CDN y proveedores de CMS headless, sin conceder una capacidad plena de seguimiento entre sitios.

El atributo Secure es obligatorio. Se recomienda el prefijo __Host- para vincular la cookie al origen exacto.

Set-Cookie: __Host-sess=abc; SameSite=None; Secure; Path=/; Partitioned

Compatible con los navegadores basados en Chromium y con Firefox. Safari particiona las cookies de terceros de forma predeterminada mediante un mecanismo independiente y no utiliza este atributo.

Ejemplo

Una cookie de sesión sin atributos de expiración. La cookie se elimina cuando termina la sesión del cliente.

Set-Cookie: sessionId=38afes7a8

Una cookie persistente con una duración de 30 días. El atributo Max-Age fija la expiración de forma relativa al momento actual.

Set-Cookie: id=a3fWa; Max-Age=2592000

Una cookie con atributos de seguridad adecuados para tokens de autenticación. El atributo HttpOnly bloquea el acceso desde JavaScript, Secure la restringe a HTTPS y SameSite=Strict impide la transmisión entre sitios.

Set-Cookie: __Host-token=eyJhbGci; Secure; HttpOnly; SameSite=Strict; Path=/

Una cookie de terceros particionada para un elemento incrustado entre sitios. El atributo Partitioned aísla la cookie en el sitio de nivel superior concreto donde aparece el elemento incrustado.

Set-Cookie: __Host-embed=34d8g; SameSite=None; Secure; Path=/; Partitioned

Varias cookies establecidas en una sola respuesta. Cada cookie necesita su propia cabecera Set-Cookie.

Set-Cookie: theme=dark; Path=/; Max-Age=31536000
Set-Cookie: __Host-sid=x8Kp2; Secure; HttpOnly; SameSite=Lax; Path=/

Diagnóstico

Las cookies que no se conservan o que llegan en las solicitudes equivocadas suelen deberse a atributos mal emparejados o a políticas de aplicación del navegador.

Cookie no almacenada por la marca Secure en HTTP. El atributo Secure requiere una conexión HTTPS. Una cookie establecida con Secure sobre HTTP simple se descarta de forma silenciosa. Compruebe el protocolo en la barra de direcciones del navegador e inspeccione las cabeceras Set-Cookie en la pestaña Network de DevTools. Localhost queda exento de esta restricción durante el desarrollo.

Cookie no enviada en solicitudes entre sitios (valor predeterminado de SameSite). Los navegadores modernos usan SameSite=Lax de forma predeterminada cuando no hay atributo SameSite. Las subsolicitudes entre sitios, como las llamadas fetch(), los iframes y las cargas de imágenes, no incluyen la cookie. Añada SameSite=None; Secure cuando la cookie deba viajar entre sitios, o reestructure el flujo para evitar la dependencia entre sitios.

Ruta de cookie no coincidente. Una cookie establecida con Path=/app no se envía a las solicitudes dirigidas a /api ni a /. Verifique que el valor de Path coincide con las rutas de solicitud que necesitan la cookie. Establecer Path=/ hace que la cookie esté disponible en todo el sitio.

Problemas de ámbito con el atributo Domain. Una cookie establecida con Domain=sub.example.re no se envía a example.re. Omitir el atributo Domain crea una cookie limitada al host, restringida al nombre de host exacto. Los navegadores ignoran los puntos iniciales del valor. Utilice el panel Application > Cookies de DevTools para inspeccionar el dominio efectivo de cada cookie almacenada.

Cookie de terceros bloqueada por funciones de privacidad del navegador. Safari bloquea las cookies de terceros de forma predeterminada mediante Intelligent Tracking Prevention. Enhanced Tracking Protection de Firefox y Privacy Sandbox de Chrome aplican restricciones similares. El atributo Partitioned (CHIPS) ofrece una vía basada en estándares para los casos de uso legítimos de cookies entre sitios. Pruebe en varios navegadores para confirmar el comportamiento.

Cookie que supera el tamaño máximo. Los navegadores imponen un límite de aproximadamente 4096 bytes por cookie (nombre, valor y atributos en conjunto). Las cookies de tamaño excesivo se descartan de forma silenciosa. Traslade las cargas útiles grandes a sesiones en el servidor y almacene solo un identificador de sesión en la cookie.

Depuración de cookies almacenadas. Abra DevTools > Application > Cookies para inspeccionar todas las cookies del sitio actual, incluidos atributos, expiración y tamaño. La API document.cookie no expone las cookies HttpOnly. Utilice curl -v para ver las cabeceras Set-Cookie sin procesar que devuelve el servidor.