JWT (JSON Web Token)

Компактный подписанный токен с данными о пользователе и его правах: сервер проверяет подпись и доверяет содержимому без обращения к базе.

JWT (JSON Web Token, стандарт RFC 7519) — компактный формат токена, в котором хранятся сведения о пользователе и его правах, защищенные подписью. Сервер, получив токен, проверяет подпись и, если она верна, доверяет содержимому — не обращаясь к базе данных за сессией. Поэтому JWT широко используют для авторизации в API и между микросервисами.

Из чего состоит

Токен — три части через точку: заголовок, полезные данные и подпись. Первые две закодированы в формате Base64URL, то есть легко читаются.

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiIsInJvbGUiOiJtYW5hZ2VyIiwiZXhwIjoxNzk0MDAwMDAwfQ.<подпись>

После декодирования вторая часть — это JSON:

{ "sub": "42", "role": "manager", "exp": 1794000000 }

sub — кто пользователь, role — его роль, exp — время, когда токен истекает. Стандартные поля также указывают, кто выдал токен (iss) и для какого сервиса он предназначен (aud).

Подпись

  • HS256 — подпись HMAC-SHA256 общим секретным ключом. Просто, но проверить токен может только тот, у кого есть секрет, а значит, он же может и выпустить поддельный.
  • RS256, ES256 — подпись закрытым ключом, проверка открытым. Токены выпускает только сервер авторизации, а проверять их может любой сервис. Это предпочтительный вариант для систем из многих сервисов.

Важно: JWT не шифрует

Содержимое токена может прочитать кто угодно — подпись защищает только от изменений. Поэтому в JWT не кладут персональные данные, номера карт и секреты. Если содержимое нужно скрыть, используют шифрованный вариант JWE или передают токен только по защищенному каналу TLS.

Главная сложность — отзыв

Выданный токен действует до истечения срока, даже если пользователя уволили или токен украли: сервер не хранит список выданных токенов. Поэтому токены доступа делают короткими — 5–15 минут — и продлевают с помощью токена обновления, который хранится на сервере и может быть отозван. Эта схема — часть протокола OAuth 2.0.

Правила безопасного использования

  • Проверять подпись, срок действия, издателя и получателя токена; принимать только ожидаемый алгоритм подписи и никогда — «без подписи».
  • Хранить токены в браузере так, чтобы их не мог прочитать вредоносный скрипт при атаке XSS, — например, в cookie с флагом HttpOnly.
  • Не делать токены «вечными» и регулярно менять ключи подписи.