Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: JWT, security, token, sensitive data, authentication

Почему не рекомендуется хранить чувствительные данные в JWT?

Этот вопрос проверяет понимание уязвимостей безопасности при использовании JSON Web Tokens и зачем нужно избегать хранения конфиденциальной информации в токенах.

Короткий ответ

JWT (JSON Web Tokens) часто передаются в заголовках HTTP и могут быть перехвачены или украдены. Токены обычно хранятся в localStorage браузера, что делает их уязвимыми для XSS-атак. Хотя JWT подписан, его содержимое легко декодируется (payload в Base64), поэтому любой, кто получит токен, может прочитать данные. Чувствительные данные (пароли, номера карт) должны храниться только на сервере в защищённой базе данных.

Длинный ответ

JSON Web Tokens (JWT) стали популярным стандартом для аутентификации и передачи информации между сторонами в виде JSON-объекта. Токен состоит из трёх частей: заголовка, полезной нагрузки (payload) и подписи, разделённых точками и закодированных в Base64URL.

Почему JWT уязвимы для раскрытия данных

Основная проблема заключается в том, что payload JWT не шифруется по умолчанию — он только кодируется в Base64. Любой, кто получит токен, может легко декодировать его и прочитать содержимое. Например, токен eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c можно декодировать онлайн-инструментами, получив данные пользователя.

Где хранятся JWT и риски

  • LocalStorage/SessionStorage: Уязвимы к XSS-атакам, где злонамеренный скрипт может украсть токен.
  • Cookies: Более безопасны с флагом HttpOnly, но всё равно передаются с каждым запросом.
  • Передача по сети: Токены могут быть перехвачены при использовании незашифрованного HTTP.

Пример уязвимого подхода

// НЕПРАВИЛЬНО — хранение чувствительных данных в JWT
const payload = {
  userId: 123,
  email: "user@example.com",
  creditCard: "4111-1111-1111-1111", // Опасность!
  role: "admin",
  exp: Math.floor(Date.now() / 1000) + 3600
};

// После подписи токен будет передан клиенту
// Любой, кто получит токен, увидит номер карты

Правильная практика

Вместо хранения чувствительных данных в JWT следует:

  1. Хранить только идентификатор пользователя (userId) или session ID в токене.
  2. Чувствительные данные хранить в защищённой базе данных на сервере.
  3. При необходимости передавать конфиденциальную информацию использовать шифрование (JWE) или защищённые каналы (HTTPS).
  4. Использовать короткое время жизни токенов и механизм refresh tokens.

Пример безопасного подхода

// ПРАВИЛЬНО — минимальные данные в JWT
const safePayload = {
  sub: "user_123", // только идентификатор
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + 900 // 15 минут
};

// На сервере по ID пользователя получаем данные из БД
async function getUserData(userId) {
  return db.query(
    "SELECT email, preferences FROM users WHERE id = $1", 
    [userId]
  );
}

Вывод: JWT предназначены для передачи верифицируемых утверждений, а не для хранения секретов. Храните в токенах только минимальную информацию, необходимую для аутентификации, а все чувствительные данные — в защищённом хранилище на сервере. Это особенно важно в production-средах с требованиями compliance (PCI DSS, GDPR).

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#JWT

#security

#token

#sensitive data

#authentication

Подпишись на Python Developer в телеграм