Cómo usar cookies con Express

JavascriptNode.js

En este tutorial vamos a ver cómo puedes gestionar cookies usando Node.js, pudiendo así almacenar información del usuario que se conserve durante las diferentes peticiones al servidor.

Para poder usar cookies con Express, necesitas el módulo cookie-paser, que podrás usar con la aplicación del siguiente modo, dando por hecho que la aplicación Express está definida en el objeto app:

const cookieParser = require('cookie-parser');
app.use(cookieParser());

Para manipular las cookies suelen usarse múltiples métodos de la clase Response. A continuación vamos a ver los más comunes.

Cómo crear una cookie

Puedes crear una cookie o establecer el valor de una ya creada mediante el método response.cookie, disponible en las instancias de la clase Reponse de Express. Este método acepta el nombre de la cookie como primer parámetro y su valor como segundo parámetro:

response.cookie('nombre_cookie', 'valor_kookie',

También acepta un objeto como tercer parámetro que permite configurar ciertas opciones como su tiempo de vida, si aceptarán conexiones no seguras, si su uso se limitará a peticiones que hagan referencia al mismo origen o si solamente estarán disponibles para el protocolo http, entre otras opciones. A continuación puedes ver lo que hace cada una de ellas:

  • domain: El dominio que se asociará a la cookie, que es por defecto el de la propia aplicación.
  • expires: Configuración de la fecha de expiración de una cookie. Si no se establece su valor o se asigna el valor 0, la cookie será una cookie de sesión.
  • maxAge: Permite establecer el tiempo de expiración de la cookie en milisegundos de forma relativa a la fecha actual.
  • httpOnly: Configuración de la cookie para que solamente sea accesible desde el servidor web, evitando que pueda modificarse desde la API document.cookie.
  • secure: So su valor es true, la cookie solamente se transmitirá con conexiones seguras https.
  • path: La localización de la cookie relativa al documento, que por defecto será el directorio /.
  • sameSite: La cookie no se enviará con peticiones cross-site que provengan de un dominio diferente al configurado con la aplicación, evitando ataques CSRF.
  • signed: La cookie estará firmada.

En el siguiente ejemplo establecemos el valor de una cookie con diversos parámetros de configuración.

response.cookie('nombre_cookie', 'valor_kookie', {
  maxAge: 60 * 60 * 1000, // Duración de una hora
  httpOnly: true, // Protocolo http
  secure: true, // Conexión segura https
  sameSite: true, // No se enviará en peticiones cross-site
});

La cookie del ejemplo anterior durará una hora hasta expirar y solamente funcionará a través de conexiones seguras https en peticiones que no sean cross-site. Por ejemplo, no podríamos realizar una petición al endpoint /api/usuarios desde un dominio o una IP diferente a los parámetros de configuración del servidor.

Cómo obtener una cookie

Una vez configurada una cookie, podrás acceder a ella accediendo al objeto response.cookies en sucesivas peticiones:

response.cookies.nombre_cookie;

Cómo eliminar una cookie

Para eliminar una cookie debes usar el método response.clearCookie, pasándole como parámetro el nombre que le hayas dado a la cookie:

response.clearCookie('nombre_cookie');

Habitualmente ejecutarás el método response.clearCookie cuando quieras finalizar la sesión del usuario.

Cookies en un middleware

Las rutas de Express aceptan el uso de middleware, en los cuales es también posible crear o actualizar cookies, así como validar la sesión de los usuarios. También podría darse el caso de que quieras procesar una cookie en un middleware y usarla también en otro middleware adicional, en cuyo caso podrías almacenarla como un valor local de Express:

Este tipo de uso es habitual cuando quieres refrescar un token de autorización JWT en alguna ruta que se ejecute antes de la autorización del usuario. Luego podrías validar el token en otro middleware y finalmente adjuntarlo a una cookie como respuesta a la petición:

const primerMiddleware = (request, response, next) => {
  const tokenAcceso = obtenerTokenAcceso(token);
  response.locals.tokenAcceso = tokenAcceso;
  next();
}

const segundoMiddleware = (request, response) => {
  const updatedAccessToken = response.locals.tokenAcceso;
}

router.post('/app/usuario', primerMiddleware, segundoMiddleware);

Esto ha sido todo.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

Deja una respuesta

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”