Проверяет понимание различий между JWT и серверными сессиями и умение комбинировать их в реальных архитектурах аутентификации.
JWT и серверные сессии решают одну задачу — подтвердить, что запрос пришёл от аутентифицированного пользователя, но делают это по-разному. JWT — это самодостаточный токен: сервер подписывает данные и при следующем запросе просто проверяет подпись, не обращаясь к хранилищу. Серверная сессия — это запись на сервере (в памяти, Redis, БД), а клиент носит только идентификатор сессии (session id) в cookie.
На практике чистый JWT неудобен: его нельзя отозвать до истечения срока, а хранить долгоживущий токен на клиенте небезопасно. Чистая сессия тоже не идеальна: каждый запрос требует обращения к хранилищу, что усложняет масштабирование. Поэтому применяют гибридные схемы:
Пользователь логинится, сервер выдаёт access JWT на 15 минут и refresh-токен, привязанный к записи в Redis. При обновлении access-токена сервер проверяет refresh в Redis — это позволяет отозвать сессию.
// Выдача токенов при логине
const access = jwt.sign({ sub: user.id }, SECRET, { expiresIn: '15m' });
const refresh = crypto.randomUUID();
await redis.set(`refresh:${refresh}`, user.id, 'EX', 60 * 60 * 24 * 7);
res.cookie('refresh', refresh, { httpOnly: true, secure: true });
res.json({ access });
// Проверка access-токена (stateless)
function auth(req, res, next) {
try {
req.user = jwt.verify(req.headers.authorization.split(' ')[1], SECRET);
next();
} catch { res.status(401).end(); }
}
// Обновление access через refresh (stateful)
app.post('/refresh', async (req, res) => {
const userId = await redis.get(`refresh:${req.cookies.refresh}`);
if (!userId) return res.status(401).end();
res.json({ access: jwt.sign({ sub: userId }, SECRET, { expiresIn: '15m' }) });
});Итог: JWT и серверные сессии не взаимоисключаемы, а дополняют друг друга. Гибридную схему стоит применять, когда нужна быстрая stateless-проверка на множестве сервисов и при этом важна возможность отзыва сессии — например, в микросервисах с единым auth-сервисом и Redis для refresh-токенов.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию