Это часть 2 в серии с двумя частями по управлению сессиями. Если читатель понимает общие концепции JWT (JSON Web Token) и пользовательских сеансов, то часть 2 может быть прочитана без чтения части 1.
Часть 1: Введение в управление сеансом, анализ наиболее часто используемых сеансов и лучшие практики
Часть 2: Анализ нового потока сеанса с открытым исходным кодом, который является безопасным и простым интегрировать
Часть 1 предоставила образовательное руководство по управлению сеансами (как обрабатываются, хранятся и изменяются в течение активного сеанса _) _, и мы обсудили несколько часто используемых сеансов. Тем не менее, мы считаем, что потоки, упомянутые в части 1, являются неоптимированными с точки зрения безопасности для большинства вариантов использования. Мы наткнулись на поток, концептуализированный IETF (Интернет -инженерная целевая группа) в RFC 6819 Анкет Мы взяли предлагаемый поток, построил его и по запросу других, открыли наш код для более широкого сообщества.
В этом посте мы рассмотрим и проанализируем поток сеанса, рассмотрим некоторые детали реализации и предоставим вам настраиваемую библиотеку. Библиотека готова к производству и может быть интегрирована с вашей системой за день.
Предлагаемый поток
Вращающиеся токены обновления с недолгими токенами доступа
Предлагаемый поток AUTH – нажмите, чтобы увеличить масштаб
- Токены доступа недолговечны, а токены обновления долгоживутся.
- Когда получается новый токен обновления, старые токены обновления и доступа признаны недействительными на бэкэнд и удаляются с фронта. Делать это правильно не просто. Пожалуйста, смотрите «Примечания для реализации», обсуждается позже.
- Если пользователь добровольно выходит из выхода, то жетоны доступа и обновления отозваны и очищаются с фронта.
Анализ повреждений Критический токен аудитория постоянно обнажается на двух поверхностях атаки, фронта и бэкэнд и иногда подвергается транзиту.
Эффект украденных токенов аути: Токен доступа украден: Злоумышленник будет несанкционированный доступ в течение короткого периода времени (до истечения срока действия токена)
Осветите токен украден: обнаружение кражи позволит похитить токен обновления.
Обнаружение кражи: Токен доступа украден: Эта кража может быть обнаружена только путем использования эвристические алгоритмы или если пользователь уведомляет поставщика/разработчика Сервиса.
Обновление токена украдена: обнаружение кражи будет возможным, если и злоумышленник, и жертва используют токен обновления, по крайней мере, после того, как после атаки. Это проиллюстрировано при примере ниже.
- Злоумышленник удалось приобрести токен обновления жертвы – RT0. После истечения срока действия тона доступа (AT0) как жертва, так и злоумышленник должны будут использовать RT0 для приобретения нового набора токенов.
- Если злоумышленник сначала использует RT0, то они получат новые RT1 и AT1, которые при использовании, будут аннулировать RT0. Когда жертва использует недействительный RT0, сервер получает четкое признак того, что кража произошла, поскольку клиент должен был использовать RT1. Аналогичный аргумент работает, если жертва использует RT0 в первую очередь.
- Если оба, жертва и злоумышленник, используйте RT0 одновременно, то один получит (RT1, AT1), а другой (RT2, AT2). Следующий запрос любого из них с новым токеном доступа либо аннулирует RT1, либо RT2, в результате чего жертва или злоумышленник в конечном итоге будет вычеркнут. Опять же, здесь бэкэнд получит четкое указание на кражу.
После обнаружения: Токены доступа не должны быть отозваны, так как они недолговечны. Однако, если необходимо, непрозрачные токены доступа могут быть отменены путем удаления их из базы данных.
Токены обновления можно легко отменить, удалив его из базы данных.
Это суммирует обсуждение концептуального потока. Ниже есть некоторые дополнительные указатели, которые следует помнить для читателей, которые хотели бы реализовать этот поток самостоятельно. В качестве альтернативы, у нас есть реализация этого потока с открытым исходным кодом, доступной на GitHub .
Примечания для реализации
- Бэкэнд лишается допускания перед желудами, когда он генерирует новую пару. В ситуации, когда фронт не получает новые токены (по какой -либо причине), он будет продолжать использовать предыдущие недействительные – в результате чего пользователь будет выходить из строя. Чтобы предотвратить это, бэкэнд должен аннулировать предыдущие токены только тогда, когда на фронте используются новые токены – подтверждая его успешную квитанцию.
- Система генерирует новый, другой токен обновления (RT) каждый раз, когда используется допустимый RT. Чтобы предотвратить ложные срабатывания (указание кражи) и входа пользователей, необходимо учитывать условия гонки, которые могут возникнуть на фронте.
- Если токен обновления отменен, то в идеале его токен также должен быть отозван его токен доступа.
- Обнаружение кражи токена обновления не требует, чтобы база данных явно хранила недействительные токены. Это может быть достигнуто путем структурирования токенов обновления с использованием иерархий родительских детей (см. Реализацию GitHub).
- Реализации с JWT -токенами доступа могут быть столь же масштабируемыми с точки зрения пространства и временной сложности, как поток сеанса 5 в части 1. Нам нужно сохранить только один токен обновления на зарегистрированный пользователь на устройство в базе данных.
Это завершает основную часть вопроса, которое мы имеем в управлении сеансом. Ниже вы найдете репозиторий GitHub с исходным кодом, который касается всех проблем реализации. Он очень настраивается для ваших требований и может быть быстро интегрирован в вашу систему. Это также очень безопасно с точки зрения профилактики и обнаружения кражи токенов. Мы хотели бы знать, что вы об этом думаете – пожалуйста, оставьте комментарий или электронную почту (team@supertokens.io) нас.
Супертаковая библиотека
Пока библиотека жива – мы обещаем поддержать ее (исправлять ошибки, проблемы с адресом, добавлять функции и обновлять документацию) и быть отзывчивыми (по электронной почте и т. Д.).
Чтобы показать некоторую дополнительную любовь нашим ранним читателям, мы предлагаем следующую специальную поддержку:
- Бесплатные консультации по вашей текущей системе управления сеансами, включая выявление уязвимостей и предложение улучшений для вашего конкретного случая использования.
- Бесплатная поддержка супертазной библиотеки. Если у вас есть какие -либо проблемы с реализацией, ошибками и настройками – мы будем доступны по требованию.
Пожалуйста, посетите Наша документация Страница, чтобы найти правильную библиотеку для вашего технического стека.
Окончательный вывод и рекомендации
Создание готового производства Решение управления сеансом это нетривиально. Это требует глубоких знаний и дорого с точки зрения времени и денег. Многие разработчики не приоритет управлению сеансами, что приводит к неоптимальным, необеспеченным системам в производстве.
Мы обсудили различные сеансные потоки в этих двух постах. В зависимости от требований, один поток может быть лучше подходит, чем другие. В общем, наша рекомендация будет следующей:
Для услуг, которые касаются очень конфиденциальных данных (например: платформа для торговли акциями или что -то вроде Эшли Мэдисон), безопасность может иметь приоритет по сравнению с пользовательским опытом. Идеальным потоком здесь будет использование нашего потока с недолговечными токенами обновления и более короткими непрозрачными токенами доступа. Время истечения срока подачи токена обновления будет зависеть от количества времени, в которое вы выберете пользователя из -за бездействия (на это время назовут T). Каждый раз, когда используется токен обновления, новый токен будет жив во времени Т. Вы также можете получить жесткий ограничение на срок службы всей сессии. То есть, независимо от активности пользователя, сеанс истекает за это время. Это будет оцениваться, например, в зависимости от того, как долго вы ожидаете, что пользователи будут находиться на вашем сервисе в данный день.
Для всех других услуг используйте наш поток с токенами JWT Access (для более легкой масштабируемости) и долгосрочными токенами обновления. Вы также можете использовать черный список, чтобы мгновенно отозвать токены доступа (это увеличит время на API, но вы сэкономили бы на пространстве по сравнению с использованием непрозрачных токенов доступа). Однако, если вы не хотите полагаться на один общий ключ для всей вашей аутентификации (даже если этот ключ продолжает меняться), или если сохранение пропускной способности сети имеет приоритет, то используйте непрозрачные токены доступа. Кроме того, безопасность может быть улучшена с помощью 2-факционной аутентификации или методов входа без пароля. Последний имеет преимущество, что не требует, чтобы пользователи запомнили еще один пароль.
И это все! Пожалуйста, дайте нам знать, что вы думали, прочитав это через комментарии или по электронной почте здесь (team@supertokens.io). Мы надеемся, что это было полезно.
Сноски
[1] Если использовать непрозрачный токен, то немедленный вход, иначе они будут выходить из строя после истечения времени их нового JWT.
[2] Это проблема с условием гонки: допустим, пользователь открыл ваше приложение в TAB1 и TAB2 в своем браузере. Обе эти вкладки имеют один и тот же набор файлов cookie. Следующая иллюстрация демонстрирует, как условие гонки может привести к выходам пользователей.
Написано ребятами из Supertokens – надеюсь тебе понравилось!
Оригинал: “https://dev.to/supertokens/the-best-way-to-securely-manage-user-sessions-2ja6”