С целью обеспечения REST API с помощью JWT, по мнению некоторых материалов (как это руководство , и этот вопрос ), то JWT , может храниться в любом LocalStorage или печенье . Исходя из моего понимания:
- localStorage подвержен XSS и обычно не рекомендуется хранить в нем какую-либо конфиденциальную информацию.
- С помощью файлов cookie мы можем применить флаг httpOnly, который снижает риск XSS. Однако, если мы хотим прочитать JWT из файлов cookie на бэкэнде, мы подвергаемся CSRF.
Итак, исходя из вышеизложенного, будет лучше, если мы будем хранить JWT в файлах cookie. При каждом запросе к серверу JWT будет считываться из файлов cookie и добавляться в заголовок авторизации с использованием схемы Bearer. Затем сервер может проверить JWT в заголовке запроса (в отличие от чтения его из файлов cookie).
Я правильно понимаю? Если да, есть ли у вышеуказанного подхода какие-либо проблемы с безопасностью? Или на самом деле мы можем просто обойтись без использования localStorage?
Ответы:
Мне нравится метод двойной отправки файлов cookie XSRF, который упоминается в статье @ pkid169, но есть одна вещь, о которой вам не говорится. Вы по-прежнему не защищены от XSS, потому что злоумышленник может внедрить сценарий, который считывает ваш файл cookie CSRF (который не является HttpOnly), а затем выполнить запрос к одной из ваших конечных точек API, используя этот токен CSRF с автоматически отправляемым файлом cookie JWT.
Таким образом, на самом деле вы все еще уязвимы для XSS, просто злоумышленник не может украсть ваш токен JWT для последующего использования, но он все еще может делать запросы от имени ваших пользователей с помощью XSS.
Независимо от того, храните ли вы свой JWT в localStorage или храните свой XSRF-токен не только в файле cookie http, XSS может легко захватить оба. Даже ваш JWT в файле cookie HttpOnly можно захватить с помощью расширенной XSS-атаки.
Таким образом, в дополнение к методу двойной отправки файлов cookie вы всегда должны следовать лучшим практикам в отношении XSS, включая экранирование содержимого. Это означает удаление любого исполняемого кода, который заставил бы браузер делать что-то, чего вы не хотите. Обычно это означает удаление тегов // <! [CDATA [и атрибутов HTML, которые вызывают оценку JavaScript.
источник
Html.AntiForgeryToken()
в ASP.NET MVC использует файл cookie HttpOnly для маркера CSRF. Я думаю, что вы все еще восприимчивы к определенным XSS, но подумал, что об этом стоит упомянуть.Своевременный пост от Stormpath в значительной степени развил мои мысли и ответил на мой вопрос.
TL; DR
Сохраните JWT в файлах cookie, а затем либо передайте JWT в заголовке авторизации по каждому запросу, как я уже упоминал, либо, как предлагается в статье, полагайтесь на бэкэнд для предотвращения CSRF (например, использование
xsrfToken
в случае Angular).источник
Вместо этого при входе в систему вы можете доставить два токена: токен доступа и токен обновления. Токен доступа должен храниться в памяти Javascript, а токен обновления должен храниться в HttpOnly Cookie. Токен обновления используется только и только для создания новых токенов доступа - не более того.
Когда пользователь открывает новую вкладку или при обновлении сайта, вам необходимо выполнить запрос на создание нового токена доступа на основе токена обновления, который хранится в Cookie.
Также настоятельно рекомендую прочитать эту статью: https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/
источник
secure
,samesite: strict
,http-only
?Чтобы предотвратить атаки CSRF, использующие существующие файлы cookie, вы можете установить свой файл cookie с помощью
SameSite
директивы. Установите его наlax
илиstrict
.Это все еще черновик и по состоянию на 2019 год не полностью поддерживается всеми текущими браузерами , но в зависимости от конфиденциальности ваших данных и / или вашего контроля над браузерами, которые используют ваши пользователи, это может быть жизнеспособным вариантом. Установка директивы с
SameSite=lax
разрешит «навигацию верхнего уровня, использующую« безопасный »... HTTP-метод».источник