Понимание высокого уровня веб-токенов JSON (JWT) и идентификаторов сеансов.

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

Зачем нам нужна аутентификация?

HTTP - это протокол без сохранения состояния, что просто означает, что текущий запрос клиента не зависит от каких-либо предыдущих запросов, а серверу ничего не известно о каких-либо предыдущих запросах.

Например, если вы просто загружаете статические данные, например, переходите к www.facebook.com, серверам действительно не нужно знать, кто является клиентом, поскольку они возвращают страницу входа в систему, а не конфиденциальная информация в любой форме. С другой стороны, если вы хотите внести изменения в свой профиль Facebook, вам нужно будет доказать, что вы являетесь владельцем учетной записи, прежде чем серверы Facebook вернут вам информацию.

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

Аутентификация с помощью токенов сеанса

В модели токена сеанса после того, как пользователь входит в систему и авторизуется, сервер создает сеанс, уникальный для клиента. Сервер возвращает идентификатор сеанса клиенту, который затем сохраняет его в файле cookie в браузере.

При последующих HTTP-вызовах cookie будет автоматически включаться в заголовок HTTP-запроса, и серверы смогут узнать личность клиента. Хотя cookie хранится на стороне клиента, эта модель по-прежнему представляет собой сеансы на стороне сервера, поскольку проверка выполняется на сервере.

Тогда вы можете задаться вопросом - как сервер запоминает личность клиента, если протоколы HTTP не имеют состояния?

Сессия на стороне сервера: на самом деле не без состояния

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

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

Плюсы сессионных токенов

  • Срок действия идентификаторов сеансов истек
  • Идентификаторы сеанса могут быть отозваны
  • Меньший размер cookie (по сути, зашифрованный идентификатор сеанса)

Минусы токенов сеанса

  • Масштабируемость - это проблема обеспечения журнала сеанса на всех серверах.

На рисунке выше мы предположили упрощенно-монолитную архитектуру, в которой клиент взаимодействует с одним сервером. Однако в действительности мы можем ожидать полилитическую архитектуру, похожую на следующую:

В некотором смысле эта полилитическая архитектура помогает в определенной степени компенсировать проблемы масштабируемости. Один из способов обеспечить одинаковый журнал сеансов на всех серверах - распределить запросы с помощью балансировщика нагрузки и использовать кеш Redis, общий для всех серверов. Хотя это жизнеспособный обходной путь для обеспечения синхронности журнала сеанса, теперь существует единственная точка отказа (кеш Redis).

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

JSON Web-Token (JWT) Аутентификация

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

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

Плюсы JWT

  • Устраняет необходимость в кэше / базе данных для хранения идентификаторов сеансов

Минусы JWT

  • Невозможность отозвать токены с сервера, поскольку они могут только определить, действителен ли токен или нет

Еще раз, я лишь осветил плюсы и минусы JWT, но вы можете проверить эту подробную статью о плюсах и минусах JWT.

Заключительные примечания

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

Если вы хотите посмотреть визуальные эффекты, я настоятельно рекомендую это видео на YouTube, которое помогло мне быстро понять концепцию.