Понимание JWT


Что такое JWT

JWT расшифровывается как JSON веб-маркеры. Это промышленный стандарт для передачи утверждений пользователя между клиентом и сервисом и между сервисами. Утверждения в JWT кодируются как объект JSON. Утверждение — это просто информация о пользователе, которая необходима серверу для проверки его личности и назначения соответствующих ролей.
JWT состоит из 3 частей

  • Заголовок
  • Полезная нагрузка
  • Подпись

Заголовок

Заголовок в JWT указывает на то, что это токен JWT, и определяет, какой алгоритм используется для генерации подписи.

{
  "alg": "HS256",
  "typ": "JWT"
}
Вход в полноэкранный режим Выход из полноэкранного режима

Полезная нагрузка

Полезная нагрузка содержит набор утверждений.

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
Вход в полноэкранный режим Выход из полноэкранного режима

Подпись

Подпись подтверждает подлинность маркера JWT. Подпись генерируется путем кодирования заголовка и полезной нагрузки вместе с секретом и объединения их вместе с разделителем точек.

HMAC_SHA256(
  secret,
  base64urlEncoding(header) + '.' +
  base64urlEncoding(payload)
)
Вход в полноэкранный режим Выход из полноэкранного режима

Эти три части кодируются и объединяются с помощью разделителя точек, чтобы сформировать токен JWT. Вот как выглядит образец JWT. (Красная часть обозначает заголовок, фиолетовая — полезную нагрузку, а синяя — подпись).

Зачем нужен JWT

Большинство приложений, которые мы используем, требуют входа в систему для получения доступа к некоторым дополнительным функциям. Обычно пользователь входит в систему, указывая свои учетные данные. Не очень хорошо использовать учетные данные, предоставленные пользователем, на протяжении всей его сессии.

Традиционно состояние пользователя и связанная с ним информация хранились на серверах. Они хранили эту информацию во внешнем хранилище, таком как Redis. Для получения данных пользователя из внешнего хранилища использовался файл cookie сессии.

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

Каковы плюсы и минусы использования JWT

Плюсы использования JWT

  • Поскольку токены содержат всю необходимую информацию, вам не нужно постоянно запрашивать БД
  • Серверу не нужно содержать внешнее хранилище для обработки состояния пользователей
  • Легко подтвердить подлинность в нескольких сервисах. У вас есть только один сервер, который выполняет авторизацию, а затем передает токен нескольким сервисам, которым требуется информация.

Минусы использования JWT

  • Если кто-то получит JWT, он может выдать себя за другого человека.
  • В токене JWT нельзя хранить много информации, так как это приведет к перегрузке данных. Рекомендуется хранить только основную информацию и получать другие данные путем запроса к БД по мере необходимости. Также для веб-приложений вы будете использовать JWT с cookies, которые могут хранить только определенные байты данных.

Защита JWT

Как упоминалось выше, если какой-либо злоумышленник получит доступ к вашему JWT, он сможет выдать себя за вашего пользователя. Поэтому вы должны быть осторожны при использовании JWT.

  • Никогда не храните JWT в локальном хранилище браузера. Любой вредоносный код javascript может легко получить к нему доступ.
  • Если возможно, создавайте JWT с коротким сроком действия. Но будьте осторожны, если вы сделаете JWT недействительным, ваши пользователи будут считаться вышедшими из системы. Вы же не хотите, чтобы ваши пользователи постоянно входили в систему.
  • Убедитесь, что вы используете SSL, так как он шифрует ваш сетевой трафик, что предотвратит кражу JWT любым человеком, имеющим доступ к вашей сети.

Что делать, если вы потеряли JWT

Взлом JWT — это то же самое, что и взлом пароля. Вы должны следовать той же процедуре, что и при взломе пароля. Это может включать

  • Блокирование учетной записи пользователя
  • Попросить пользователя немедленно сменить пароль
  • отзыв всех разрешений у пользователя

Как узнать, что вы потеряли JWT

Быстрое реагирование на скомпрометированный JWT может быть жизненно важным для предотвращения потери данных ваших клиентов. Чтобы узнать о потере JWT, можно предпринять следующие действия.

  • Отслеживайте местоположение клиента. Скорее всего, если кто-то нарушил вашу безопасность, он попытается использовать токен из другого места, а не из того, которое использовал ваш клиент. Это может быть хорошим индикатором, чтобы понять, что ваш JWT украден. Но маскировка местоположения — простая задача.
  • Проанализируйте шаблон пользователя. Если злоумышленник украл ваш JWT, он постарается воспользоваться им как можно скорее. Поэтому вам придется проверить поведение JWT. Например, если пользователь, который обычно посылает 10 запросов в минуту, начинает посылать 50 запросов, то это признак потери JWT.

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

Оцените статью
Procodings.ru
Добавить комментарий