Skip to content

Метод аутентификации JWT — это ложь

Почти каждый разработчик по умолчанию использует JWT для аутентификации пользователей, но они строят бомбу замедленного действия. Откройте для себя «скучную», но безопасную альтернативу, которая действительно работает.

Theo Brandt
Hero image for: Метод аутентификации JWT — это ложь

Кратко / Главное

Почти каждый разработчик по умолчанию использует JWT для аутентификации пользователей, но они строят бомбу замедленного действия. Откройте для себя «скучную», но безопасную альтернативу, которая действительно работает.

Безгосударственный миф, в который мы все верили

JWT, или JSON Web Tokens, продали нам красивую ложь: обещание аутентификации без сохранения состояния. Идея была элегантной. Сервер передает вам небольшой подписанный токен при входе в систему, а затем немедленно забывает любое состояние сессии. Это самодостаточное чудо означало сокращение запросов к базе данных, упрощенное горизонтальное масштабирование и, казалось бы, меньшую нагрузку на сервер. Звучит отлично, и люди в это поверили.

Но само основание этого обещания рухнуло под пристальным вниманием. По-настоящему безгосударственный токен не может быть отозван. Если вы выходите из системы, если вас забанили, или, что еще страшнее, если ваш токен украден при взломе, он остается полностью действительным до истечения срока его действия. Сервер, по своей конструкции, не имеет механизма для его «уничтожения». Эта фундаментальная уязвимость безопасности превращает безгосударственную мечту в кошмар.

Обходной путь почти каждого разработчика разоблачает обман. Чтобы противостоять неотзываемому токену, люди реализуют серверный «список отозванных токенов». Этот список, проверяемый при каждом запросе, вновь вводит состояние сессии, полностью сводя на нет основное преимущество без сохранения состояния. Как метко отмечает «The Boring Auth Method That Actually Works» от Better Stack, вы отбросили всю причину, по которой изначально выбрали JWT. Вы снова управляете состоянием, только теперь с дополнительными шагами и присущими уязвимостями.

Local Storage: Бэкдор вашей аутентификации

Многие разработчики, гоняясь за безгосударственной мечтой, совершают критическую ошибку: они хранят свои JWT в local storage браузера. Эта практика обеспечивает удобное сохранение сессии, позволяя пользователям оставаться в системе между сессиями браузера без дополнительных запросов к серверу. Однако это удобство обходится неприемлемой ценой в плане безопасности.

Этот, казалось бы, безобидный выбор хранилища создает зияющую лазейку для злоумышленников. Успешная уязвимость Cross-Site Scripting (XSS), часто возникающая из-за неэкранированного пользовательского ввода, позволяет любому вредоносному JavaScript, внедренному на страницу, выполняться с теми же привилегиями, что и легитимное приложение. Люди засовывают эти токены в local storage, делая их легкой добычей.

Как только злоумышленник выполняет свой скрипт, JWT, хранящийся в local storage, легко извлечь. С помощью украденного токена они получают немедленный, неограниченный доступ к учетной записи жертвы, обходя все механизмы аутентификации. Это не просто незначительное нарушение; это полный захват учетной записи, предоставляющий злоумышленнику ключи к вашему цифровому королевству.

Важно отметить, что эта катастрофа безопасности не является недостатком самого стандарта JWT. Проблема заключается исключительно в широко распространенной, опасной ошибке реализации. Разработчики, ищущие легкий путь к управлению сессиями, превращают мощный криптографический примитив в уязвимость, предоставляя злоумышленникам средства для компрометации учетных записей пользователей через предсказуемые векторы.

«Скучное» решение, которое действительно работает

Решение этой самонанесенной раны JWT обманчиво просто, даже «скучно», как метко описывают его эксперты Better Stack в «The Boring Auth Method That Actually Works». Вместо сложных, самодостаточных токенов мы возвращаемся к непрозрачным сессионным токенам: случайно сгенерированным, бессмысленным строкам. Эти токены действуют лишь как указатели, напрямую отображаясь на богатую, изменяемую запись сессии, безопасно хранящуюся в вашей серверной базе данных, восстанавливая контроль, который JWT обещали устранить.

Этот традиционный подход мгновенно решает критические проблемы, связанные с использованием JWT для управления сессиями. Если пользователь выходит из системы, получает бан или его токен украден, сервер может немедленно аннулировать соответствующую запись сессии, делая украденный токен бесполезным. Важно отметить, что сам токен не раскрывает никаких пользовательских данных или утверждений авторизации; это просто случайный идентификатор, что резко контрастирует с информационно-насыщенными JWT, подробно описанными в RFC 7519 - JSON Web Token (JWT). Вы восстанавливаете мгновенную отмену, возможность, которой JWT по своей сути лишены без неуклюжих обходных путей.

Кроме того, правильный механизм хранения этих непрозрачных токенов устраняет вектор кражи на основе XSS, который мы обсуждали. Мы выступаем за безопасные HttpOnly cookies. Эти cookies автоматически отправляются с каждым запросом, но остаются недоступными для клиентского JavaScript, что предотвращает их перехват злоумышленниками через уязвимости Cross-Site Scripting. Этот метод обеспечивает надежную защиту на стороне клиента, возвращая Вам истинный контроль на стороне сервера, что является гораздо лучшим решением, чем доверие клиентскому local storage.

Создание нерушимой современной аутентификации

JWT не злодеи; они просто неправильно используются. Их истинная сила заключается в конкретных, ограниченных сценариях, а не в качестве основного средства управления сессиями. Используйте их для кратковременных токенов доступа к API, предоставляя временные, гранулированные разрешения без постоянных запросов к базе данных. Они превосходны в межсервисном взаимодействии, где бэкенд-системы обмениваются доверенной, самодостаточной информацией, наконец, используя их заявленный безстатусный дизайн без компромиссов.

Enjoying this? Get one like it in your inbox each morning.

one email a day · unsubscribe in two clicks · no third-party tracking

Современная аутентификация требует более умного подхода: гибридной модели. Выдайте безопасный, непрозрачный refresh token, непредсказуемую строку, и надежно поместите его в HttpOnly cookie, сделав его недоступным для вредоносных клиентских скриптов. Этот надежный refresh token затем выдает ультра-кратковременные JWT access tokens непосредственно в память приложения. Эти эфемерные JWT обеспечивают немедленную авторизацию для запросов, быстро истекая до того, как они смогут стать значительной уязвимостью, бесшовно обновляясь в фоновом режиме без вмешательства пользователя.

Ландшафт аутентификации продолжает свою неустанную эволюцию. Мы полностью отказываемся от паролей, принимая Passkeys и другие беспарольные методы, которые предлагают превосходную безопасность и пользовательский опыт. Адаптивная аутентификация, которая оценивает факторы риска в реальном времени, еще больше укрепляет защиту, делая будущее безопасности как более надежным, так и менее навязчивым для легитимных пользователей.

Часто задаваемые вопросы

Почему хранение JWT в local storage считается небезопасным?

Хранение JWT в local storage делает их уязвимыми для атак Cross-Site Scripting (XSS). Любой вредоносный JavaScript, внедренный на веб-сайт, может получить доступ к токену и украсть его, позволяя злоумышленнику полностью выдать себя за пользователя.

Что такое непрозрачный сессионный токен?

Непрозрачный сессионный токен — это случайный, бессмысленный идентификатор, хранящийся на клиенте (в идеале в HttpOnly cookie). Он ссылается на подробную запись сессии, хранящуюся в базе данных на стороне сервера, что позволяет мгновенно отменять и контролировать сессию.

Если JWT рискованны для сессий, каковы их правильные сценарии использования?

JWT отлично подходят для кратковременных, безстатусных сценариев, таких как защита API, авторизация связи между серверами в microservices или использование в качестве временных токенов доступа в более сложной гибридной системе аутентификации.

Можно ли действительно отозвать JWT до истечения его срока действия?

Не напрямую. Поскольку JWT безстатусны, сервер не хранит о них никакой информации после их выдачи. Единственный способ 'отозвать' его — это поддерживать серверный черный список, что вновь вводит состояние и сводит на нет основное преимущество использования JWT.

Found this useful? Share it.

AI Reputation Report

What AI knows about you.

ChatGPT, Perplexity, Gemini, Claude & Grok are already answering questions in your category. Type your site, see who they name — you, or your competitor. Free preview.

Check my sitefree preview

One short daily email of tools worth shipping. No drip funnel.

one email a day · unsubscribe in two clicks · no third-party tracking

🚀Узнать больше

Будьте в курсе трендов ИИ

Откройте лучшие инструменты ИИ, агенты и MCP-серверы от Stork.AI.

P.S. Сделали что-то полезное? Опубликуйте на Stork