Skip to main content
Практика завдань

Як працює управління сесіями в Express.js?

Управління сесіями в Express.js

Сесії дозволяють зберігати дані між кількома HTTP-запитами від одного й того ж клієнта. Оскільки HTTP є безстанним, сесії забезпечують стан, зберігаючи дані на сервері та ідентифікуючи клієнта за допомогою куки.


Як працюють сесії

Клієнт Сервер │ │ │── GET /login ──────────>│ │ │ Створює сесію, зберігає в пам'яті/БД │<── Set-Cookie: sid=abc──│ │ │ │── GET /dashboard ──────>│ Cookie: sid=abc │ │ Шукає сесію за "abc" │<── Панель користувача ──│

Використання express-session

bash
npm install express-session
js
const session = require('express-session'); app.use(session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, cookie: { secure: process.env.NODE_ENV === 'production', // Тільки HTTPS httpOnly: true, // Не доступно через JavaScript maxAge: 24 * 60 * 60 * 1000, // 24 години sameSite: 'lax' // Захист від CSRF } }));

Використання сесій

js
// Увійти — зберегти користувача в сесії app.post('/login', async (req, res) => { const user = await authenticate(req.body); if (user) { req.session.userId = user.id; req.session.role = user.role; res.json({ message: 'Увійшли' }); } else { res.status(401).json({ error: 'Невірні облікові дані' }); } }); // Захищений маршрут — перевірка сесії app.get('/dashboard', (req, res) => { if (!req.session.userId) { return res.status(401).json({ error: 'Не автентифіковано' }); } res.json({ message: `Ласкаво просимо, користувачу ${req.session.userId}` }); }); // Вийти — знищити сесію app.post('/logout', (req, res) => { req.session.destroy((err) => { if (err) return res.status(500).json({ error: 'Вихід не вдався' }); res.clearCookie('connect.sid'); res.json({ message: 'Вийшли' }); }); });

Сховища сесій

За замовчуванням сесії зберігаються в пам'яті (не підходить для виробництва):

СховищеПакетНайкраще для
Пам'ятьВбудованеТільки для розробки
Redisconnect-redisВиробництво (швидко, масштабовано)
PostgreSQLconnect-pg-simpleКоли ви вже використовуєте Postgres
MongoDBconnect-mongoКоли ви вже використовуєте MongoDB
js
const RedisStore = require('connect-redis').default; const { createClient } = require('redis'); const redisClient = createClient({ url: process.env.REDIS_URL }); await redisClient.connect(); app.use(session({ store: new RedisStore({ client: redisClient }), secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false }));

Сесії vs JWT

ФункціяСесіїJWT
ЗберіганняНа стороні сервераНа стороні клієнта (токен)
МасштабованістьПотрібно спільне сховищеБезстанне
ВідкликанняЛегко (видалити сесію)Важко (потрібен чорний список)
РозмірМаленька кукаБільший токен
БезпекаАтрибути кукиПеревірка токена
Найкраще дляТрадиційних веб-додатківAPI, SPA, мікросервісів

Рекомендація: Використовуйте сесії для серверних додатків. Використовуйте JWT для API, що споживаються SPA або мобільними додатками. Для систем великого масштабу використовуйте сесії на основі Redis для легкого горизонтального масштабування.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань