У контексті СЗТ Stormpath написав досить корисну статтю, в якій виклав можливі способи їх зберігання та (не) переваги, що стосуються кожного методу.
Він також має короткий огляд атак XSS та CSRF та способів боротьби з ними.
Я додав декілька коротких фрагментів статті нижче, якщо їхня стаття була знята в автономному режимі / їхній веб-сайт знизився.
Місцеве зберігання
Проблеми:
Веб-сховище (localStorage / sessionStorage) доступне через JavaScript в одному домені. Це означає, що будь-який JavaScript, що працює на вашому веб-сайті, матиме доступ до веб-сховища, і через це може бути вразливим для атак міжсайтового сценарію (XSS). XSS в двох словах - це тип вразливості, коли зловмисник може вводити JavaScript, який працюватиме на вашій сторінці. Базові XSS-атаки намагаються ввести JavaScript через введення форми, де зловмисник надсилає попередження ("Ви зламані"); у форму, щоб побачити, чи працює він у веб-переглядачі та чи можуть його переглядати інші користувачі.
Профілактика:
Для запобігання XSS загальною відповіддю є уникнення та кодування всіх ненадійних даних. Але це далеко не повна історія. У 2015 році сучасні веб-додатки використовують JavaScript, розміщений на CDN або за межами інфраструктури. Сучасні веб-програми включають сторонні бібліотеки JavaScript для тестування A / B, аналіз воронки / ринку та рекламу. Ми використовуємо менеджери пакетів, як Bower, для імпорту коду інших людей у наші програми.
Що робити, якщо порушено лише один із сценаріїв, якими ви користуєтесь? Зловмисний JavaScript може бути вбудований на сторінку, і Веб-зберігання порушено. Ці типи XSS-атак можуть отримати веб-сховище кожного, хто відвідує ваш сайт, без їх відома. Ймовірно, тому група організацій радить не зберігати нічого цінного або довіряти будь-якій інформації у веб-сховищі. Сюди входять ідентифікатори та маркери сеансу.
Як механізм зберігання даних, Web Storage не застосовує жодних захищених стандартів під час передачі. Той, хто читає Веб-сховище та використовує його, повинен зробити належну ретельність, щоб переконатися, що вони завжди надсилають JWT через HTTPS та ніколи не HTTP.
Печиво
Проблеми:
Файли cookie, коли вони використовуються зі знаком cookie HttpOnly, недоступні через JavaScript і не захищені від XSS. Ви також можете встановити прапор захищеного файлу cookie, щоб гарантувати, що файл cookie надсилається лише через HTTPS. Це одна з головних причин того, що файли cookie раніше використовувались для зберігання жетонів або даних сеансу. Сучасні розробники не вагаються використовувати файли cookie, оскільки вони традиційно вимагають збереження стану на сервері, тим самим порушуючи RESTful кращі практики. Файли cookie як механізм зберігання не вимагають збереження стану на сервері, якщо ви зберігаєте JWT у файлі cookie. Це тому, що JWT інкапсулює все, що потрібно для обслуговування сервера.
Однак файли cookie вразливі до атак різного типу: підробка між запитами на веб-сайті (CSRF). Напад CSRF - це тип атаки, який виникає, коли шкідливий веб-сайт, електронна пошта чи блог змушує веб-браузер користувача здійснити небажану дію на надійному веб-сайті, на якому користувач наразі має автентифікацію. Це експлуатація того, як браузер обробляє файли cookie. Файл cookie може бути надісланий лише тим доменам, у яких це дозволено. За замовчуванням це домен, на який початково встановлено файл cookie. Файл cookie буде надісланий для запиту незалежно від того, перебуваєте ви на galaxies.com чи hahagonnahackyou.com.
Профілактика:
Сучасні браузери підтримують SameSite
прапор на додаток до HttpOnly
таSecure
. Мета цього прапора - запобігти передачі файлів cookie у запитах між веб-сайтами, запобігаючи багатьом видам атаки CSRF.
Для веб-переглядачів, які не підтримують SameSite
, CSRF можна запобігти за допомогою синхронізованих шаблонів жетонів. Це звучить складно, але всі сучасні веб-рамки підтримують це.
Наприклад, AngularJS має рішення про підтвердження того, що файл cookie доступний лише для вашого домену. Прямо з документів AngularJS:
Під час виконання запитів XHR служба $ http зчитує маркер із файлу cookie (за замовчуванням XSRF-TOKEN) і встановлює його як заголовка HTTP (X-XSRF-TOKEN). Оскільки тільки JavaScript, який працює на вашому домені, може читати файли cookie, ваш сервер може бути впевнений, що XHR прийшов з JavaScript, що працює на вашому домені. Ви можете зробити цей захист CSRF без громадянства, xsrfToken
додавши заяву JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Використовуючи захист CSRF рамки веб-додатків, файли cookie є надійними для зберігання JWT. CSRF можна також частково запобігти, перевіривши заголовок HTTP Referer та Origin у своєму API. Атаки CSRF матимуть заголовки Referer та Origin, які не пов'язані з вашою програмою.
Повну статтю можна знайти тут:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Вони також мають корисну статтю про те, як найкраще розробити та впровадити JWT, що стосується самої структури маркера:
https://stormpath.com/blog/jwt-the-right-way/