Чи слід зберігати JWT у localStorage чи cookie? [дублікат]


99

З метою захисту API REST за допомогою JWT, згідно з деякими матеріалами (наприклад, цим посібником та цим запитанням ), JWT може зберігатися як у localStorage, так і у файлах cookie . Виходячи з мого розуміння:

  • localStorage піддається XSS і, як правило, не рекомендується зберігати в ній конфіденційну інформацію.
  • За допомогою файлів cookie ми можемо застосувати позначку "httpOnly", яка зменшує ризик виникнення XSS. Однак якщо ми хочемо прочитати JWT з файлів cookie у серверній системі, тоді ми підлягаємо CSRF.

Отже, виходячи з вищезазначеної передумови - найкраще буде зберігати JWT у файлах cookie. На кожному запиті до сервера JWT буде зчитуватися з файлів cookie та додаватися до заголовка авторизації за допомогою схеми Bearer. Потім сервер може перевірити JWT у заголовку запиту (на відміну від читання його з файлів cookie).

Чи правильно розумію моє розуміння? Якщо так, то чи має вищезазначений підхід питання щодо безпеки? Або насправді ми можемо просто піти, використовуючи localStorage, насамперед?



@ lrn2prgrm, оскільки не слід використовувати (без стану) JWT та (stateful) семантику сеансу разом.
ozanmuyes

Відповіді:


56

Мені подобається метод подвійного надсилання файлів cookie XSRF, який згадується у статті, про яку сказав @ pkid169, але є одна річ, про яку ця стаття не розповідає. Ви все ще не захищені від XSS, оскільки зловмисник може ввести скрипт, який зчитує ваш файл cookie CSRF (який не є HttpOnly), а потім зробити запит до однієї з ваших кінцевих точок API, використовуючи цей маркер CSRF із автоматично переданим файлом cookie JWT.

Отже, насправді ви все ще сприйнятливі до XSS, просто зловмисник не може викрасти ваш токен JWT для подальшого використання, але він все одно може робити запити від імені вашого користувача за допомогою XSS.

Незалежно від того, чи зберігаєте ви свій JWT у локальному сховищі, чи зберігаєте свій маркер XSRF у файлі cookie, який не є лише http, обидва варіанти можуть бути легко схоплені XSS. Навіть ваш JWT у файлі cookie HttpOnly може бути захоплений розширеною атакою XSS.

Отже, окрім методу Double Submit Cookies, ви завжди повинні дотримуватися найкращих практик щодо XSS, включаючи екранований вміст. Це означає видалення будь-якого виконуваного коду, який змусив би браузер робити те, чого ви не хочете. Зазвичай це означає видалення тегів // <! [CDATA [та атрибутів HTML, які спричиняють оцінку JavaScript.


11
Чи можете ви пояснити, як можна отримати JWT у файлі cookie HttpOnly? Він може використовуватися XSRF, якщо маркер XSRF скомпрометований XSS, але чи справді він може бути захоплений сам?
Яцек Горгонь

1
Я знаю, що це стара публікація, але я хотів би задати кілька запитань ... Чи означає це, що добре розроблені сценарії можуть читати як localStorage, так і файли cookie? Якщо так, чи безпечно припустити, що JWT можливо викрасти незалежно від того, де ми зберігаємо його в браузері? Тоді я відчуваю, що покладатися виключно на JWT дуже ризиковано.
Хірокі,

2
"Навіть ваш JWT у файлі cookie HttpOnly може бути захоплений розширеною атакою XSS." є хибним. Відредаговано оригінальне повідомлення, щоб виправити це.
java-addict301

"Навіть ваш JWT у файлі cookie HttpOnly може бути захоплений розширеною атакою XSS" Я можу уявити, що хтось захоплює файл cookie, надсилаючи його на власний сервер. Для цього він може використовувати вибірку з належним значенням прапора облікових даних. Основною проблемою тут є захист CORS, але за певних обставин я думаю, що це можливо.
bartnikiewi.cz

"inject script, який читає ваш файл cookie CSRF (який не є HttpOnly)" Реалізація за замовчуванням Html.AntiForgeryToken()у ASP.NET MVC використовує файл cookie HttpOnly для маркера CSRF. Я думаю, ви все ще сприйнятливі до певних XSS, але вважали, що це варто згадати.
Lovethenakedgun

21

Своєчасна публікація від Stormpath майже повністю розробила мої зауваження та відповіла на моє запитання.

TL; DR

Зберігайте JWT у файлах cookie, а потім передайте JWT у заголовку авторизації на кожен запит, як я вже згадував, або, як пропонується в статті, покладайтеся на серверну інформацію, щоб запобігти CSRF (наприклад, використовувати xsrfTokenу випадку Angular).


1
Привіт, я не впевнений, що це правильно, але, чи є деякі особливі недоліки використання файлів cookie для зберігання jwt, коли ви впроваджуєте CrossOrigin для своїх контролерів, тобто сцена, де мій серверний додаток знаходиться в іншому місці, і ми телефонуємо до api з нього в нашому клієнтському додатку, який знаходиться, скажімо, в іншому місті? Чи не тому багато постачальників веб-послуг утримуються від використання файлів cookie?
valik

CrossOrigin не означає фізичне розташування. Це стосується запитів, що надходять з інших доменів. У ядрі .net, коли ви вирішили використовувати CORS, ви вказуєте, які домени ви збираєтеся дозволити; які заголовки ви дозволите тощо
Брайан Аллан Вест

11
  • Не зберігайте свій маркер у LocalStorage або SessionStorage, оскільки такий маркер можна прочитати з javascript, і тому він вразливий для атаки XSS.
  • Не зберігайте свій маркер у файлі cookie. Файл cookie (з позначкою HttpOnly) є кращим варіантом - він схильний до XSS, але це вразливо для атак CSRF

Натомість при вході ви можете доставити два маркери: маркер доступу та маркер оновлення. Маркер доступу повинен зберігатися в пам'яті Javascript, а маркер оновлення - у файлі cookie HttpOnly. Маркер оновлення використовується лише і лише для створення нових маркерів доступу - не більше того.

Коли користувач відкриває нову вкладку або під час оновлення сайту, вам потрібно виконати запит на створення нового маркера доступу на основі маркера оновлення, який зберігається в файлі cookie.

Я також настійно рекомендую прочитати цю статтю: https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/


5
Чому додаткова складність, коли ви можете просто розглядати маркер оновлення як маркер доступу? Як цей підхід більш безпечний дали зазначає мій маркер доступу , як secure, samesite: strict, http-only?
Чарівний робот

це не безпечніше
Кріс Хоукс,

2

Щоб запобігти атакам CSRF, які використовують переваги існуючих файлів cookie, ви можете встановити свій файл cookie відповідно до SameSiteдирективи. Встановіть на laxабо strict.

Це все ще проект, і станом на 2019 рік не повністю підтримується всіма поточними браузерами , але залежно від чутливості ваших даних та / або вашого контролю над браузерами, якими користуються ваші користувачі, це може бути життєздатним варіантом. Встановлення директиви за допомогою SameSite=laxдозволить "навігації верхнього рівня, які використовують" безпечний "... HTTP-метод."

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.