Подтвердить что ты не робот

JSON Web Token (JWT) дает преимущества над токеном сеанса базы данных

С помощью системы токенов базы данных я мог бы иметь логин пользователя с именем пользователя/паролем, сервер мог бы генерировать токен (например, uuid) и хранить его в базе данных и возвращать этот токен клиенту. Каждый запрос оттуда будет включать токен, и сервер будет искать, действителен ли токен и к какому пользователю он принадлежит.

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

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

4b9b3361

Ответ 1

Основное различие - размер хранилища сеанса и работа поиска, требуемая от сервера:

  • На стороне сервера JWT хранит одиночный ключ в памяти (или в файле конфигурации) - называется секретным ключом. Этот ключ имеет две цели: он позволяет создавать новые зашифрованные маркеры, а также работает как главный ключ, который "открывает все блокировки", или в реальной жизни проверяет все токены. В результате сервер реагирует гораздо быстрее на auth-запросы, потому что не имеет значения, если вы зарегистрировали двух или двух миллионов пользователей - для проверки подлинности всех клиентских запросов будет использоваться одинаковое количество записей (один, этот серверный ключ).

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

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

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

Тем не менее, разумные возможности для db-сессий: они могут быть более безопасными из-за этой задержки и также менее уязвимы для захвата сеанса после выхода пользователя из системы.

* Метод хранимых сеансов db может быть оптимизирован с эффективным кэшированием и путем хранения только идентификатора сеанса (в отличие от всего объекта пользователя) в быстром сервере ключей/значений, например Redis. Тем не менее, я бы по-прежнему выбирал метод JWT по сравнению с db для большинства случаев.

Ответ 2

Токен на основе Json (JWT) преодолевает следующие проблемы:

  1. Проблемы с мобильным приложением. Похоже, что у собственных мобильных приложений проблемы с файлами cookie, поэтому, если нам нужно запросить удаленный API, возможно, аутентификация сеанса - не лучшее решение.
  2. Проблемы с CSRF: если вы следите за файлами cookie, вам нужно иметь CSRF, чтобы избежать межсайтовых запросов.

Но JWT не использует сеансы, не имеет проблем с мобильными устройствами, ему не нужен CSRF, и он также очень хорошо работает с CORS. Если у вас нет действующего токена, вы ничего не сможете сделать.

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