Ответ
JSON Web Token (JWT) — это компактный, URL-безопасный способ представления утверждений (claims), которые должны быть переданы между двумя сторонами. В веб-разработке на Node.js JWT чаще всего используется как стандарт для токенов доступа в stateless-аутентификации.
Структура токена (Header.Payload.Signature):
- Header: Содержит тип токена (
typ: "JWT") и алгоритм подписи (alg, например,HS256илиRS256). - Payload: Содержит утверждения (claims) — данные о пользователе (например,
userId,role) и служебную информацию (iss— издатель,exp— срок действия). - Signature: Создается путём кодирования header и payload по алгоритму Base64Url, их объединения и подписи с использованием секретного ключа (для
HS256) или приватного ключа (дляRS256). Подпись обеспечивает целостность токена.
Пример работы с JWT в Node.js (библиотека jsonwebtoken):
const jwt = require('jsonwebtoken');
const SECRET_KEY = process.env.JWT_SECRET; // Хранить в переменных окружения!
// 1. Создание (подписание) токена при успешном логине
function generateAccessToken(user) {
return jwt.sign(
{
userId: user.id,
role: user.role
}, // Payload
SECRET_KEY,
{ expiresIn: '15m' } // Токен действует 15 минут
);
}
// 2. Верификация и декодирование токена в middleware
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Извлечь токен из 'Bearer <token>'
if (!token) return res.sendStatus(401);
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) return res.sendStatus(403); // Токен невалиден или просрочен
req.user = user; // Добавляем данные из payload в объект запроса
next();
});
}
Важные моменты:
- JWT не зашифрован, а только закодирован и подписан. Не храните в payload конфиденциальные данные.
- Для обеспечения безопасности используйте короткое время жизни Access Token и механизм Refresh Token.
- Подпись
HS256использует один секретный ключ,RS256— пару приватный/публичный ключ, что безопаснее для распределённых систем.