JWT (JSON Web Token) — компактный самодостаточный способ передавать «утверждения» (например, кто пользователь) между двумя сторонами, подписанный так, что его нельзя подделать. Ниже — как он устроен и что делает каждая часть, плюс бесплатный декодер, чтобы заглянуть внутрь любого токена.
Декодировать JWT бесплатно →Три части
JWT — это три части Base64URL через точки: заголовок (алгоритм подписи и тип токена), payload (утверждения — sub, iat, exp) и подпись (доказывает, что токен не меняли). Секрет нужен только для подписи — заголовок и payload просто закодированы.
Закодировано, а не зашифровано
Главное, что упускают: payload читается любым, у кого есть токен — это Base64, а не шифрование. Никогда не кладите в payload пароли, секреты или чувствительные персональные данные.
Частые поля (claims)
Стандартные поля в payload:
- sub — субъект (обычно пользователь)
- iat — время выпуска
- exp — время истечения
- nbf — недействителен ранее
- iss — издатель
- aud — целевая аудитория
iat, exp и nbf — это Unix-метки времени, их можно перевести в читаемую дату.
Как работает подпись
Сервер подписывает заголовок и payload секретом (HMAC) или приватным ключом (RSA/EC). Любой с подходящим секретом или публичным ключом может проверить подпись — так сервер доверяет полученному токену, ничего не храня.
Когда применять JWT
Аутентификация и авторизация без состояния: после входа сервер выдаёт подписанный JWT, клиент шлёт его с каждым запросом, а сервер проверяет без обращения к базе. Держите их короткоживущими и сочетайте с refresh-токенами.
Частые вопросы
JWT — это безопасно?+
Подпись делает подделку заметной, но payload читается любым, у кого есть токен. Используйте HTTPS, короткое время жизни и никогда не храните секреты внутри.
Можно ли доверять декодированному JWT?+
Декодирование только читает токен — оно не проверяет подпись. Чтобы доверять токену, нужно проверить подпись секретом или публичным ключом, которые нельзя вставлять на публичном сайте.
Почему JWT «истёк»?+
Если поле exp в прошлом, токен истёк и должен отклоняться. Переведите exp из Unix-времени, чтобы увидеть точный момент истечения.