Одним из основных преимуществ и мотивов использования JWT является то, что оно позволяет вашему серверному приложению выдвигать всю информацию о состоянии сеанса за пределы приложения. То есть в теоретическом пределе реализация JWT на самом деле не имеет состояния .
Чтобы напрямую ответить на ваш вопрос, мы можем сравнить рабочие процессы для того, что происходит, когда имя пользователя / пароль отправляется в каждом запросе, с отправкой JWT.
Во-первых, JWT содержит секцию претензий , которая обычно записывается издателем токена, то есть приложением на стороне сервера. Одно из полей называется exp
и содержит время истечения токена. Одним из свойств JWT является то, что пользователь не может вмешиваться в них. Это осуществляется с помощью контрольной суммы, которая может измениться, если какая-либо часть JWT изменится. В совокупности это означает, что пользователь не может изменить время истечения (или любое другое утверждение), и сервер может неявно доверять этому времени. Когда пользователь отправляет запрос с JWT, теоретически все, что нужно сделать серверу, это просто проверить exp
, чтобы убедиться, что токен все еще действителен. То есть состояние сеанса фактически находится вне приложения, по крайней мере, теоретически.
Напротив, когда пользователь каждый раз вводит имя пользователя / пароль, сервер не может знать, что делать, основываясь только на этой информации. Скорее, сервер должен сам поддерживать состояние сеанса, и это может быть дорогостоящим как с точки зрения памяти, так и производительности.
На практике JWT никогда не бывает полностью без сохранения состояния, но, используя хорошую реализацию, обычно можно получить очень маленький объем памяти, требующий лишь немного места в кеше (например, Redis или аналогичный инструмент).