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.
Contenidos
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 valor0
, 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 APIdocument.cookie
.secure
: So su valor estrue
, 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.
Una vez configurada una cookie, podrás acceder a ella accediendo al objeto response.cookies
en sucesivas peticiones:
response.cookies.nombre_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.