Что такое JWT
JSON Web Token — стандарт передачи данных между сторонами в виде подписанной строки. Токен состоит из трёх частей, разделённых точками: заголовок, полезная нагрузка и подпись. Первые две — это обычный JSON, закодированный в Base64URL.
Главное свойство: сервер может проверить подлинность токена, не обращаясь к базе данных. Подпись гарантирует, что содержимое не подменили, а значит данные внутри можно считать достоверными.
Три части токена
| Часть | Что содержит |
|---|---|
| Header | Алгоритм подписи и тип токена |
| Payload | Данные: идентификатор пользователя, роли, срок действия |
| Signature | Подпись заголовка и payload секретным ключом |
Стандартные поля
- iss — кто выпустил токен
- sub — о ком токен, обычно идентификатор пользователя
- aud — для кого предназначен
- exp — время истечения в формате Unix
- nbf — не действителен раньше указанного момента
- iat — когда выпущен
- jti — уникальный идентификатор токена
Все они необязательны, но exp стоит использовать всегда: без срока действия украденный токен работает вечно.
Алгоритмы подписи
HS256 использует один общий секрет для подписи и проверки — подходит, когда обе стороны доверяют друг другу. RS256 работает с парой ключей: приватным подписывают, публичным проверяют. Это безопаснее для распределённых систем, где проверять токен должны несколько сервисов.
Отдельно упомяну алгоритм none: он означает отсутствие подписи. Если сервер его принимает, любой может подделать токен. Это классическая уязвимость, и правильная реализация такие токены отвергает.
Почему проверка подписи здесь не делается
Для проверки нужен секретный ключ, а вводить его на стороннем сайте — плохая идея. Инструмент только декодирует содержимое, что не требует ключа и полностью безопасно. Проверять подпись следует в своём коде или через доверенную библиотеку.