Cookies en JavaScript: ejemplo de establecer, obtener y eliminar

⚡ Resumen inteligente

Cookies en JavaLos scripts almacenan pequeños pares clave-valor en el ordenador del visitante para que una conexión HTTP sin estado pueda recordar información. Este artículo explica cómo configurar, leer y eliminar cookies, describe cada atributo de las cookies y las compara con las alternativas de almacenamiento del navegador.

  • 🍪 Definición básica: Una cookie es un par clave-valor que guarda el navegador y que se devuelve automáticamente con cada solicitud coincidente.
  • ✍️ Escribe. Operación: Al asignar un valor a document.cookie, se agrega o reemplaza una cookie a la vez y nunca se borran las demás.
  • Línea Leer Operación: Al leer document.cookie se devuelve una cadena separada por punto y coma, por lo que el par requerido debe separarse manualmente.
  • 🗑️ Eliminar Operación: Si se establece una fecha de caducidad anterior, se elimina la cookie, y la ruta y el dominio deben coincidir con los valores originales.
  • 🔐 Atributos de seguridad: La opción Secure restringe la transmisión a HTTPS, HttpOnly bloquea el acceso mediante scripts y SameSite controla el envío entre sitios.
  • 📏 Límites de tamaño: Cada cookie contiene aproximadamente 4 KB y los navegadores almacenan alrededor de 50 cookies por dominio, por lo que los datos grandes deben gestionarse en otro lugar.
  • 💾 Alternativas de almacenamiento: localStorage y sessionStorage almacenan más datos y nunca están vinculados a las solicitudes de red.

Cookies en JavaScript

¿Qué son las cookies?

Una cookie es un fragmento de datos que se almacena en tu ordenador para que tu navegador pueda acceder a él. Es posible que hayas disfrutado de las ventajas de las cookies, ya sea de forma consciente o inconsciente. ¿Alguna vez has mantenido la sesión iniciada en un sitio como Facebook para no tener que escribir tus datos cada vez que intentas iniciar sesión? Si es así, estás utilizando cookies. Las cookies se guardan como pares clave/valor.

Una aclaración importante: una cookie no almacena tu contraseña. Almacena un identificador de sesión, que es un token aleatorio que el servidor emite tras un inicio de sesión exitoso. El servidor asocia ese token a tu cuenta, por lo que la contraseña en sí nunca sale del servidor.

¿Por qué necesitas una galleta?

La comunicación entre un navegador web La comunicación con el servidor se realiza mediante un protocolo sin estado llamado HTTP. Un protocolo sin estado procesa cada solicitud de forma independiente. Por lo tanto, el servidor no conserva los datos después de enviarlos al navegador. Sin embargo, en muchas ocasiones, los datos se necesitarán de nuevo. Aquí es donde entran en juego las cookies. Con las cookies, el navegador web no tendrá que comunicarse con el servidor cada vez que se requieran los datos. En su lugar, estos se pueden obtener directamente del ordenador.

Los usos típicos incluyen recordar una sesión iniciada, almacenar una preferencia de idioma o tema, mantenerping artículos en una tiendaping cesta entre páginas y contabilizando los visitantes nuevos frente a los recurrentes.

Javascript Establecer galleta

Puedes crear cookies utilizando la propiedad document.cookie de esta manera.

document.cookie = "cookiename=cookievalue"

Incluso puedes añadir una fecha de caducidad a tu cookie para que se elimine del ordenador en la fecha especificada. La fecha de caducidad debe configurarse en formato UTC/GMT. Si no la configuras, la cookie se eliminará cuando el usuario cierre el navegador.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC"

También puedes configurar el dominio y la ruta para especificar a qué dominio y a qué directorios dentro de ese dominio pertenece la cookie. Por defecto, una cookie pertenece a la página que la establece.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC; path=/ "

//crea una cookie con el dominio de la página actual y una ruta que abarque todo el dominio.

⚠️ Advertencia: La fecha de caducidad debe ser futura. Una fecha que ya ha pasado indica al navegador que elimine la cookie inmediatamente, que es precisamente la técnica que se utiliza en la sección de eliminación que aparece a continuación.

JavaScript Obtener Cookie

