parser node example create cookie node.js session cookies express connect

node.js - node - ¿Cuál es la diferencia con express-session y cookie-session?



express session persistence (5)

Soy nuevo con Express . Como Express 4.x ha eliminado middleware agrupados. Cualquier middleware que quiera usar debería ser requerido. Cuando leo el archivo README con express-session cookie-session en github, siento que es difícil entender la diferencia.

Así que trato de escribir código simple para resolverlo. Corro dos veces por cada middleware.

var express = require(''express'') , cookieParser = require(''cookie-parser'') , session = require(''cookie-session'') , express_sess = require(''express-session'') , app = express(); app.use(cookieParser()) app.use(session({ keys: [''abc''], name: ''user'' })); //app.use(express_sess({ secret: ''abc'', key: ''user''})); app.get(''/'', function (req, res, next) { res.end(JSON.stringify(req.cookies)); console.log(req.session) console.log(req.cookies) }); app.listen(3000);

Para cookie-session , siempre obtengo {} en mi terminal.

Para express-session , obtengo cosas como esta.

req.session: { cookie: { path: ''/'', _expires: null, originalMaxAge: null, httpOnly: true } } req.cookie: {user: ''s:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU''}

Realmente me confunde. Entonces, ¿cómo explicar el resultado con el uso básico? ¿Y cuál es la diferencia entre ellos? ¿Cuándo debería usarlos?


Básicamente, express-session es más abstracta, admite diferentes tiendas de sesión (como archivos, bases de datos, caché y otras cosas).

Y la cookie-session es una función simple / ligera basada en cookies (la cookie es el único motor de almacenamiento compatible: toda la información de la sesión se almacena en el cliente, en una cookie) implementación de la sesión. Este tipo de sesiones es probablemente la más famosa por su implementación de Rails .


La diferencia básica entre ambos se relaciona con cómo y dónde se almacenan los datos de la sesión. La sesión de cookies se utiliza básicamente para aplicaciones de sesión ligeras donde los datos de sesión se almacenan en una cookie pero dentro del cliente [navegador] , mientras que Express Session almacena solo un identificador de sesión dentro de una cookie en el extremo del cliente, mientras almacena los datos de la sesión completamente en el servidor. Cookie Session es útil en aplicaciones donde no se utiliza ninguna base de datos en el back-end. Sin embargo, los datos de la sesión no pueden exceder el tamaño de la cookie. En las condiciones en que se usa una base de datos, actúa como un caché para detener las frecuentes búsquedas en la base de datos, lo cual es costoso.


Para obtener un console.log (req.session) no vacío, debe establecer valores de sesión antes de iniciar sesión.

Del repositorio de la sesión de cookie ( cookie-session ):

app.get(''/'', function (req, res, next) { req.session.views = (req.session.views || 0) + 1 console.log(req.session) res.end(req.session.views + '' views'') })

Si nunca establece ninguna información en el objeto req.session, volverá vacío.


Permítanme compartir una diferencia importante que encontré: cookies seguras .

Tengo un proceso de nodo detrás de un proxy nginx que maneja SSL.

Intenté con la sesión expresa, pero no pude habilitar las cookies seguras, vea el problema aquí .

Luego probé con casi el mismo código, pero con la sesión de cookie , algo así como

const expressSession = require(''cookie-session'') var expiryDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days const session = expressSession({ secret: sessionSecret, resave: false, saveUninitialized: true, cookie: { secureProxy: true, httpOnly: true, domain: ''beintoo.net'', expires: expiryDate } }) app.use(session)

Acabo de cambiar require(''express-session'') para require(''cookie-session'') y agregué secureProxy: true, todo salió bien de la caja.

Tenga en cuenta también que ambos paquetes son mantenidos por expressjs así que probablemente en mi caso de uso tuve la suerte de descubrir que la sesión de cookie se ajusta a mis necesidades.


express-session almacena el identificador de la sesión en la cookie mientras los datos de la sesión real residen en la tienda de la sesión back-end como connect-redis , mientras que la cookie-session permite almacenar los datos de la sesión en una cookie (del lado del cliente).

De la documentación de cookie-session de cookie-session :

Una sesión de usuario se puede almacenar de dos formas principales con cookies: en el servidor o en el cliente. Este módulo almacena los datos de la sesión en el cliente dentro de una cookie, mientras que un módulo como la sesión expresa almacena solo un identificador de sesión en el cliente dentro de una cookie y almacena los datos de la sesión en el servidor, generalmente en una base de datos.

La principal ventaja de usar cookie-session es cuando tienes una aplicación node.js clúster, entonces no tienes que depender de compartir datos de sesión entre procesos bifurcados.