Эта статья призвана объяснить JWT на простом английском языке и ключевые концепции, связанные с ним, например. Что такое JWT, как он работает, пример использования, что такое JWT.io и пять ключевых выводов. Итак, начнем!

Что такое JWT?

JWT (произносится как Jot или Jawt) является сокращением от JSON (обозначение объекта javascript) Web Token и в основном используется для авторизации. Авторизация гарантирует, что пользователь, который делает запрос к веб-серверу, является тем же, кто вошел в систему ранее. Аутентификация отличается от авторизации, которая проверяет, являются ли учетные данные, например. электронная почта, пароль, отправленные на веб-сервер пользователем, верны или нет. Итак, цель JWT — авторизация, а не аутентификация. В общем случае авторизация осуществляется через поддержание сеанса, при этом идентификатор сеанса отправляется в браузер в виде файла cookie, а также сохраняется в памяти или базе данных сервера. Таким образом, если клиент делает последующие запросы к серверу с этим конкретным идентификатором, авторизация предоставляется.

Строка JWT представляет собой URL-адрес в кодировке base64 и представляет собой конкатенированную версию заголовка и полезной нагрузки в формате JSON с точкой, а иногда к ним добавляется подпись в конце. Фреймворки и стандарты, такие как OAuth 2.0 и OpenID, используют JWT.

Как работает JWT?

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

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

Каков пример использования JWT?

JWT используются с веб-сервисами RESTFUL, которые обычно следуют модели без сохранения состояния, из-за которой состояния запросов не могут храниться на сервере. JWT позволяют пользователю предоставлять информацию о состоянии с каждым запросом на сервер. Кроме того, JWT помогают защитить веб-службы, предоставляющие доступ аутентифицированным и авторизованным клиентам.

Кроме того, для веб-сайта производственного масштаба вместо хранения сеансов для каждого пользователя на стороне сервера JWT является лучшим выбором. Поскольку из-за увеличения использования памяти сервера это приведет к замедлению работы пользователей. Кроме того, если имеется несколько серверов, что неявно для большого приложения, то каждый из серверов должен будет сохранять детали сеанса отдельно. Накладные расходы на управление сеансом будут сняты с сервера, а сеансы без сохранения состояния могут быть достигнуты с помощью JWT. Более того, традиционный способ хранения сеансов может быть подвержен подделке межсайтовых запросов, когда хакер заставляет пользователя выполнять действия, которые он не намерен совершать, например. оплата, сброс пароля. Хотя с современными фреймворками, такими как Django, Ruby on Rails, риск очень низок, основная проблема заключается в необходимости хранить идентификатор сеанса в базе данных или памяти на сервере. Поскольку большинство облачных приложений масштабируются горизонтально (добавляя больше машин к существующей инфраструктуре), это может стать огромным узким местом в производстве. Принимая во внимание, что в случае JWT серверу просто нужно проверить токен, отправленный клиентом, нет необходимости искать идентификатор сеанса в базе данных где-то еще в инфраструктуре. Единственное предостережение в том, что токены все еще могут быть украдены.

Что такое JWT.io?

JWT.io — это веб-сайт, который декодирует JWT и отображает в качестве вывода три его части: заголовок, полезную нагрузку и подпись. Заголовок и полезная нагрузка могут быть декодированы без необходимости ввода пароля. Сервер может проверить, действителен ли токен, только проверив подпись. Снимок примера JWT и декодированной структуры показан на рисунке 1. На рисунке видно, что закодированный JWT представляет собой конкатенированную версию трех строк, разделенных точками. Первый — это заголовок (красный цвет), второй — полезная нагрузка (фиолетовый цвет), а третий — подпись (синий цвет). Вы можете перейти на веб-сайт и вставить свои JWT и увидеть результат или даже поиграть с секретом справа внизу.

5 основных выводов

  • JWT используется для авторизации, а не для аутентификации.
  • Токены JWT обрабатываются на клиенте, тогда как сеансы поддерживаются на сервере,
  • Один JWT может использоваться для нескольких серверов, что невозможно при подходе, основанном на сеансах.
  • JWT помогает защитить веб-службы, сократить использование памяти сервера, что повышает удобство работы пользователей (например, скорость).
  • JWT помогает избежать подделки межсайтовых запросов, что возможно при использовании подхода на основе сеанса.