JWT (JSON Web Token, произносится как «джот») — это открытый стандарт (RFC 7519) для безопасной передачи информации между сторонами в виде JSON-объекта. JWT используется для аутентификации и авторизации пользователей в веб-приложениях и API, позволяя передавать данные о пользователе без необходимости хранить сессию на сервере.
Структура JWT
JWT состоит из трёх частей, разделённых точками:
- Header (заголовок) — содержит тип токена и алгоритм шифрования (например, HMAC SHA256 или RSA).
- Payload (полезная нагрузка) — содержит данные (claims), например, идентификатор пользователя, роль, время истечения токена.
- Signature (подпись) — создаётся путём шифрования закодированных header и payload с использованием секретного ключа. Это гарантирует, что токен не был изменён.
Пример JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Принцип работы
- Пользователь вводит логин и пароль.
- Сервер проверяет данные и создаёт JWT, подписывая его секретным ключом.
- Токен отправляется клиенту (обычно в теле ответа или заголовке).
- Клиент сохраняет токен (в localStorage, cookie или памяти) и отправляет его с каждым запросом в заголовке
Authorization: Bearer <token>. - Сервер проверяет подпись токена и извлекает данные из payload для авторизации.
Виды JWT
- Access Token — короткий токен для доступа к ресурсам, действует ограниченное время.
- Refresh Token — длинный токен для обновления access token без повторной аутентификации.
- ID Token — содержит информацию о пользователе, используется в OAuth 2.0 и OpenID Connect.
Преимущества
- Stateless (без состояния) — серверу не нужно хранить сессию, что упрощает масштабирование.
- Безопасность — подпись гарантирует целостность данных.
- Гибкость — можно передавать любые данные в payload.
- Кроссплатформенность — поддерживается большинством языков и фреймворков.
- Совместимость — стандарт открыт и широко используется.
Недостатки
- Размер — JWT больше, чем обычные сессионные токены, что увеличивает размер запросов.
- Невозможность отзыва — если токен украден, его нельзя отозвать до истечения срока действия (без дополнительных механизмов).
- Безопасность данных — не следует хранить чувствительные данные в payload, так как они только кодируются, а не шифруются.
- Сложность управления — требуется правильная настройка срока действия, алгоритмов шифрования и хранения ключей.
Примеры использования
- Аутентификация в веб-приложениях и мобильных приложениях.
- Авторизация API (REST, GraphQL).
- Однократный вход (SSO) между сервисами.
- Передача данных между микросервисами.
- Верификация email и сброс пароля.
Техническая реализация
JWT создаётся и проверяется с помощью библиотек для различных языков программирования:
- Node.js:
jsonwebtoken,jose - Python:
PyJWT,python-jose - PHP:
firebase/php-jwt,lcobucci/jwt - Java:
jjwt,auth0-java-jwt
Пример создания JWT на Node.js:
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: 123, role: 'admin' }, 'secret-key', { expiresIn: '1h' });
Пример проверки JWT:
const decoded = jwt.verify(token, 'secret-key');
Безопасность
- Используйте HTTPS для передачи токенов.
- Храните секретные ключи в защищённом месте (environment variables, vault).
- Устанавливайте короткий срок действия access token.
- Реализуйте механизм отзыва токенов (blacklist, short-lived tokens).
- Не храните чувствительные данные в payload.
