JWT против аутентификации сессий
Узнайте разницу между аутентификацией на основе сессий и JWT. Исследуйте компромиссы, преимущества и варианты использования, чтобы выбрать подходящую схему аутентификации для ваших приложений.
Узнайте разницу между аутентификацией на основе сессий и JWT. Исследуйте компромиссы, преимущества и варианты использования, чтобы выбрать подходящую схему аутентификации для ваших приложений.
В общем смысле, первым шагом в использовании приложения является аутентификация, когда пользователь предоставляет свои учетные данные для успешного входа в систему. После этого шага система идентификации (т.е. поставщик идентификации, сервер авторизации и т.д.) знает, кто пользователь и к каким ресурсам он имеет доступ.
Поскольку HTTP по своей природе является статeless, каждый запрос в сессии независим и не запоминает информацию из предыдущих. Повторная аутентификация пользователей для каждого действия затруднительна и ухудшает пользовательский опыт.
Рассмотрим аутентификацию на основе сессий и аутентификацию JWT (JSON Web Tokens), два популярных метода поддержания состояния аутентификации. У каждого из них есть свои уникальные преимущества и компромиссы, и выбор между ними зависит от конкретных потребностей вашего приложения. Если вы решаете между этими двумя методами, это руководство здесь, чтобы помочь вам.
Аутентификация на основе сессий полагается на сервер для поддержания записи состояния аутентификации пользователя. Создавая и управляя сессиями, сервер позволяет пользователям оставаться в системе и продолжать взаимодействовать с приложением, не вводя учетные данные при каждом запросе.
Создание сессии
SessionID сохраняется в базе данных и возвращается на клиент пользователя в виде cookie.Проверка сессии
SessionID).SessionID, консультируясь с данными сессии, хранящимися на сервере.Сессии можно аннулировать в реальном времени, что удобно в ситуациях, требующих быстрого отзыва доступа.
JSON Web Tokens (JWT) используют другой подход, внедряя всю релевантную информацию о пользователе непосредственно в токен, используя JSON объект. В отличие от методов на основе сессий, JWT являются stateless, что означает, что сервер не управляет записями аутентификации.
JWT состоит из трех частей: заголовок, полезная нагрузка и подпись.

