StudyCode
Сессия — сервер хранит данные входа у себя (Redis/БД), а клиенту выдаёт случайный id в cookie; каждый запрос — поход в хранилище, зато сессию можно мгновенно отозвать, удалив запись. JWT — самодостаточный токен: полезная нагрузка (id пользователя, роль, срок жизни) плюс подпись секретом сервера; проверка — только криптография, без похода в БД, что удобно для микросервисов и горизонтального масштабирования. Обратная сторона JWT: до истечения exp его нельзя отозвать (сервер stateless), поэтому используют короткоживущий access-токен (минуты) + refresh-токен для продления. Важно: JWT подписан, но не зашифрован — payload читается любым, кто получил токен, секретов туда класть нельзя.
// JWT: проверка без похода в БД
const jwt = require('jsonwebtoken');
// При логине
const token = jwt.sign(
{ userId: 7, role: 'user' },
process.env.JWT_SECRET,
{ expiresIn: '15m' } // короткий срок жизни!
);
// На каждом запросе — только криптография
function authMiddleware(req, res, next) {
try {
const token = req.headers.authorization?.split(' ')[1];
req.user = jwt.verify(token, process.env.JWT_SECRET);
next();
} catch {
res.status(401).json({ error: 'Невалидный токен' });
}
}