Tools Blog

Что такое JWT? Понимание веб-токенов JSON и аутентификации без сохранения состояния

JSON Web Tokens Architecture

Когда вы входите в современное одностраничное приложение (например, React или Vue) или мобильное приложение, серверу нужен способ запомнить, кто вы. Традиционно это делалось путем сохранения «идентификатора сеанса» в огромной базе данных на сервере и размещения файла cookie в вашем браузере. Каждый раз, когда вы нажимали кнопку, серверу приходилось искать этот идентификатор в своей базе данных. Это называется аутентификацией с отслеживанием состояния.

Однако в эпоху микросервисов и облачного масштабирования базы данных стали узким местом. Чтобы решить эту проблему, разработчики внедрили Аутентификацию без сохранения состояния с помощью JSON Web Tokens (JWT). Благодаря JWT серверу не нужно запоминать, кто вы — ваш браузер точно сообщает серверу, кто вы, и использует криптографию для подтверждения этого.

🎥 Обучающее видео: как работает криптография JWT (Заполнитель для встроенного концептуального руководства YouTube)

Анатомия JWT

Если вы проверите сетевой трафик после входа в современное приложение, вы, скорее всего, увидите заголовок «Authorization: Bearer», за которым следует длинная случайная строка символов, разделенных двумя точками. Это JWT.

JWT состоит ровно из трех частей: Header.Payload.Signature.

1. Заголовок

Первая часть представляет собой объект JSON в кодировке Base64URL, который просто описывает токен. Обычно он содержит два свойства: тип токена (JWT) и используемый алгоритм подписи (например, HMAC SHA256 или RSA).

2. Полезная нагрузка (претензии)

Средняя часть также представляет собой объект JSON в кодировке Base64URL. Здесь живут фактические данные. Эти фрагменты данных называются «претензиями». Например, он может содержать ваш идентификатор пользователя, вашу роль (например, «Администратор») и отметку времени истечения срока действия. Поскольку эта полезная нагрузка прикрепляется к каждому запросу, сервер мгновенно узнает, кто вы, не запрашивая базу данных.

КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ: Полезная нагрузка просто закодирована, а не зашифрована. Любой, кто перехватит JWT, сможет легко его декодировать и прочитать полезную нагрузку. Никогда не храните пароли, номера социального страхования или конфиденциальные данные внутри полезных данных JWT.

3. Подпись

Если кто-то может читать и редактировать полезную нагрузку, что мешает злоумышленнику изменить свою роль с «Пользователя» на «Администратора»? Ответ - Подпись.

Чтобы создать подпись, сервер берет заголовок, полезную нагрузку и высокозащищенный секретный ключ (известный только серверу) и пропускает их через криптографический алгоритм (например, SHA256). Полученный хэш становится подписью.

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

Проверяйте токены безопасно

Вам нужно прочитать полезную нагрузку JWT для отладки приложения? Используйте наш автономный декодер JWT, чтобы мгновенно проверять заявки, не отправляя конфиденциальный токен на удаленный сервер.

Открыть JWT-декодер

Почему микросервисы любят JWT

Представьте себе такую ​​компанию, как Netflix. У них есть сервер аутентификации, сервер потокового видео и сервер биллинга. Если бы они использовали традиционные сеансы, каждому серверу пришлось бы постоянно связываться с центральной базой данных, чтобы проверить, вошел ли пользователь в систему.

При использовании JWT сервер аутентификации подписывает токен с помощью закрытого ключа. Затем пользователь передает этот токен непосредственно на видеосервер. Поскольку Видеосервер имеет открытый ключ, он может самостоятельно проверить подпись. Видеосервер точно знает, кто пользователь, даже не обращаясь к серверу аутентификации или базе данных. Это позволяет инфраструктуре масштабироваться бесконечно без узких мест.

Темная сторона: аннулирование токена

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

Если хакер крадет JWT пользователя, он имеет полный доступ до тех пор, пока не истечет время истечения срока действия токена. Чтобы снизить этот риск, инженеры по безопасности используют систему двух токенов:

  • Токены доступа. JWT с коротким сроком действия (например, 15 минут), используемые для запросов API.
  • Токены обновления. Долговечные токены с отслеживанием состояния хранятся в безопасном месте и используются исключительно для запроса новых токенов доступа. Если учетная запись скомпрометирована, сервер отзывает токен обновления, и токен доступа хакера естественным образом умрет через 15 минут.

Часто задаваемые вопросы (FAQ)

Где мне следует хранить JWT во внешнем интерфейсе?

Хранение JWT в localStorage делает их уязвимыми для атак межсайтового скриптинга (XSS). Наиболее безопасное место для хранения JWT в веб-браузере — внутри файла cookie HttpOnly, который предотвращает доступ JavaScript к нему.

Что произойдет, если секретный ключ моего сервера станет известен?

Катастрофа. Если хакер получит ваш секретный ключ HMAC или закрытый ключ RSA, он сможет сгенерировать действительные JWT с любой полезной нагрузкой, которую пожелает. Они могут создавать токены, предоставляющие себе привилегии «Суперадминистратора», и ваш сервер примет их как действительные. Вы должны немедленно сменить ключи.

Являются ли JWT быстрее, чем файлы cookie сеанса?

Не обязательно. Размер файла JWT значительно больше, чем 32-значный идентификатор сеанса, а это означает, что они потребляют больше пропускной способности сети при каждом запросе. Их преимущество в скорости полностью достигается за счет обхода поиска в базе данных на серверной стороне.