Как можно перехватить JWT-токен и какие существуют основные векторы атак?

Ответ

Да, JWT-токен можно перехватить, если он передаётся или хранится небезопасно. Это одна из ключевых проблем безопасности в системах аутентификации.

Основные векторы атак:

  1. Перехват в сети (Man-in-the-Middle): Если использовать незащищённое соединение HTTP вместо HTTPS, злоумышленник может прослушать трафик и украсть токен.
  2. XSS-атаки (Cross-Site Scripting): Если токен хранится в localStorage или sessionStorage, внедрённый на страницу вредоносный JavaScript-код может его прочитать и отправить на сервер злоумышленника. То же касается cookie без флага HttpOnly.
  3. CSRF-атаки (Cross-Site Request Forgery): Если токен хранится в cookie без надлежащей защиты (например, без атрибута SameSite), злоумышленник может заставить браузер пользователя отправить запрос на ваш сайт, и браузер автоматически прикрепит cookie с токеном.
  4. Утечка секретного ключа: Если используется симметричный алгоритм (например, HS256), и секретный ключ попадает к злоумышленнику, он сможет подписывать любые токены от имени вашего сервера.
  5. Небезопасное хранение на клиенте: В мобильных приложениях или десктоп-клиентах токен может быть сохранён в незащищённое хранилище, откуда его могут извлечь другие приложения.

Как защититься:

  • Используйте HTTPS: Всегда и везде. Это базовое правило для шифрования канала передачи.
  • Безопасное хранение на клиенте: Для веб-приложений лучшей практикой является хранение токена в HttpOnly, Secure cookie с атрибутом SameSite=Strict или Lax. Это защищает от XSS (токен недоступен из JavaScript) и CSRF.
  • Короткое время жизни токена (TTL): Устанавливайте короткий срок действия для access-токенов (например, 5-15 минут) и используйте refresh-токены для получения новых. Это минимизирует ущерб в случае утечки.
  • Надёжный секретный ключ: Используйте длинные, сложные и случайно сгенерированные ключи для подписи токенов. Никогда не храните их в коде.