middleware de sesión de cookies
Middleware simple basado en cookies.
Una sesión de usuario puede almacenarse de dos formas principales con cookies: en el servidor o en el cliente. Este módulo almacena los datos de sesión del cliente en una cookie, mientras que un módulo como express-session almacena sólo un identificador de sesión en el cliente dentro de una cookie y almacena los datos de sesión en el servidor, típicamente en una base de datos.
Los siguientes puntos pueden ayudarle a elegir cuál utilizar:
cookie-sessionno requiere ninguna base de datos / recursos en el lado del servidor, aunque los datos totales de sesión no pueden exceder el tamaño máximo de la cookie del navegador.cookie-sessionpuede simplificar ciertos escenarios balanceados por carga.cookie-sessionpuede utilizarse para almacenar una sesión “ligera” e incluir un identificador para buscar una tienda secundaria respaldada por base de datos para reducir las búsquedas de bases de datos.
NOTE This module does not encrypt the session contents in the cookie, only provides
signing to prevent tampering. The client will be able to read the session data by
examining the cookie’s value. Los datos secretos no deben establecerse en req.session sin
cifrarlo, o utilizar en su lugar una sesión del lado del servidor.
NOTA Este módulo no previene la repetición de la sesión, ya que el conjunto de vencimiento es el
de la cookie solamente; si esa es una preocupación de su aplicación, puede almacenar una fecha de expiración
en req. ession objeto y validarlo en el servidor, e implementar cualquier otra lógica
para extender la sesión según sus necesidades de aplicación.
Instalar
Este es un módulo Node.js disponible a través del
npm registry. La instalación se realiza usando el comando
npm install:
$ npm install cookie-sessionAPI
var cookieSession = require('cookie-session');var express = require('express');
var app = express();
app.use( cookieSession({ name: 'session', keys: [ /* secret keys */ ],
// Cookie Options maxAge: 24 * 60 * 60 * 1000, // 24 hours }));cookieSession(opciones)
Crear un nuevo middleware de sesión de cookie con las opciones proporcionadas. Este middleware
adjuntará la propiedad session a req, que proporciona un objeto representando
la sesión cargada. This session is either a new session if no valid session was
provided in the request, or a loaded session from the request.
El middleware automáticamente añadirá una cabecera Set-Cookie a la respuesta si el contenido
de req.session fueron alterados. Note that no Set-Cookie header will be
in the response (and thus no session created for a specific user) unless there are
contents in the session, so be sure to add something to req.session as soon as
you have identifying information to store for the session.
Opciones
La sesión de cookies acepta estas propiedades en el objeto de opciones.
nombre
El nombre de la cookie a establecer, por defecto a session.
llaves
La lista de claves a usar para firmar y verificar los valores de las cookies, o una instancia
Keygrip configurada. Set cookies are always
signed with keys[0], while the other keys are valid for verification, allowing
for key rotation. If a Keygrip instance is provided, it can be used to
change signature parameters like the algorithm of the signature.
secreto
Una cadena que será usada como única clave si keys no es proporcionada.
Opciones de cookies
Otras opciones se pasan a cookies.get() y cookies.set() permitiéndole a
controlar la seguridad, el dominio, la ruta y la firma entre otras configuraciones.
Las opciones también pueden contener cualquiera de las siguientes (para la lista completa, consulte documentación del módulo de cookies:
maxAge: un número que representa los milisegundos deDate.now()para la expiraciónexpires: un objetoDateque indica la fecha de caducidad de la cookie (expira al final de la sesión por defecto).path: una cadena que indica la ruta de la cookie (/por defecto).domain: una cadena que indica el dominio de la cookie (sin predeterminado).partitioned: un booleano que indica si particionar la cookie en Chrome para el CHIPS Update (falsepor defecto). Si esto es cierto, las cookies de los sitios embebidos serán particionadas y sólo se podrán leer desde el mismo sitio de alto nivel desde el que se creó.priority: una cadena que indica la prioridad de la cookie. Esto puede establecerse a'low','medium'o'high'.sameSite: un booleano o cadena que indica si la cookie es una cookie de “mismo sitio” (falsepor defecto). Esto puede establecerse a'strict','lax','None 'otrue(que se asigna a'strict').secure: un booleano que indica si la cookie sólo debe enviarse sobre HTTPS (por defectofalsepara HTTP,truepor defecto para HTTPS). Si esto se ajusta atruey Node. s no está directamente sobre una conexión TLS, asegúrate de leer cómo configurar Express detrás de proxies o la cookie puede que nunca se configure correctamente.httpOnly: un booleano que indica si la cookie sólo debe enviarse sobre HTTP(S), y no estar disponible para el cliente JavaScript (truepor defecto).signed: un booleano que indica si la cookie debe ser firmada (truepor defecto).overwrite: un booleano que indica si sobrescribir previamente las cookies del mismo nombre (truepor defecto).
req.sesión
Representa la sesión para la solicitud dada.
.isCambiado
Es true si la sesión ha sido cambiada durante la solicitud.
.es nuevo
Es true si la sesión es nueva.
.isPopulated
Determinar si la sesión ha sido rellenada con datos o está vacía.
opciones de req.session
Representa las opciones de sesión para la solicitud actual. These options are a shallow clone of what was provided at middleware construction and can be altered to change cookie setting behavior on a per-request basis.
Destruyendo una sesión
Para destruir una sesión simplemente establecerla a null:
req.session = null;Guardando una sesión
Dado que todo el contenido de la sesión se mantiene en una cookie del cliente, la sesión
se “guarda” escribiendo una cookie en una cabecera de respuesta Set-Cookie.
Esto se hace automáticamente si se ha hecho un cambio en la sesión cuando
el Nodo. los encabezados de respuesta se están escribiendo al cliente y la sesión
no fue destruida.
Ejemplos
Ejemplo de contador de vista simple
var cookieSession = require('cookie-session');var express = require('express');
var app = express();
app.set('trust proxy', 1); // trust first proxy
app.use( cookieSession({ name: 'session', keys: ['key1', 'key2'], }));
app.get('/', function (req, res, next) { // Update views req.session.views = (req.session.views || 0) + 1;
// Write response res.end(req.session.views + ' views');});
app.listen(3000);Edad máxima por usuario
var cookieSession = require('cookie-session');var express = require('express');
var app = express();
app.set('trust proxy', 1); // trust first proxy
app.use( cookieSession({ name: 'session', keys: ['key1', 'key2'], }));
// This allows you to set req.session.maxAge to let certain sessions// have a different value than the default.app.use(function (req, res, next) { req.sessionOptions.maxAge = req.session.maxAge || req.sessionOptions.maxAge; next();});
// ... your logic here ...Expiración de la sesión
Este módulo no envía un encabezado Set-Cookie si el contenido de la sesión
no ha cambiado. Esto significa que extender el vencimiento de una sesión en el navegador
del usuario (en respuesta a la actividad del usuario, por ejemplo) se necesita algún tipo de modificación
a la sesión.
var cookieSession = require('cookie-session');var express = require('express');
var app = express();
app.use( cookieSession({ name: 'session', keys: ['key1', 'key2'], }));
// Update a value in the cookie so that the set-cookie will be sent.// Only changes every minute so that it's not sent with every request.app.use(function (req, res, next) { req.session.nowInMinutes = Math.floor(Date.now() / 60e3); next();});
// ... your logic here ...Usando un algoritmo de firma personalizado
Este ejemplo muestra la creación de una instancia personalizada de Keygrip como la opción keys
para proporcionar claves y configuración de firma adicional.
var cookieSession = require('cookie-session');var express = require('express');var Keygrip = require('keygrip');
var app = express();
app.use( cookieSession({ name: 'session', keys: new Keygrip(['key1', 'key2'], 'SHA384', 'base64'), }));
// ... your logic here ...Limitaciones de uso
Tamaño máximo de la cookie
Debido a que todo el objeto de sesión está codificado y almacenado en una cookie, es posible exceder los límites máximos del tamaño de la cookie en diferentes navegadores. La especificación RFC6265 recomienda que un navegador SHOULD permita
Al menos 4096 bytes por cookie (medida por la suma de la longitud de el nombre, el valor y los atributos de la cookie)
En la práctica, este límite difiere ligeramente entre los navegadores. Ver una lista de límites del navegador aquí. Como regla del pulgar no exceda 4093 bytes por dominio.
Si su objeto de sesión es lo suficientemente grande como para exceder el límite del navegador cuando esté codificado, en la mayoría de los casos el navegador se negará a almacenar la cookie. This will cause the following requests from the browser to either a) not have any session information or b) use old session information that was small enough to not exceed the cookie limit.
Si encuentras que el objeto de sesión está alcanzando estos límites, es mejor que considere si los datos de su sesión deben cargarse desde una base de datos en el servidor en lugar de ser transmitidos a/desde el navegador con cada solicitud. Or move to an alternative session strategy