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.
- Не делать токены «вечными» и регулярно менять ключи подписи.