Выдача JWT
Процессы на основе сессий следуют похожему процессу. Однако после аутентификации информация о пользователе сохраняется на сервере внутри сессии, тогда как JWT полагаются на токены, отправленные на клиента для хранения и последующего использования.
Проверка токена
Authorization (Bearer <token>).Аутентификация на основе сессий требует, чтобы сервер запрашивал хранилище сессий, что может быть медленным, особенно если оно зависит от внешних или централизованных баз данных. В отличие от этого, аутентификация JWT является stateless, с всей необходимой информацией, хранящейся в клиентском токене, и использует подпись для обеспечения безопасности. Это устраняет необходимость в управлении сессиями, делая ее быстрее и более масштабируемой, особенно в распределенных системах.
На стороне клиентов выход из системы обычно означает очистку локальной сессии и удаление токенов (ID, доступ, обновление токена) из хранения. Однако, для аутентификации JWT, это только отключает пользователя локально, оставляя централизованную сессию на сервере авторизации нетронутой. Как следствие, пользователи могут по-прежнему получать доступ к другим приложениям в рамках той же сессии, пока токен не истечет или не будет аннулирован вручную.
Отзыв JWT (JSON Web Token) более сложен, чем аутентификация на основе сессий, поскольку JWT являются stateless и не могут быть аннулированы после выдачи, если не реализованы конкретные стратегии. Обычные методы включают:
exp (например, 15 минут) для JWT. Как только срок действия истечет, пользователь должен снова пройти аутентификацию. Это минимизирует риск в случае компрометации токена, поскольку атакующий может его использовать только ограниченное время. Чтобы поддерживать бесшовный пользовательский опыт, обновляющий токен может минимизировать неудобства повторной аутентификации.JWT не обновляется в режиме реального времени
После подписания JWT он не может быть отозван или обновлен и будет считаться действительным как долго, пока подпись действительна и не истекла.
Если разрешения доступа пользователя изменятся (обычно ухудшаются), пользователь все равно будет иметь устаревший доступ к ресурсам до истечения срока действия JWT. Аналогично, если JWT содержит информацию об авторизации, основанной на ролях, новая область авторизации не вступит в силу, пока старый JWT не истечет. Другими словами, JWT не подходят для аннулирования в режиме реального времени, и пользователи могут установить соответствующий срок истечения, чтобы смягчить эту проблему.
Дилемма многоустройств и аннулирования
Невозможно проверить все выданные JWT до их истечения для реализации аннулирования пользователя на всех устройствах. Хотя теоретически возможно отозвать ключ подписи, чтобы отменить JWT, это также аннулирует все JWT, использующие этот ключ, а процесс обработки кэшированных ключей сделает этот подход непрактичным для простых операций аннулирования пользователей.
Некоторые поставщики удостоверений могут иметь готовые решения для этих проблем JWT. Для получения дополнительной информации ознакомьтесь с "Лучшими практиками для улучшения опыта аутентификации JWT.”
Сессии и JWT — два популярных подхода для поддержания контекста аутентификации и авторизации в stateless мире HTTP. Хотя оба подхода имеют свои плюсы и минусы, они предлагают различные преимущества и недостатки.
Сессии обеспечивают более сильные гарантии для авторизации отдельных запросов и проще в безопасной реализации. Однако их зависимость от проверки на стороне сервера через базу данных вносит накладные расходы на задержку, что может негативно отразиться на пользовательском опыте для высокочувствительных приложений.
JWT, с другой стороны, выгодны для более быстрой авторизации и взаимодействия с внешними приложениями, но требуют большего усилия разработчика для решения сложных вопросов безопасности. Например, мы можем использовать вебхуки для уведомления клиентов, когда доступ пользователя отзывается, чтобы клиенты могли очистить кэшированный JWT и заставить пользователя снова пройти аутентификацию.
Поскольку аутентификация на основе токенов более подходит для масштабирования, несмотря на её управляемые недостатки, она принимает всё больше и больше современных приложений.
Ваш метод аутентификации должен соответствовать архитектуре вашего приложения и конкретным потребностям. Вот краткое руководство, чтобы помочь вам решить:
Аутентификация на основе сессий работает лучше всего, когда вам нужно контроль сеансов в реальном времени, централизованное управление или масштабируемость не является основной проблемой. Вот где она сияет:
Веб-приложения с постоянными сессиями
Для таких платформ, как онлайн-магазины, сессии важны для отслеживания пользователей, корзин покупок и предпочтений во время их визита.
Приложения, требующие контроля сеансов в реальном времени
Приложения, такие как банковские или финансовые услуги, выигрывают от управления данными сессий через сервер, обеспечивая надежное управление доступом и безопасность.
Системы на одном сервере или в малом масштабе
Внутренние инструменты или небольшие приложения, не требующие высокой масштабируемости, хорошо работают с простым управлением сессиями для удобства использования и надежности.
JWT аутентификация лучше подходит для приложений, которые придают приоритет масштабируемости, эффективности и распределенности систем. Она особенно полезна для stateless взаимодействий между клиентами и серверами. Рассмотрите возможность использования аутентификации на основе токенов для следующих случаев:
Single Sign-On (SSO)
JWT идеально подходят для Single Sign-On, позволяя пользователям аутентифицироваться один раз и бесшовно получать доступ к нескольким сервисам или приложениям с использованием одного и того же токена. Поделитесь подробным объяснением о безопасных облачных приложениях, использующих OAuth 2.0 и OIDC, в формате JWT и для токенов доступа, и для идентификационных токенов.
Мобильные приложения
Мобильные приложения часто предпочитают JWT для аутентификации, так как токены могут быть безопасно сохранены на устройстве и отправлены с каждым API-запросом. Исследуйте быструю интеграцию JWT аутентификации для Android / iOS.
Архитектуры микросервисов
В микросервисных средах JWT позволяют каждой службе самостоятельно проверять токен без обращения к центральному хранилищу сессий, обеспечивая масштабируемость и эффективность.
Аутентификация между доменами
JWT превосходят в сценариях, включающих несколько доменов или поддоменов (например, api.example.com, dashboard.example.com и docs.example.com). В отличие от cookies, JWT позволяют аутентификацию между доменами без дополнительных зависимостей.
API и веб-сервисы
RESTful API и веб-сервисы обычно используют JWT для аутентификации, так как они легковесны, портативны и устраняют необходимость в управлении сессиями на стороне сервера. Узнайте больше о автоматизированной аутентификации для сценариев, где ваше приложение должно напрямую общаться с ресурсами.
JWT аутентификация отличный инструмент, но она может иметь трудности, влияющие на пользовательский опыт. Logto предлагает простое и надежное решение для преодоления этих проблем, делая его топовым выбором для надежной и эффективной аутентификации.
Один из распространенных вопросов с аутентификацией JWT это обеспечение надлежащего опыта выхода пользователя из системы. Logto упрощает этот процесс с помощью своего готового SDK.
Это обеспечивает консистентное и безопасное управление сессиями в вашей экосистеме. Узнайте больше о механизмах выхода из системы и как реализовать выход.
Управление в реальном времени изменениями в разрешениях пользователя с JWT может быть также сложным. Поскольку JWT по дизайну stateless, любые обновленные разрешения или роли могут не вступить в силу до истечения срока действия токена. Logto предлагает стратегии для эффективного управления этим:
Эти решения помогают поддерживать актуальность разрешений и обеспечивать более безопасную и отзывчивую систему. Узнайте больше о управлении реальными временем изменениями в разрешениях пользователей.
Logto, который является масштабируемой инфраструктурой управления доступом к идентичности, предоставляет полное решение идентификации как облачную услугу, так и open-source версию.