Привет, сообщество stackoverflow!
Мы создаем приложение SPA с фреймворком nuxts.js и дошли до точки, которая является самым безопасным способом хранения токена JWT из нашей серверной службы API.
У нас есть два варианта cookie с флагом httpOnly и localStorage. Я прочитал массу статей о сравнении этих двух вариантов, хотя половина разработчиков поддерживает файлы cookie, а половина разработчиков поддерживает локальное хранилище.
На мой взгляд, файлы cookie кажутся более безопасным способом, чем localStorage, для хранения JWT на стороне клиента, но мне интересно, есть ли даже более безопасный способ, чем указанные выше варианты.
Итак, я кое о чем подумал. Фреймворк Nuxt.js предлагает нам возможность хранить переменные среды. Безопаснее ли хранить токен JWT в качестве переменной окружения, или он точно такой же, как вышеперечисленные варианты, или даже хуже.
Заранее спасибо!
@Aldarund Взгляни на это: nuxtjs.org/api/configuration-env. Кстати, вы предпочитаете файлы cookie или localStorage для хранения JWT?
и, как я уже сказал, его env для каждого сервера. Здесь нельзя хранить отдельные токены пользователей :)

Вы не можете с уверенностью сказать, что файлы cookie предпочтительнее localStorage. Это действительно зависит от того, как вы реализуете свое приложение, какой фреймворк вы используете и что именно вы хотите сделать. позвольте мне описать это более точно.
Cookie с httpOnly:
Cookies, when used with the HttpOnly cookie flag, are not accessible through JavaScript.
Когда вы сохраняете свой токен jwt в cookie и устанавливаете его через HTTP-запрос set-cookie в браузере, браузер будет отправлять эти учетные данные при каждом запросе. Конечно, вы можете защитить его, применив для этого файла cookie флаг httpOnly и secure. Так что никакой javascript не получит к нему доступа. Но проблема в том, что вы открываете шанс атакам CSRF.
Когда токен сохраняется в файле cookie, браузер автоматически отправляет его вместе с каждым запросом в тот же домен, и он по-прежнему уязвим для атак CSRF.
localStorage:
On the other hand, jwt tokens are sent in Authorization header in each request. So browser doesn't set it automatically in your requests. it should be set on each request via javascript on client-side.
В основном, поскольку браузер не добавляет автоматически к каждому запросу, по умолчанию он не уязвим для CSRF.
Но проблема возникает, когда ваш клиентский код уязвим для XSS. В этом случае, поскольку вы храните свои учетные данные в localStorage, злоумышленник будет иметь полный контроль над клиентской стороной и может делать все, что угодно. Разница в хранении в cookie заключается в том, что злоумышленник не знает точное значение cookie, которые хранятся с флагом httpOnly. Но он мог отправлять запросы с этими заголовками http.
Так что, на мой взгляд, это зависит от следующих ситуаций:
вы хотите сохранить токены jwt в localStorage, убедитесь, что вы проверили все свои входные данные и подтвердили их. Используйте фреймворк, который не уязвим для XSS (конечно, фреймворк не может этого утверждать, но хотя бы используйте тот, который не сообщал о CVE в последнее время). Также всегда обновляйте свои клиентские коды. Реализуйте все концепции безопасности, такие как csp и ...
Также знайте, какой CDN вы используете, и будьте осторожны с тем, какую библиотеку вы используете.
вы предпочитаете использовать печенье и устанавливать учетные данные через cookie в браузере. Затем будьте осторожны, применяя методы защиты от csrf. всегда используйте https и установите флаг secure. будьте осторожны с атаками, которые существуют на cookie, такими как атаки на поддомены и атаки посредника.
Также Django использует два классных метода для обработки этой ситуации: (Об этом подробнее здесь)
заключительное примечание: Я не думаю, что есть общее решение по этой теме, и кто-нибудь может предложить, основываясь на его экспериментах и знаниях. Кстати, я предпочитаю localStorage для хранения учетных данных, полученных от Rest API.. Но я действительно был бы рад, если бы кто-нибудь мог поправить меня для лучшего решения.
Ух ты, действительно красивый и подробный ответ Реза! Лично я предпочитаю файлы cookie с httpFlag, потому что вы можете легче предотвратить атаки CSRF, я имею в виду, что это больше под контролем, с другой стороны, XSS - это большой беспорядок, это не все под контролем, очень хороший пример - это то, что вы рассказали о внешних скриптах из CDN , скрипты для рекламы, скрипты отслеживания для маркетинговых целей и общие скрипты, которые могут быть уязвимыми. В любом случае зависит от каждого разработчика, но для меня ПРАВИЛО - никогда не доверять Javascript. :) Хорошего дня!
В общем, я могу сказать: если вы уверены, что ваш код не уязвим для XSS и фреймворк обновлен, а xss еще не сообщается, тогда localStorage может быть лучшим вариантом, но если у вас даже есть небольшая возможность этого, используйте Cookie, но реализовать его полностью. Потому что в настоящее время сообщается о множестве новых атак на него (проверьте разговоры о черной шляпе)
Хороший ответ, лично я немного параноик, когда дело доходит до хранения секретов, от CSRF его легко защитить, а от XSS практически невозможно. Я обычно ем печенье.
токен jwt рассчитан на пользователя. переменная среды для каждого сервера. Определите, как вы хотите использовать их для токенов jwt ..