Какая разница с экспресс-сессией и cookie-сессией?
Я новичок в Express
. Поскольку Express 4.x
удалил связанные средние.
Любое промежуточное ПО, которое я хочу использовать, должно быть необходимо. Когда я прочитал README с экспресс-сессией и cookie-session в github, мне трудно понять разница.
Итак, я пытаюсь написать простой код, чтобы понять это. Я запускаю дважды для каждого промежуточного программного обеспечения.
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);
Для cookie-session
я всегда получаю {} в моем терминале.
Для express-session
, я получаю такие вещи.
req.session: { cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}
req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
Это меня действительно смущает. Итак, как объяснить результат с помощью основного использования? И какая разница между ними? Когда я должен их использовать?
Ответы
Ответ 1
В принципе, express-session
является более абстрактным, он поддерживает разные хранилища сеансов (например, файлы, БД, кеш и многое другое).
И cookie-session
- это простой/легкий файл cookie (cookie - единственный поддерживаемый движок хранения: вся информация о сеансе хранится на сеансе клиента, в cookie). Этот вид сеансов, вероятно, наиболее известен своей Rails-реализацией.
Ответ 2
Основное различие между ними связано с тем, как и где хранятся данные сеанса.
Сегмент cookie в основном используется для облегченных приложений сеанса, где данные сеанса хранятся в файле cookie, но внутри клиента [браузер], тогда как Экспресс-сессия хранит только простой идентификатор сеанса внутри файла cookie на стороне клиента, сохраняя данные сеанса целиком на сервере.
Cookie Session полезно в приложениях, где база данных не используется в фоновом режиме. Однако данные сеанса не могут превышать размер файла cookie. В условиях, когда используется база данных, она действует как кеш, чтобы остановить частой поиск базы данных, который является дорогостоящим.
Ответ 3
express-session
хранит идентификатор сеанса в connect-redis
cookie, в то время как фактические данные сеанса находятся в хранилище внутренних сеансов, например connect-redis
, где в качестве cookie-session
позволяет сохранять данные сеанса в connect-redis
cookie (на стороне клиента).
Из документации cookie-session
:
Пользовательский сеанс может быть сохранен двумя основными способами с помощью файлов cookie: на сервере или на клиенте. Этот модуль хранит данные сеанса на клиенте в файле cookie, в то время как такой модуль, как экспресс-сеанс, сохраняет только идентификатор сеанса на клиенте в файле cookie и сохраняет данные сеанса на сервере, обычно в базе данных.
Основное преимущество использования cookie-session
- когда у вас есть кластерное приложение node.js
, тогда вам не нужно полагаться на совместное использование данных сеанса между разветвленными процессами.
Ответ 4
Позвольте мне поделиться важной разницей, которую я нашел: безопасные куки.
У меня есть процесс узла за прокси-сервером nginx, который обрабатывает SSL.
Я пробовал с экспресс-сессией, но я не смог включить безопасные куки, смотрите проблему здесь.
Затем я попробовал почти с тем же кодом, но вместо этого с cookie-сессией, что-то вроде
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)
Я просто изменил require('express-session')
на require('cookie-session')
и добавил secureProxy: true,
все работало из коробки.
Также обратите внимание, что оба пакета поддерживаются expressjs, поэтому, вероятно, в моем случае использования мне посчастливилось узнать, что cookie-сессия соответствует моим потребностям.
Ответ 5
Получите непустой console.log(req.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')
})
Если вы никогда не устанавливаете какую-либо информацию для объекта req.session, он вернется пустым.
Ответ 6
v4-> cookie-сессия (Установить сеансы на основе файлов cookie) равна → v3 express.cookieSession
v4-> express-session is (Установить сеансы на основе сервера (только для разработки)). равно в → v3 express.session