> Передается ли 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 всегда безопасен.
> Похожие задачи по backend
Какой уровень изоляции транзакций по умолчанию в PostgreSQL
Зачем используются интерфейсы в Go
Как сообщить клиенту о недоступности внешнего источника данных
Как правильно работать с map и структурой в Go, чтобы избежать паники
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью