Je suis nouveau avec Express
. Comme Express 4.x
a supprimé les middlewares groupés . Tout middleware que je veux utiliser devrait être requis. Lorsque je lis le README avec express-session et cookie-session sur github, j'ai du mal à comprendre la différence.
J'essaie donc d'écrire un code simple pour le comprendre. Je cours deux fois pour chaque 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);
Pour cookie-session
, je reçois toujours {} dans mon terminal.
Pour express-session
, j'ai des choses comme ça.
req.session: { cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}
req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
Cela me trouble vraiment. Alors, comment expliquer le résultat avec l'utilisation de base? Et quelle est la différence entre eux? Quand devrais-je les utiliser?
Fondamentalement, express-session
est plus abstrait, il prend en charge différents magasins de session (tels que les fichiers, les bases de données, le cache, etc.).
Et cookie-session
est un cookie simple/léger (le cookie est le seul moteur de stockage pris en charge: toutes les informations de session sont stockées sur le client, dans un cookie). Ce type de sessions est probablement plus célèbre pour sa implémentation de Rails .
La différence fondamentale entre les deux concerne le comment et le lieu où les données de session sont stockées. Cookie session est essentiellement utilisé pour les applications de session allégées où les données de session sont stockées dans un cookie mais dans le client [navigateur], tandis que/ Express Session stocke une simple session identifiant dans un cookie chez le client, tout en stockant les données de session entièrement sur le serveur. Cookie Session est utile dans les applications où aucune base de données n'est utilisée dans le back-end. Cependant, les données de session ne peuvent pas dépasser la taille du cookie. Lorsque la base de données est utilisée, elle agit comme un cache pour empêcher les recherches fréquentes dans la base de données, ce qui est coûteux.
Permettez-moi de partager une différence importante que j'ai trouvée: cookies sécurisés.
J'ai un processus de nœud derrière un proxy nginx qui gère SSL.
J'ai essayé avec express-session, mais je ne pouvais pas activer les cookies sécurisés, voir problème ici .
Ensuite, j'ai essayé avec presque le même code, mais avec cookie-session à la place, quelque chose comme:
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: 'example.com',
expires: expiryDate
}
})
app.use(session)
Je viens de changer require('express-session')
en require('cookie-session')
et d’ajouter secureProxy: true,
: tout a fonctionné.
Notez également que les deux paquets sont gérés par expressjs , donc probablement dans mon cas d’utilisation, j’ai eu la chance de découvrir que la session cookie répond à mes besoins.
express-session
stocke l'identifiant de session dans le cookie, tandis que les données de session réelles résident dans le magasin de session principal, comme connect-redis
, où cookie-session
vous permet de stocker les données de session dans un cookie (côté client).
De la documentation de cookie-session
:
Une session utilisateur peut être stockée de deux manières principales avec des cookies: sur le serveur ou sur le client. Ce module stocke les données de session sur le fichier client dans un cookie, tandis qu'un module tel que les magasins express-session seulement un identifiant de session sur le client dans un cookie et stocke le données de session sur le serveur, généralement dans une base de données.
Le principal avantage de l'utilisation de cookie-session
réside dans le fait que vous avez une application node.js
en cluster. Vous n'avez donc pas à compter sur le partage des données de session entre les processus définis.
Obtenez un console.log (req.session) non vide, vous devez définir les valeurs de session avant de vous connecter.
Depuis le dépôt de session cookie ( https://github.com/expressjs/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 vous ne définissez jamais d'informations sur l'objet req.session, il retournera vide.