Что такое JWT?
Как указано на официальном сайте, аббревиатура JWT расшифровывается как JSON Web Token
(веб-токены JSON). Если вы еще не знакомы с веб-токенами JSON, не волнуйтесь — они не такие уж и сложные.
На изображении ниже представлена структура JWT:

- Header (заголовок) — информация об алгоритме шифрования (alg) и типе (type) токена;
- Payload (информационное наполнение) — данные токена: sub — собственник токена (как правило, uuid пользователя); name — имя пользователя; iat — время создания токена;
- Signature (сигнатура) — строка, полученная из частей токена (Header + Payload) при помощи шифрования.
Можете представить JWT как часть данных JSON, которые проверяются сайтом для подтверждения того, что эти данные исходят от пользователя, которому можно доверять.
Не будем вдаваться в подробности того, как это реализовано, — можете изучить данный вопрос самостоятельно.
Рассмотрим процесс использования JWT:
- Сайт, на который заходит пользователь, генерирует JWT и отправляет пользователю.
- JWT действует как пакет, содержащий некую идентификационную информацию о пользователе, такую как имя пользователя, роли, права доступа и т. д.
- Пользователь передает этот JWT-пакет сайту при каждом запросе к нему.
- Каждый раз, когда пользователь заходит на страницу, требующую аутентификации, он предъявляет этот JWT-пакет.
- Получая JWT, сайт верифицирует свою сигнатуру для подтверждения того, что это именно он выдал JWT, и проверяет содержащуюся в JWT информацию, чтобы подтвердить личность пользователя и его права доступа.
- Если все подтверждается, пользователю разрешается продолжить доступ к защищенной странице.

Почему не рекомендуется использовать JWT?
Применение JWT обычно необходимо для решения следующих задач:
- регистрация пользователя на сайте;
- вход пользователя на сайт;
- осуществление пользователем кликов и выполнение действий;
- использование сайтом информации о пользователе для создания, обновления или удаления данных.
Эти задачи часто предусматривают определенные операции с базой данных:
- запись действий, выполняемых пользователем;
- добавление некоторых данных пользователя в базу данных;
- проверка прав пользователя для подтверждения того, что он может выполнять определенные действия.
Теперь рассмотрим по отдельности некоторые из недостатков JWT.
Размер
Это очевидная проблема. Например, хранить идентификатор пользователя типа «xiaou» можно двумя способами, но с разным результатом:
- при хранении в файлах-cookie общий размер составит всего 5 байт;
- при хранении в JWT размер увеличится примерно в 51 раз.

JWT, несомненно, увеличивает нагрузку на пропускную способность сайта.
Избыточные сигнатуры
Одним из главных преимуществ JWT-пакета является его зашифрованная сигнатура. Поскольку каждый JWT-пакет имеет свою сигнатуру, сайт-получатель может проверить, является ли JWT действительным и заслуживающим доверия.
Однако в последние 20 лет почти все веб-фреймворки предлагают преимущества зашифрованных сигнатур при использовании обычных сессионных файлов-cookie. Более того, большинство веб-фреймворков автоматически обеспечивают сигнатурами (и даже шифруют) файлы-cookie.
Это означает, что можно получить преимущества сигнатур JWT без необходимости использовать JWT.
На практике в большинстве случаев веб-аутентификации данные JWT хранятся в сессионных файлах-cookie. Это говорит об избыточности сигнатур, хранящихся на двух уровнях: в файлах-cookie и в JWT.
Проблема отзыва токенов
Поскольку токены остаются действительными до истечения срока их действия, у сервера нет простого способа отозвать их.
Рассмотрим случаи использования JWT, когда этот метод аутентификации может стать небезопасным.
Выход из системы на самом деле не выводит из нее пользователя!
Допустим, вы написали что-то в Twitter, а затем вышли из системы. Вы считаете, что вышли с сервера, но это не так.
Поскольку JWT — самодостаточные токены, они остаются действительными до истечения срока их действия, который может составлять 5 минут, 30 минут или любой другой срок.
Таким образом, тот, кто получит такой токен в течение установленного времени, сможет продолжать получать доступ к вашей учетной записи до истечения срока его действия.
Использование устаревших данных
Представьте, что пользователь является администратором, но его роль понизили до обычного пользователя с меньшими привилегиями. Опять же, это не произойдет немедленно, а значит, у этого пользователя будут оставаться права администратора до истечения срока действия JWT.
JWT часто не шифруются
Это означает, что любой, кто предпримет атаку с применением технологии «незаконный посредник» и перехватит JWT, получит ваши учетные данные для аутентификации. Это довольно просто, поскольку злоумышленнику нужно перехватить только соединение между сервером и клиентом.
Заключение
Подводя итог, можно сказать, что JWT подходят в качестве токенов одноразовой аутентификации для передачи требований между двумя сущностями.
Однако JWT не годятся для использования в качестве механизма долгосрочного хранения постоянных данных, особенно для управления пользовательскими сессиями.
Использование JWT для управления сессиями может вызвать ряд серьезных проблем с безопасностью и реализацией.
Для хранения долгосрочных, постоянных данных лучше использовать традиционные механизмы сессий, такие как сессионные файлы-cookie, с их отлаженными должным образом реализациями.
Если вы используете JWT для собственных целей разработки и обучения, не заботясь о безопасности и производительности, то это вполне нормально.
Однако если имеете дело с производственной средой, необходимо избегать потенциальных проблем.
Читайте также:
- Аутентификация и авторизация пользователей в Angular 16 с помощью JWT
- JWT-аутентификация в Spring Boot Webflux
- Полное руководство по управлению JWT во фронтенд-клиентах (GraphQL)
Читайте нас в Telegram, VK и Дзен
Перевод статьи Oliver Foster: Why do many people not recommend using JWT?