Puedes acceder a la cookie de esta manera, lo que devolverá todas las cookies guardadas para el dominio actual.

var x =  document.cookie

El valor devuelto es una única cadena con el formato name1=value1; name2=value2No existe un método integrado para leer una cookie por su nombre, por lo que la cadena debe dividirse. La función auxiliar que se muestra a continuación devuelve un único valor y una cadena vacía cuando no se especifica el nombre.

function getCookie(name) {
    const pairs = document.cookie.split(";");
    for (let i = 0; i < pairs.length; i++) {
        const pair = pairs[i].trim();
        if (pair.indexOf(name + "=") === 0) {
            // decode in case the value contained spaces or symbols
            return decodeURIComponent(pair.substring(name.length + 1));
        }
    }
    return "";
}

document.cookie = "username=Ann Smith; path=/";
console.log(getCookie("username"));
console.log(getCookie("missing") === "");

Salida:

Ann Smith
true

JavaScript para eliminar cookies

Para eliminar una cookie, solo tienes que establecer el valor de la cookie como vacío y el valor de expirar a una fecha que ya haya pasado.

document.cookie = "cookiename= ; expires = Thu, 01 Jan 1970 00:00:00 GMT"

Un detalle es la causa de la mayoría de los fallos al eliminar cookies. El navegador identifica una cookie por su nombre, su ruta y su dominio, por lo que la instrucción de eliminación debe repetir la misma ruta y el mismo dominio que se utilizaron cuando se creó la cookie.

// created with an explicit path
document.cookie = "theme=dark; path=/; max-age=2592000";

// deletion must repeat that same path
document.cookie = "theme=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";

// max-age=0 achieves the same result in one shorter line
document.cookie = "theme=; path=/; max-age=0";

Explicación de los atributos de las cookies

Cada atributo que aparece después del primer punto y coma modifica la duración de la cookie, las solicitudes que la utilizan y el código que puede leerla. La referencia que se muestra a continuación abarca todos estos aspectos.

Atributo Propósito Ejemplo
vence Fecha de eliminación absoluta en formato UTC expira=jue, 21 ago 2031 20:00:00 UTC
edad máxima Tiempo de vida en segundos contados desde ahora max-age = 2592000
camino Ámbito del directorio dentro del dominio ruta=/
dominio Ámbito del host, incluidos los subdominios. dominio=ejemplo.com
Seguro Enviado únicamente a través de una conexión HTTPS. Seguro
HttpOnly Oculto de document.cookie, establecido únicamente por el servidor. HttpOnly
MismoSitio Controla el envío de solicitudes entre sitios SameSite=Lax

SameSite merece especial atención porque los navegadores ahora aplican un valor predeterminado. Los tres valores aceptados se comportan de la siguiente manera.

  • Estricto: La cookie nunca se envía cuando la solicitud proviene de otro sitio, lo cual es la configuración más segura para las sesiones bancarias.
  • Flojo: La cookie se transmite con la navegación principal, como al hacer clic en un enlace, pero no con imágenes o marcos de otros sitios. Esta es la configuración predeterminada de los navegadores modernos.
  • Ninguno: La cookie se envía en cada solicitud entre sitios y debe ir acompañada del atributo Secure; de ​​lo contrario, el navegador la rechaza.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Consejo: El atributo HttpOnly no se puede aplicar desde JavaScript, por diseño. Solo un encabezado de respuesta del servidor puede configurarlo, y eso es lo que protege las cookies de sesión de los ataques de secuencias de comandos entre sitios.

Pruebe este ejemplo usted mismo

El siguiente script combina las tres operaciones. Crea una cookie con una fecha de caducidad en días, la lee por su nombre y saluda a un visitante recurrente. Instrucciones especiales para que el código funcione… Pulse el botón de ejecución dos veces.

