JWT
2 tools
Основы веб-безопасности
Веб-безопасность — это практика защиты веб-приложений и API от несанкционированного доступа, утечек данных и атак.
JSON Web Token (JWT) — доминирующий механизм аутентификации без состояния в современной веб-разработке.
JSON Web Tokens (JWT)
JWT — это компактный, URL-безопасный способ представления утверждений между двумя сторонами. Он состоит из трёх частей, закодированных в Base64url и разделённых точками.
Три части JWT
Содержит метаданные токена: алгоритм подписи (alg) и тип токена (typ).
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9{
"alg": "HS256",
"typ": "JWT"
}Содержит утверждения: заявления о пользователе. Данные payload НЕ шифруются, только подписываются.
eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcxNzIwMDAwMH0{
"sub": "user_123",
"role": "admin",
"exp": 1717200000
}Криптографическая подпись над закодированными заголовком и payload. Верификация гарантирует, что токен не был изменён.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cHMACSHA256( base64url(header) + "." + base64url(payload), secret )
Стандартные утверждения JWT
Спецификация JWT определяет стандартные имена утверждений для обеспечения совместимости:
| Утверждение | Название | Описание |
|---|---|---|
| iss | Issuer | Идентифицирует субъект, выдавший токен |
| sub | Subject | Идентифицирует субъект токена (например, ID пользователя) |
| aud | Audience | Идентифицирует получателей токена |
| exp | Expiration | Unix-временная метка, после которой токен не принимается |
| nbf | Not Before | Unix-временная метка, до которой токен не принимается |
| iat | Issued At | Unix-временная метка выдачи токена |
| jti | JWT ID | Уникальный идентификатор токена для предотвращения replay-атак |
Алгоритмы подписи
Алгоритм подписи объявляется в заголовке JWT. Правильный выбор критически важен для безопасности:
HS256 / HS384 / HS512Симметричный (HMAC)Использует общий секретный ключ для подписи и верификации.
RS256 / RS384 / RS512Асимметричный (RSA)Использует приватный ключ для подписи и публичный для верификации. Приватный ключ никогда не покидает сервер аутентификации.
ES256 / ES384 / ES512Асимметричный (ECDSA)Как RSA, но с меньшими ключами и более быстрой подписью.
"alg": "none"Без подписи — ОПАСНОНет подписи. Токен с alg:none не имеет гарантий целостности и может быть подделан.
Потоки аутентификации
- 1.Пользователь отправляет имя пользователя и пароль на endpoint входа
- 2.Сервер проверяет учётные данные по базе данных пользователей
- 3.Сервер подписывает JWT с утверждениями пользователя и сроком действия
- 4.Клиент сохраняет JWT (localStorage, cookie или память)
- 5.Клиент отправляет JWT в заголовке Authorization: Bearer для последующих запросов
- 1.Клиент перенаправляет пользователя на сервер авторизации с code challenge
- 2.Пользователь аутентифицируется и авторизует клиентское приложение
- 3.Сервер авторизации перенаправляет с одноразовым кодом авторизации
- 4.Клиент обменивает код + верификатор на access и refresh токены
- 5.Клиент использует access token для API-вызовов; refresh token для обновления
Распространённые уязвимости JWT
JWT безопасны при правильной реализации. Вот наиболее распространённые ошибки реализации:
Некоторые библиотеки принимают токены с alg:none. Злоумышленник может изменить payload и подделать любой JWT.
Если библиотека должна верифицировать RS256, но принимает HS256, злоумышленник может подписать токен, используя публичный ключ как HMAC-секрет.
JWT без утверждения exp позволяет использовать токены неограниченно. Всегда устанавливайте короткий срок действия.
Payload JWT закодирован в Base64, а не зашифрован. Никогда не храните пароли или другие секреты в утверждениях JWT.
JWT, подписанные с короткими или предсказуемыми секретами, могут быть взломаны методом перебора.
Принятие JWT без верификации подписи полностью доверяет payload. Всегда верифицируйте подпись перед доверием любому утверждению.
Часто задаваемые вопросы
Стандартные JWT (JWS) подписаны, но НЕ зашифрованы. Payload закодирован в Base64url, что тривиально обратимо.
Access токены должны быть кратковременными: 5–60 минут — типичное значение. Используйте refresh токены для получения новых.
HttpOnly cookies — наиболее безопасный вариант, недоступный для JavaScript и защищающий от XSS.
Нет без серверного состояния. Решения: короткий срок действия, список блокировки токенов (Redis).
Session cookies хранят случайный ID сессии; сервер ищет данные сессии. JWT самодостаточны — сервер проверяет подпись без обращения к базе данных.
Минимум: sub (ID пользователя), exp (срок действия) и iat (время выдачи). Держите payload небольшим.
RS256 (асимметричный) лучше для большинства продакшен-систем, поскольку только сервер аутентификации нуждается в приватном ключе.
PKCE — расширение потока авторизационного кода OAuth2, предотвращающее перехват кода. Обязательно для публичных клиентов (SPA, мобильные приложения).