jwt токен
JWT токен (JSON Web Token, произносится «джот») — компактный, URL-безопасный формат передачи данных между сторонами в виде JSON-объекта, защищённого цифровой подписью. JWT-токен позволяет серверу верифицировать подлинность информации без обращения к базе данных — достаточно проверить подпись. Стандарт описан в RFC 7519 и широко применяется для аутентификации и передачи утверждений (claims) в веб-приложениях и API.
Структура JWT: три части
JWT представляет собой строку из трёх частей, разделённых точками: header.payload.signature. Каждая часть кодируется в Base64Url.
- Header (заголовок) — JSON-объект с типом токена ("typ": "JWT") и алгоритмом подписи ("alg": "HS256"). Пример: {"alg":"HS256","typ":"JWT"}.
- Payload (полезная нагрузка) — JSON-объект с утверждениями (claims). Стандартные: sub (субъект, обычно ID пользователя), iat (время выпуска), exp (время истечения), iss (издатель), aud (аудитория). Можно добавлять произвольные поля: роли, email, permissions.
- Signature (подпись) — вычисляется как HMAC-SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) для симметричных алгоритмов или RSA/ECDSA-подпись для асимметричных.
Как работает JWT-аутентификация
Типичный flow:
- Пользователь отправляет логин и пароль на сервер.
- Сервер проверяет учётные данные и при успехе создаёт JWT с данными пользователя (ID, роли) и подписывает его секретным ключом.
- Клиент получает токен и сохраняет его (обычно в localStorage или в httpOnly cookie).
- При каждом запросе клиент отправляет токен в заголовке: Authorization: Bearer <token>.
- Сервер верифицирует подпись и извлекает данные из payload без обращения к базе данных.
Ключевое свойство — stateless: сервер не хранит сессии. Это позволяет легко масштабировать сервис горизонтально.
Алгоритмы подписи: HS256, RS256, ES256
Выбор алгоритма критически важен для безопасности:
- HS256 (HMAC-SHA256) — симметричный. Один секретный ключ используется и для подписания, и для верификации. Прост, но требует, чтобы все сервисы, проверяющие токен, знали секрет. Подходит для монолитов.
- RS256 (RSA-SHA256) — асимметричный. Приватный ключ подписывает, публичный — верифицирует. Публичный ключ можно безопасно распространять. Подходит для микросервисов и стороннего потребления.
- ES256 (ECDSA-SHA256) — асимметричный на основе эллиптических кривых. Более короткие ключи при той же безопасности, что RS256.
Никогда не используйте алгоритм "none" — это историческая уязвимость, позволявшая обойти проверку подписи.
Безопасное хранение JWT на клиенте
Место хранения токена влияет на модель угроз:
- localStorage / sessionStorage — доступен через JavaScript, уязвим к XSS-атакам. Если злоумышленник внедрит скрипт на страницу, он прочитает токен.
- httpOnly cookie — недоступен через JavaScript (защита от XSS), но уязвим к CSRF. Требует CSRF-защиты (SameSite=Strict/Lax, CSRF-токены). Рекомендованный подход для большинства веб-приложений.
Рекомендация: хранить access token в памяти (переменная JavaScript), refresh token — в httpOnly cookie.
Refresh tokens и ротация
Access token должен иметь короткое время жизни (15 минут — 1 час). Для продления сессии без повторного логина используют refresh token — долгоживущий токен (дни/недели), хранящийся в httpOnly cookie. Клиент использует refresh token для получения нового access token. Рекомендуется ротация: при каждом использовании refresh token выдаётся новый и старый инвалидируется (Refresh Token Rotation). Это позволяет обнаружить кражу токена.
Ограничения JWT: нельзя отозвать досрочно
Главный недостаток JWT — невозможность отзыва до истечения срока действия. Если токен скомпрометирован, сервер не может «аннулировать» его без хранения списка отозванных токенов (token blacklist) — что возвращает нас к stateful-модели. Решения: короткое время жизни access token + refresh token с ротацией, либо хранение JWT ID в Redis с TTL для критических операций.
JWT vs сессии: когда что выбирать
Серверные сессии (sessionId в cookie + данные в Redis/БД) подходят для монолитных приложений с одним сервером, когда важна мгновенная инвалидация. JWT оптимален для микросервисов (сервисы верифицируют токен независимо), мобильных API (нет браузерных cookie), OAuth 2.0 / OpenID Connect (JWT = стандартный формат ID Token), и когда нужно масштабировать без общего хранилища сессий.
Частые вопросы
Безопасен ли JWT по умолчанию?
JWT обеспечивает целостность данных через подпись, но не шифрование: payload кодируется в Base64, а не шифруется. Любой, у кого есть токен, может декодировать и прочитать payload. Не помещайте в JWT секретные данные (пароли, номера карт). Для шифрования существует JWE (JSON Web Encryption).
Как проверить JWT-токен на сервере?
Сервер берёт заголовок и payload из токена, вычисляет подпись с помощью секретного ключа (или публичного ключа для RS/ES алгоритмов) и сравнивает с подписью в токене. Если совпадают — токен не изменён. Затем проверяет поля exp (срок действия), iss (издатель) и aud (аудитория). Всё это делают JWT-библиотеки автоматически.
Что происходит при истечении срока действия JWT?
Сервер отклоняет запрос с кодом 401 Unauthorized. Клиент должен обнаружить этот ответ и использовать refresh token для получения нового access token. Если refresh token тоже истёк или отозван, пользователя нужно перенаправить на страницу входа.
Другие термины в теме «Веб-разработка»
Не хватает деталей?
Напишите, что уточнить по теме «jwt токен» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).