Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: JWT, JSON Web Token, signature, HMAC, RSA, base64url

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

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

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

Подпись в JWT — это третья часть токена, которая создаётся путём хеширования первых двух частей (заголовка и полезной нагрузки) с использованием секретного ключа или приватного ключа. Она служит для проверки того, что содержимое токена не было изменено после его выдачи. Если кто-то попытается изменить данные в заголовке или полезной нагрузке, подпись станет невалидной, и сервер отклонит такой токен. Это основной механизм безопасности JWT, защищающий от подделки.

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

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

Как формируется подпись

JWT состоит из трёх частей, разделённых точками: Header.Payload.Signature. Подпись создаётся на основе первых двух частей.

  1. Кодирование: Заголовок (Header) и полезная нагрузка (Payload) кодируются в формат Base64Url.
  2. Конкатенация: Эти две закодированные строки соединяются точкой: encodedHeader + "." + encodedPayload.
  3. Подписание: К этой объединённой строке применяется криптографический алгоритм (например, HMAC SHA256 или RSA SHA256) вместе с секретным ключом (для симметричных алгоритмов) или приватным ключом (для асимметричных). Результат также кодируется в Base64Url, образуя третью часть токена.

Алгоритмы подписи

В заголовке JWT указывается алгоритм (alg), использованный для подписи. Основные типы:

  • HMAC с SHA-256 (HS256): Симметричный алгоритм. Один и тот же секретный ключ используется для создания и проверки подписи. Прост в использовании, но требует безопасного обмена секретом между сторонами.
  • RSA с SHA-256 (RS256): Асимметричный алгоритм. Подпись создаётся с помощью приватного ключа издателя, а проверяется с помощью соответствующего публичного ключа. Это более безопасно для распределённых систем, так как публичный ключ можно свободно распространять.

Пример кода создания и проверки подписи (Node.js)

// Использование библиотеки jsonwebtoken
const jwt = require('jsonwebtoken');

const secretKey = 'my-super-secret-key';
const payload = { userId: 12345, role: 'admin' };

// 1. СОЗДАНИЕ JWT С ПОДПИСЬЮ (HS256)
const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' });
console.log('Созданный токен:', token);
// Выглядит как: xxxxx.yyyyy.zzzzz

// 2. ПРОВЕРКА ПОДПИСИ И ДЕКОДИРОВАНИЕ
jwt.verify(token, secretKey, (err, decodedPayload) => {
    if (err) {
        // Подпись невалидна! Токен изменён или ключ неверный.
        console.error('Токен не прошел проверку:', err.message);
    } else {
        // Подпись верна. Данные можно доверять.
        console.log('Данные токена:', decodedPayload); // { userId: 12345, role: 'admin' }
    }
});

// 3. ПОДДЕЛКА ТОКЕНА (ПРИМЕР НЕУДАЧНОЙ ПОПЫТКИ)
// Если злоумышленник возьмёт токен и изменит payload вручную,
// не зная secretKey, он не сможет корректно пересчитать подпись.
// Сервер, проверяя новую подпись, сразу обнаружит несоответствие.

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

Подпись JWT является основой для аутентификации и авторизации в современных веб-приложениях и API (REST, GraphQL). После успешного входа пользователя сервер создаёт JWT с подписью и отправляет его клиенту. Клиент затем отправляет этот токен в заголовке Authorization: Bearer <token> при каждом последующем запросе. Сервер, получая токен, проверяет подпись. Если проверка проходит, сервер доверяет данным внутри токена (например, идентификатору пользователя) и предоставляет доступ к защищённым ресурсам. Это избавляет сервер от необходимости хранить сессию в памяти или базе данных.

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#JWT

#JSON Web Token

#signature

#HMAC

#RSA

#base64url

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