W3docs

Cookies: document.cookie

Aprende a leer, escribir y eliminar cookies con document.cookie en JavaScript, sus atributos de seguridad y cuándo usar localStorage.

Las cookies son pequeñas porciones de datos (máximo ~4 KB cada una) que un sitio almacena en el navegador y que se adjuntan automáticamente a cada solicitud enviada al mismo origen. Ese último punto es lo que las diferencia de otros almacenamientos del lado del cliente: las cookies viajan al servidor, por lo que son el mecanismo clásico para identificadores de sesión, tokens de "recordarme" y preferencias de idioma o tema que el servidor necesita conocer. Esta guía explica cómo leer, escribir y eliminar cookies con document.cookie, los atributos que controlan su alcance y tiempo de vida, y cuándo conviene recurrir a una opción de almacenamiento diferente.

Cómo funciona document.cookie

document.cookie es una propiedad engañosamente simple. Leerla devuelve todas las cookies del documento actual como una cadena de texto separada por punto y coma con pares name=value. Escribir en ella establece una cookie a la vez — y, lo que es crucial, asignarle un valor no sobreescribe toda la cadena. El navegador analiza la asignación y combina esa única cookie con el conjunto existente:

// Reading: returns everything as one string
document.cookie; // "theme=dark; lang=en; sessionId=abc123"

// Writing: adds/updates ONE cookie, leaves the rest intact
document.cookie = "username=John";

Los atributos que se añaden (path, expires, Secure, …) son de solo escritura — configuran la cookie pero nunca se devuelven al leer document.cookie. Solo se recuperan los pares name=value.

Para crear una cookie, asigna una cadena name=value a document.cookie, seguida opcionalmente de atributos separados por ;. Si el valor contiene espacios, punto y coma u otros caracteres especiales, codifícalo con encodeURIComponent para evitar errores de análisis:

javascript— editable

Esto crea una cookie llamada username con el valor John Doe (codificado para manejar el espacio), que expira el 8 de junio de 2025 y es accesible en todo el sitio (path=/).

Atributos de las cookies

Los atributos se añaden a la cadena de asignación y controlan dónde se envía la cookie y cuánto tiempo vive. Los más importantes:

AtributoQué hace
pathLimita la cookie a un prefijo de ruta URL. path=/ (la opción habitual) la hace válida para todo el sitio; path=/admin la restringe a /admin y sus subrutas.
domainControla qué hosts reciben la cookie. Por defecto, solo el host actual. domain=example.com la comparte con todos los subdominios (app.example.com, shop.example.com). Solo puedes establecer un dominio en el que te encuentres actualmente.
expiresUna fecha Date en formato de cadena UTC (toUTCString()). Cuando pasa esa fecha, el navegador elimina la cookie.
max-ageTiempo de vida en segundos desde ahora — una alternativa más sencilla a expires. max-age=0 elimina la cookie.
SecureEnvía la cookie solo a través de HTTPS.
SameSiteStrict, Lax (valor predeterminado en los navegadores modernos) o None — controla si la cookie se adjunta a solicitudes entre sitios.

Sin expires ni max-age, se obtiene una cookie de sesión que desaparece cuando se cierra el navegador.

Establecer una fecha de expiración

Usa expires para una fecha absoluta o max-age para un tiempo de vida relativo en segundos. max-age suele ser más fácil porque no hay que formatear una fecha:

javascript— editable

Esta cookie userSettings expira 24 horas (86 400 segundos) después de crearse.

Como document.cookie devuelve todas las cookies en una sola cadena, obtener un valor individual requiere analizarla. Una función auxiliar robusta antepone ; a la cadena para que la misma división funcione tanto para la primera cookie como para cualquier otra:

javascript— editable

Si necesitas recorrer todas las cookies, divide por ; y analiza cada par tú mismo:

javascript— editable

No existe un comando «eliminar» — se elimina una cookie volviéndola a establecer con una fecha de expiración en el pasado (o max-age=0). El error que comete todo el mundo: debes usar el mismo path y domain con los que se creó la cookie; de lo contrario, el navegador la trata como una cookie diferente y deja la original intacta.

javascript— editable

Establecer expires=Thu, 01 Jan 1970 00:00:00 UTC consigue lo mismo en los navegadores que prefieren expires a max-age.

Asegurar las cookies

Cuando una cookie contiene algo sensible (un token de sesión ante todo), los atributos importan tanto como el valor:

  • Secure — envía la cookie solo a través de HTTPS, para que no pueda filtrarse a través de una conexión HTTP sin cifrar.
  • SameSite — controla si la cookie se adjunta a solicitudes entre sitios. Lax (el valor predeterminado moderno) la bloquea en la mayoría de las solicitudes entre sitios, mitigando los ataques CSRF; Strict es la opción más restrictiva; None (que requiere Secure) es para casos de uso genuinamente entre sitios.
  • HttpOnly — oculta la cookie de JavaScript por completo, protegiendo los tokens de sesión del robo mediante XSS. No se puede establecer desde document.cookie; el servidor debe enviarla a través del encabezado de respuesta Set-Cookie. Por eso las cookies de sesión suelen ser gestionadas por el servidor.
Advertencia

En un sitio HTTPS, añade Secure a todas las cookies. Nunca almacenes contraseñas ni otros secretos en una cookie legible por JavaScript — cualquier cosa que puedas leer con document.cookie, un ataque XSS exitoso también puede leerla.

document.cookie = "sessionId=abc123; expires=Sat, 08 Jun 2025 12:00:00 UTC; path=/; Secure; SameSite=Lax";

Cookies vs. localStorage

Las cookies no son la única opción de almacenamiento del lado del cliente, y para la mayoría de los datos no son la mejor. Usa cookies solo cuando el servidor necesite los datos en cada solicitud:

CookieslocalStorage
Se envían al servidorSí, en cada solicitudNo, permanecen en el navegador
Capacidad~4 KB por cookie~5–10 MB por origen
Tiempo de vidaexpires / max-age, si no, sesiónHasta que se borre explícitamente
Acceso desde JSdocument.cookie (salvo HttpOnly)localStorage.getItem/setItem
Uso típicoIDs de sesión, tokens de autenticación, preferencias leídas por el servidorEstado de la UI, cachés, borradores

Si solo necesitas recordar algo en el cliente y el servidor nunca lo lee, localStorage o sessionStorage es más sencillo y tiene mayor capacidad; la Storage API lo cubre en profundidad. Dado que las cookies se envían automáticamente con las solicitudes, también interactúan con las reglas de CORS — consulta las solicitudes de origen cruzado con Fetch para enviar credenciales entre orígenes.

Conclusión

Las cookies siguen siendo la forma estándar de compartir pequeñas porciones de estado con el servidor — sesiones, autenticación y preferencias leídas por el servidor. Escríbelas de una en una con document.cookie, delimítalas con path/domain, controla su tiempo de vida con expires/max-age, y protégelas con Secure, SameSite y (en el servidor) HttpOnly. Para datos más grandes y solo del lado del cliente, prefiere Web Storage en su lugar.

Práctica

Práctica
¿Qué atributos puedes usar para mejorar la seguridad de las cookies en JavaScript?
¿Qué atributos puedes usar para mejorar la seguridad de las cookies en JavaScript?
Was this page helpful?