<html>
<head>
	<title>Cookie!!!</title>
	<script type="text/javascript">
		function createCookie(cookieName,cookieValue,daysToExpire)
        {
          var date = new Date();
          date.setTime(date.getTime()+(daysToExpire*24*60*60*1000));
          document.cookie = cookieName + "=" + cookieValue + "; expires=" + date.toGMTString();
        }
		function accessCookie(cookieName)
        {
          var name = cookieName + "=";
          var allCookieArray = document.cookie.split(';');
          for(var i=0; i<allCookieArray.length; i++)
          {
            var temp = allCookieArray[i].trim();
            if (temp.indexOf(name)==0)
            return temp.substring(name.length,temp.length);
       	  }
        	return "";
        }
		function checkCookie()
        {
          var user = accessCookie("testCookie");
          if (user!="")
        	alert("Welcome Back " + user + "!!!");
          else
          {
            user = prompt("Please enter your name");
            num = prompt("How many days you want to store your name on your computer?");
            if (user!="" && user!=null)
            {
            createCookie("testCookie", user, num);
            }
          }
        }
	</script>
</head>
<body onload="checkCookie()"></body>
</html>

Comportamiento esperado:

First run  : "Please enter your name"  -> Ann
             "How many days you want to store your name on your computer?" -> 5
Second run : alert box shows  Welcome Back Ann!!!

Code explicación: La función createCookie convierte un número de días en milisegundos y los suma a la hora actual, lo que genera la fecha de caducidad. La función accessCookie divide la cadena de la cookie por punto y coma, recorta cada fragmento y compara el inicio del fragmento con el nombre solicitado. La función checkCookie vincula ambas funciones al cargar la página.

⚠️ Advertencia: El ejemplo utiliza toGMTString(), que es un alias obsoleto. El nuevo código debería llamar toUTCString() En cambio, dado que la forma obsoleta podría ser eliminada eventualmente de los navegadores.

Cookies vs. almacenamiento local vs. almacenamiento de sesión

Las cookies no son el único lugar donde un navegador puede almacenar datos. Existen dos opciones de almacenamiento web, y elegir la correcta evita enviar bytes innecesarios en cada solicitud.

Elemento Cookie almacenamiento local sesiónAlmacenamiento
CAPACIDAD Aproximadamente 4 KB Aproximadamente 5 MB Aproximadamente 5 MB
Enviado al servidor Sí, con cada solicitud de coincidencia No No
Dura toda la vida Hasta la fecha de vencimiento Hasta que se elimine explícitamente Hasta que se cierre la pestaña
El servidor puede escribirlo Sí: No No
Accesible en todas las pestañas Sí: Sí: No
Uso típico Sesiones y autenticación Preferencias y datos almacenados en caché Formulario de visita única estatal

La regla práctica es sencilla. Si el servidor necesita el valor, utilice una cookie. Si solo la página lo necesita, utilice localStorage o sessionStorage, ya que estos valores nunca añaden peso a una solicitud de red.

El código de gestión de cookies suele compartirse entre muchas páginas, por lo que revisar interno y externo JavaScript antes de decidir dónde colocarlo. La división de cadenas utilizada aquí se basa en JavaCadenas de script y JavaMétodos de matriz de scripty aparecen más guiones de trabajo en el Información JavaEjemplos de código de script.

Preguntas Frecuentes

Aproximadamente 4 KB por cookie, y la mayoría de los navegadores almacenan unas 50 cookies por dominio. Los valores mayores deben guardarse en el almacenamiento local o recuperarse del servidor bajo demanda.

Las causas más comunes son una fecha de caducidad vencida, una ruta incorrecta, una página abierta desde el sistema de archivos en lugar de un servidor o que el navegador bloquee las cookies. Consulta el panel de Aplicaciones en las herramientas para desarrolladores.

No. Las cookies HttpOnly se ocultan deliberadamente en document.cookie para que los scripts inyectados no puedan robar un token de sesión. Solo el servidor las ve, en los encabezados de la solicitud.

Las cookies de origen pertenecen al dominio que aparece en la barra de direcciones. Las cookies de terceros son establecidas por un dominio integrado, como un anunciante, y los navegadores ahora las restringen o bloquean de forma predeterminada.

Sí. Normalmente, una pequeña cookie almacena un identificador de conversación para que el widget pueda retomar el hilo en la siguiente visita. Los mensajes se guardan en los servidores del proveedor.

No. Las cookies se envían con cada solicitud coincidente y los scripts pueden leerlas a menos que se active la opción HttpOnly. Almacena únicamente un identificador opaco y guarda los datos personales en el servidor.

Resumir este post con: