JWT (JSON Web Token), или JVT, — JSON-объект, определённый в открытом стандарте RFC 7519. Он представляет собой безопасный способ передачи информации между двумя участниками.
Структура JWT
JWT состоит из трёх частей, разделённых точками:
- Заголовок (Header): Содержит информацию о типе токена и алгоритме подписи. Это JSON-объект, например:
{
"typ": "JWT",
"alg": "HS256"
}
- typ: указывает тип токена (JWT).
- alg: определяет алгоритм хеширования. HS256 — HMAC SHA256 (симметричный алгоритм, требующий секретного ключа). Другой распространённый алгоритм — RS256 (асимметричный алгоритм, использующий пару ключей: публичный и приватный).
- Полезная нагрузка (Payload): Содержит передаваемые данные (claims — претензии). Примеры claims:
- iss (издатель): приложение, отправившее токен.
- sub (субъект): тема токена.
- exp (время истечения): время жизни токена.
- aud (аудитория): получатели токена.
- nbf (не действителен до): срок, до которого токен недействителен.
- iat (время создания): время создания токена.
- jti (JWT ID): идентификатор токена.
Можно добавлять произвольные данные по соглашению сторон. Например, user_id, имя пользователя. Важно помнить, что больший объём данных увеличивает размер JWT, что может повлиять на производительность. Payload не шифруется, поэтому не следует включать конфиденциальные данные (паспортные данные и т.д.). Пример Payload:
{
"user_id": 123
}
- Подпись (Signature): Вычисляется с использованием алгоритма из заголовка, секретного ключа и Base64URL-закодированных заголовка и полезной нагрузки. Псевдокод:
Base64URL(header) + "." + Base64URL(payload) Хеширование полученной строки с использованием алгоритма из заголовка и секретного ключа
Создание и проверка JWT
- Создание заголовка (Header): Определите тип токена и алгоритм подписи (например, HS256 или RS256).
- Создание полезной нагрузки (Payload): Добавьте необходимые данные (claims).
- Создание подписи (Signature): Вычислите подпись, используя алгоритм, заголовок, полезную нагрузку и секретный ключ.
- Объединение компонентов: Соедините заголовок, полезную нагрузку и подпись, разделив их точками. Полученная строка — JWT. Используйте онлайн-сервисы, такие как jwt.io, для создания и проверки JWT.
- Проверка JWT: Приложение, получающее JWT, проверяет подпись, используя секретный ключ (или публичный ключ для алгоритмов с асимметричным шифрованием). Верная подпись указывает на валидный токен.
Проверка подлинности с использованием JWT
Схема с тремя участниками: пользователь (User), сервер приложения (Application Server) и сервер аутентификации (Authentication Server).
- Пользователь отправляет учётные данные (логин/пароль) на сервер аутентификации.
- Сервер аутентификации создаёт JWT с информацией о пользователе и отправляет его пользователю.
- Пользователь отправляет запросы к серверу приложения, включая JWT в заголовке.
- Сервер приложения проверяет подпись JWT, используя секретный ключ от сервера аутентификации. Верная подпись означает валидный токен, и сервер приложения предоставляет доступ к ресурсам.
Преимущества и безопасность JWT
JWT — мощный инструмент для аутентификации и авторизации, широко используемый в современных приложениях, особенно в микросервисной архитектуре. Преимущества: отсутствие необходимости хранения информации о сессиях на сервере приложения, возможность использования отдельного сервиса аутентификации, единая точка входа (SSO) для разных сервисов, возможность хранения произвольных данных в полезной нагрузке для повышения производительности.
Для обеспечения безопасности используйте: защищённое соединение (HTTPS), не передавайте конфиденциальные данные в JWT, ограничивайте время жизни JWT, используйте Refresh Tokens, длинные и сложные ключи, регулярно меняйте ключи, проверенные библиотеки, и всегда валидируйте полученные данные. JWT используется во многих системах авторизации, таких как OAuth 2.0 и OpenID Connect, но не является их неотъемлемой частью.
Refresh Tokens
В современных системах часто используется пара токенов: Access Token (короткий срок жизни) и Refresh Token (длинный срок жизни). Access Token используется для авторизации, а Refresh Token — для получения нового Access Token после истечения его срока действия.