JWT (JSON Web Token): создание и структура

JWT (JSON Web Token), или JVT, — JSON-объект, определённый в открытом стандарте RFC 7519. Он представляет собой безопасный способ передачи информации между двумя участниками.

Структура JWT

JWT состоит из трёх частей, разделённых точками:

  1. Заголовок (Header): Содержит информацию о типе токена и алгоритме подписи. Это JSON-объект, например:
{
  "typ": "JWT",
  "alg": "HS256"
}
  • typ: указывает тип токена (JWT).
  • alg: определяет алгоритм хеширования. HS256 — HMAC SHA256 (симметричный алгоритм, требующий секретного ключа). Другой распространённый алгоритм — RS256 (асимметричный алгоритм, использующий пару ключей: публичный и приватный).
  1. Полезная нагрузка (Payload): Содержит передаваемые данные (claims — претензии). Примеры claims:
  • iss (издатель): приложение, отправившее токен.
  • sub (субъект): тема токена.
  • exp (время истечения): время жизни токена.
  • aud (аудитория): получатели токена.
  • nbf (не действителен до): срок, до которого токен недействителен.
  • iat (время создания): время создания токена.
  • jti (JWT ID): идентификатор токена.

Можно добавлять произвольные данные по соглашению сторон. Например, user_id, имя пользователя. Важно помнить, что больший объём данных увеличивает размер JWT, что может повлиять на производительность. Payload не шифруется, поэтому не следует включать конфиденциальные данные (паспортные данные и т.д.). Пример Payload:

{
  "user_id": 123
}
  1. Подпись (Signature): Вычисляется с использованием алгоритма из заголовка, секретного ключа и Base64URL-закодированных заголовка и полезной нагрузки. Псевдокод:
Base64URL(header) + "." + Base64URL(payload)
Хеширование полученной строки с использованием алгоритма из заголовка и секретного ключа

Создание и проверка JWT

  1. Создание заголовка (Header): Определите тип токена и алгоритм подписи (например, HS256 или RS256).
  2. Создание полезной нагрузки (Payload): Добавьте необходимые данные (claims).
  3. Создание подписи (Signature): Вычислите подпись, используя алгоритм, заголовок, полезную нагрузку и секретный ключ.
  4. Объединение компонентов: Соедините заголовок, полезную нагрузку и подпись, разделив их точками. Полученная строка — JWT. Используйте онлайн-сервисы, такие как jwt.io, для создания и проверки JWT.
  5. Проверка JWT: Приложение, получающее JWT, проверяет подпись, используя секретный ключ (или публичный ключ для алгоритмов с асимметричным шифрованием). Верная подпись указывает на валидный токен.

Проверка подлинности с использованием JWT

Схема с тремя участниками: пользователь (User), сервер приложения (Application Server) и сервер аутентификации (Authentication Server).

  1. Пользователь отправляет учётные данные (логин/пароль) на сервер аутентификации.
  2. Сервер аутентификации создаёт JWT с информацией о пользователе и отправляет его пользователю.
  3. Пользователь отправляет запросы к серверу приложения, включая JWT в заголовке.
  4. Сервер приложения проверяет подпись 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 после истечения его срока действия.

Что будем искать? Например,программа