#javascript #security #single-sign-on #single-page-application #jwt
#javascript #Безопасность #единый вход #одностраничное приложение #jwt
Вопрос:
Я начинаю внедрять систему единого входа на основе JWT (для нескольких одностраничных приложений в одном домене, так что что-то вроде app1.mydomain.com
, app2.mydomain.com
, auth.mydomain.com
), используя механизмы, описанные в этой статье из Stormpath.
Чтобы защитить мой подписанный токен JWT от атак XSS, я хочу сохранить токен в защищенном (только HTTPS) и HTTP-файлах cookie. Сам SPA получит информацию о пользователе из тела ответа.
Мой главный вопрос заключается в том, как мы можем реализовать функцию «выхода» в JavaScript, поскольку файл cookie по своей конструкции недоступен из кода JS?
Я предполагаю, что мне придется выполнить вызов сервера, который истечет срок действия файла cookie. Есть ли способ сделать это на стороне чистого клиента?
Комментарии:
1. Обрабатывать выход из системы на стороне сервера, превышая срок действия?
2. @JEY: да, это то, о чем я думал, я просто надеялся, что, возможно, есть решение только на стороне клиента.
Ответ №1:
Лучшим способом было бы выполнить очистку на стороне сервера, как уже предлагал пользователь JEY.
Кроме того, я хотел немного расширить возможности, чтобы это не соответствовало комментарию.
При работе с приложениями на основе браузера выбор хранилища токенов — это почти игра в яд. Если вы используете защищенный файл cookie только для HTTP, вам не нужно беспокоиться об уязвимостях XSS, ведущих к раскрытию токена. Тем не менее, вам все равно придется убедиться, что вы не уязвимы для XSS по целому ряду других причин.
Это означает, что вы не сохраняете никакой фактической работы, у вас просто возникает нечеткое ощущение, что если вы скомпрометированы XSS, по крайней мере, токен безопасен.
С другой стороны, благодаря использованию файлов cookie CSRF теперь должен быть в поле вашего зрения, и вот тут все может стать забавным, некоторые тривиальные методы предотвращения CSRF, такие как файлы cookie с двойной отправкой, могут быть реализованы таким образом, что они практически бесполезны при наличии уязвимостей XSS, которые можно использовать, например, в дочерних доменах.
Я не говорю, что хранение токенов в файлах cookie просто неправильно, это не так, аналогично, их хранение в веб-хранилище также приемлемо. В обоих случаях вам необходимо понимать последствия вашего выбора и возможности, которые дает каждый из них.
В этом случае веб-хранилище упростит ваш сценарий выхода из системы с точки зрения клиента, поэтому вам нужно спросить себя, какой набор плюсов и минусов лучше подходит для вашего сценария.
Учитывая, что вы упомянули несколько приложений в дочерних доменах, следует помнить о следующем:
При авторизации на основе токенов вам предоставляется выбор, где хранить JWT. Обычно JWT размещается в локальном хранилище браузера, и это хорошо работает в большинстве случаев использования. Следует учитывать некоторые проблемы с хранением JWT в локальном хранилище. В отличие от файлов cookie, локальное хранилище изолировано от определенного домена, и к его данным не может получить доступ ни один другой домен, включая поддомены.
(выделено мной, источник: Где хранить токены? раздел Cookies vs Tokens: окончательное руководство)
(Раскрытие информации: я инженер Auth0.)
Комментарии:
1. Спасибо за развернутый ответ. Итак, вы бы сказали, что если я хочу иметь какую-то функцию, подобную SSO, используя один и тот же токен для разных поддоменов, файл cookie с
.mydomain.com
доменом является единственным вариантом (для браузерного приложения)?2. Я бы сказал, что это было бы проще всего реализовать для этого сценария, учитывая точно такие же требования к домену, которые предъявляет веб-хранилище. Тем не менее, можно добиться единого входа даже в приложениях из совершенно не связанных доменов, поэтому этот сценарий также будет поддерживаться. Вы можете проверить SSO для примера этого.
3. Спасибо, я думаю, что буду использовать файлы cookie для хранения JWT. Кстати, ссылка в вашем комментарии плохо отформатирована.