Где безопаснее всего хранить JWT Json Web Tokens на стороне клиента? - PullRequest
0 голосов
/ 07 декабря 2018

Привет сообщество stackoverflow!

Мы создали приложение SPA с каркасом nuxts.js и пришли к точке, которая является самым безопасным способом хранения токена JWT из нашей службы API бэкэнда.

У нас есть два варианта файлов cookie с флагом httpOnly по сравнению с localStorage.Я прочитал массу статей о сравнении этих двух вариантов, хотя половина разработчиков поддерживает файлы cookie, а половина разработчиков поддерживает localalstorage.

На мой взгляд, файлы cookie кажутся более безопасным способом, чем localStorage, хранить JWT в клиенте.сторона, но мне интересно, есть ли даже более безопасный способ, чем описанные выше варианты.

Так что я подумал о чем-то.Платформа Nuxt.js дает нам возможность хранить переменные среды.Безопаснее ли хранить токен JWT в качестве переменной среды или он точно такой же, как описанные выше опции, или даже хуже?

Заранее спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Вы не можете с уверенностью сказать, что куки предпочтительнее localStorage.Это действительно зависит от того, как вы реализуете свое приложение, какую платформу вы используете и что именно вы хотите делать.позвольте мне описать его более точно.

Файл cookie с httpOnly:

Файлы cookie, используемые с флагом cookie HttpOnly, недоступны через JavaScript.

Когда вы сохраняете свой токен jwt в cookie и устанавливаете его через http-запрос set-cookie в браузере, браузер будет отправлять эти учетные данные при каждом запросе.Конечно, вы можете обезопасить его, применив для файлов cookie httpOnly и secure.Так что никакой javascript не получит к нему доступ.Но проблема в том, что вы открываете шанс для CSRF атак.

Когда токен сохраняется в файле cookie, браузер автоматически отправляет его вместе с каждым запросом в один и тот же домен, и он по-прежнему уязвим для атак CSRF.

localStorage:

С другой стороны, токены jwt отправляются в заголовке авторизации в каждом запросе.Поэтому браузер не устанавливает его автоматически в ваших запросах.это должно быть установлено на каждый запрос через javascript на стороне клиента.

Таким образом, поскольку браузер не добавляет автоматически каждый запрос, по умолчанию он не уязвим для CSRF.

Но проблема возникает, когда ваш клиентский код уязвим к * 1029.*.В этом случае, поскольку вы храните свои учетные данные в localStorage, то злоумышленник будет иметь полный контроль над клиентской стороной и может делать все что угодно.Разница в хранении в cookie заключается в том, что злоумышленник не знает точного значения cookie, которые хранятся с флагом httpOnly.Но он мог отправлять запросы с этими заголовками http.


Так что, на мой взгляд, это зависит от следующих ситуаций:

  • вы хотите сохранить токены jwt в localStorage , убедитесь, что вы проверили все свои входные данные и проверили их.Используйте платформу, которая не уязвима для XSS (наверняка, фреймворк не может это утверждать, но, по крайней мере, используйте среду, которая недавно не сообщала о CVE).Также всегда обновляйте свои клиентские коды.Реализуйте все концепции безопасности, такие как csp и ... Также будьте внимательны с тем, какую CDN вы используете, и будьте осторожны с библиотекой, которую вы используете.

  • вы предпочитаете использовать cookie и установите учетные данные через Cookie в браузере.Тогда будьте осторожны, чтобы реализовать методы смягчения анти-CSRF.всегда используйте https и устанавливайте флаг secure.будьте осторожны при использовании cookie-файлов, например, при атаке на поддомен и при атаке «человек посередине».Также Django использует два классных метода для обработки этой ситуации (подробнее об этом здесь)

    • Double-Submit Cookie
    • Token Synchronizer

последнее примечание: Я не думаю, что есть общее решение для этой темы, и любой может предложить, основываясь на его экспериментах и ​​знаниях. Кстати, я предпочитаю localStorage хранить учетные данные, полученные от Rest API .Но я действительно рад, если кто-нибудь сможет поправить меня для лучшего решения.

...