← Назад к вопросам

Можно ли перехватить токен JWT?

2.2 Middle🔥 141 комментариев
#Безопасность#Сетевые протоколы и API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Можно ли перехватить токен JWT?

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

Основные векторы атаки для перехвата JWT

  1. Перехват при передаче по сети
    Если JWT передаётся по незашифрованному каналу (например, по HTTP вместо HTTPS), злоумышленник может перехватить его с помощью атак типа Man-in-the-Middle (MITM). Это одна из самых распространённых угроз.

    # Пример JWT (вымышленный, для иллюстрации)
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    
  2. Кража из хранилища на клиенте
    JWT часто хранится на клиентской стороне:

    • LocalStorage/SessionStorage: уязвимы к XSS-атакам (Cross-Site Scripting), если приложение не защищено должным образом.
    • Cookies: при неправильной настройке (отсутствие флагов HttpOnly, Secure, SameSite) могут быть доступны через JavaScript или переданы по незащищённым каналам.
    // Пример уязвимого хранения JWT в LocalStorage
    localStorage.setItem('jwt', token); // Риск XSS!
    
  3. Утечки через логирование или мониторинг
    Случайное попадание JWT в логи приложения, системные журналы или инструменты мониторинга (например, в URL-параметрах, которые логируются веб-сервером).

  4. Атаки на браузерные расширения или сторонний код
    Внедрённый код (например, через compromised npm-пакеты) может читать токены из памяти или DOM.

  5. Фишинг или социальная инженерия
    Пользователя могут обманом заставить передать токен (например, через поддельную форму или API-запрос).

Как минимизировать риски перехвата JWT?

  • Всегда использовать HTTPS (TLS/SSL) для шифрования трафика между клиентом и сервером.
  • Хранить JWT в защищённых куках с флагами:
    • HttpOnly (доступ только на стороне сервера, защита от XSS).
    • Secure (передача только по HTTPS).
    • SameSite=Strict (ограничение межсайтовых запросов).
  • Реализовать короткие сроки жизни токенов и использовать механизм refresh tokens для обновления access tokens, храня refresh tokens максимально защищённо (например, в куках с теми же флагами).
  • Валидировать JWT на стороне сервера:
    • Проверять подпись с использованием надёжного алгоритма (например, HS256, RS256).
    • Проверять срок действия (exp), аудиторию (aud), издателя (iss) и другие стандартные утверждения (claims).
  • Регулярно проводить аудит безопасности кода и инфраструктуры, использовать инструменты для анализа зависимостей.
  • Внедрять защиту от CSRF (если токен передаётся в куках) и XSS (санитизация ввода, CSP — Content Security Policy).
// Пример валидации JWT в Go с использованием библиотеки golang-jwt/jwt
import "github.com/golang-jwt/jwt/v5"

func validateJWT(tokenString string) (*jwt.Token, error) {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        // Проверка алгоритма подписи
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return []byte("your-secret-key"), nil
    })
    
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        // Дополнительная проверка claims (например, exp)
        if exp, ok := claims["exp"].(float64); ok {
            if time.Unix(int64(exp), 0).Before(time.Now()) {
                return nil, fmt.Errorf("token expired")
            }
        }
    }
    return token, err
}

Итог

JWT сам по себе не защищён от перехвата — его безопасность зависит от реализации. Ключевые моменты:

  • Передача только по HTTPS.
  • Безопасное хранение (предпочтительно в куках с HttpOnly и Secure).
  • Короткое время жизни access tokens.
  • Серверная валидация подписи и claims.

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