> Передается ли JWT в зашифрованном или открытом виде (Go)

Уровень: middle · Роль: backend · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

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

JWT передаётся в открытом виде, если не используется дополнительное шифрование (JWE). Сам по себе JWT - это base64url-кодированная строка, которую можно декодировать без ключа. Подпись (JWS) обеспечивает целостность и аутентичность, но не конфиденциальность. Поэтому в JWT нельзя класть чувствительные данные (пароли, номера карт) без шифрования на уровне транспорта (TLS) или использования JWE.

Подробное объяснение

JWT состоит из трёх частей: header, payload и signature. Каждая часть кодируется base64url, что не является шифрованием - это просто представление данных. Любой, кто перехватит токен, может декодировать payload и прочитать его содержимое.

Подпись (в случае JWS) вычисляется на основе header и payload с использованием секрета или приватного ключа. Она позволяет проверить, что токен не был изменён, и подтвердить его issuer. Однако подпись не скрывает содержимое.

Существует стандарт JWE (JSON Web Encryption), который шифрует payload. В этом случае токен передаётся в зашифрованном виде, и прочитать его содержимое может только получатель с соответствующим ключом. Но на практике JWE используется реже, чем JWS, из-за сложности и производительности.

Также важно помнить про TLS: даже если JWT не зашифрован сам по себе, передача по HTTPS защищает его от перехвата на транспортном уровне. Однако после получения токена клиентом он остаётся доступным в открытом виде в памяти браузера или приложения.

На практике

В большинстве реальных систем используется JWS (подписанный JWT) в сочетании с HTTPS. Это стандартный подход для access token и refresh token. В payload обычно кладут идентификатор пользователя, роли, срок действия - данные, которые не являются секретными, но требуют доверия к их подлинности.

Если необходимо передать конфиденциальные данные внутри токена, применяют JWE или комбинацию JWE + JWS (сначала подписывают, потом шифруют). Однако чаще чувствительные данные вообще не кладут в JWT, а хранят на сервере и передают только ссылку на них.

Пример кода

GO
// Декодирование payload без проверки подписи (только для демонстрации)
func decodeJWTPayload(tokenString string) ([]byte, error) {
parts := strings.Split(tokenString, ".")
if len(parts) != 3 {
return nil, errors.New("invalid token")
}
payload, err := base64.RawURLEncoding.DecodeString(parts[1])
if err != nil {
return nil, err
}
return payload, nil
}

Как отвечать на собеседовании

Начни с прямого ответа: JWT передаётся в открытом виде, если не используется JWE. Затем объясни разницу между кодированием и шифрованием, упомяни подпись как механизм целостности, а не конфиденциальности. Добавь про TLS как обязательный уровень защиты. Если спросят про JWE - кратко опиши, когда он нужен. Подчеркни, что в payload не стоит класть секреты.

Что проверяет интервьюер

  • Понимание базовой структуры JWT и отличия кодирования от шифрования.
  • Знание, что подпись не защищает содержимое.
  • Осознание роли TLS в защите токенов.
  • Умение рассуждать о безопасности на практике: что можно класть в payload, а что нет.
  • Знание JWE как альтернативы для конфиденциальных данных.

Типичные ошибки

  • Утверждение, что JWT зашифрован по умолчанию.
  • Смешение подписи и шифрования.
  • Игнорирование TLS при обсуждении безопасности.
  • Предложение класть пароли или другие секреты в payload.
  • Незнание JWE или утверждение, что JWT всегда безопасен.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью