Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: JWT, signature, HMAC, cryptography, authentication

Почему JWT нельзя подделать без секретного ключа?

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

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

JWT (JSON Web Token) состоит из трёх частей: заголовка, полезной нагрузки и подписи. Подпись создаётся с использованием секретного ключа и криптографического алгоритма (например, HMAC SHA256) на основе первых двух частей. Без секретного ключа невозможно корректно вычислить подпись для изменённых данных. Сервер проверяет подпись при каждом запросе, и если токен был подделан, подписи не совпадут, что приведёт к отклонению запроса.

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

JWT (JSON Web Token) — это стандартный способ безопасной передачи информации между сторонами в виде JSON-объекта. Токен состоит из трёх частей, разделённых точками: заголовка (header), полезной нагрузки (payload) и подписи (signature). Именно подпись обеспечивает защиту от подделки.

Как работает подпись JWT

Подпись создаётся путём хеширования объединённых данных заголовка и полезной нагрузки с использованием секретного ключа и выбранного алгоритма (например, HMAC SHA256). Формула выглядит так: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret). Результат кодируется в Base64URL и добавляется к токену.

Проверка целостности

Когда сервер получает JWT, он:

  1. Разделяет токен на три части.
  2. Берёт заголовок и полезную нагрузку (первые две части).
  3. Заново вычисляет подпись, используя тот же алгоритм и свой секретный ключ.
  4. Сравнивает вычисленную подпись с подписью из токена.

Если злоумышленник попытается изменить данные в заголовке или полезной нагрузке (например, повысить свои права), он не сможет корректно пересчитать подпись без знания секретного ключа. Сервер обнаружит несоответствие и отклонит токен.

Пример создания и проверки JWT

// Пример на Node.js с использованием библиотеки jsonwebtoken
const jwt = require('jsonwebtoken');

// Секретный ключ, известный только серверу
const SECRET_KEY = 'my-super-secret-key';

// Создание токена
const payload = { userId: 123, role: 'user' };
const token = jwt.sign(payload, SECRET_KEY, { algorithm: 'HS256' });
console.log('Созданный JWT:', token);

// Проверка токена
jwt.verify(token, SECRET_KEY, (err, decoded) => {
  if (err) {
    console.log('Токен недействителен:', err.message);
  } else {
    console.log('Данные токена:', decoded); // { userId: 123, role: 'user' }
  }
});

// Попытка подделки: изменение payload без ключа
const fakeToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIn0.INVALID_SIGNATURE';
// Проверка покажет ошибку, так как подпись не совпадает

Где применяется и какие есть нюансы

JWT широко используется для аутентификации в REST API, одностраничных приложениях (SPA) и микросервисных архитектурах. Важно помнить:

  • Секретный ключ должен храниться в безопасности на сервере и никогда не передаваться клиенту.
  • Для асимметричного шифрования можно использовать пару публичный/приватный ключ (алгоритмы RS256, ES256).
  • JWT обеспечивает целостность, но не конфиденциальность — данные в токене кодируются, но не шифруются (если не используется JWE).
  • Токены должны передаваться по HTTPS для защиты от перехвата.

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#JWT

#signature

#HMAC

#cryptography

#authentication

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