В контексте JWT 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-файлы использовались для хранения токенов или данных сеанса. Современные разработчики не решаются использовать куки, потому что они традиционно требовали, чтобы состояние сохранялось на сервере, что нарушает рекомендации RESTful. Файлы cookie как механизм хранения не требуют сохранения состояния на сервере, если вы сохраняете JWT в файле cookie. Это потому, что JWT инкапсулирует все, что нужно серверу для обслуживания запроса.
Однако куки-файлы уязвимы для атак другого типа:
подделка межсайтовых запросов (CSRF). CSRF-атака - это тип атаки
происходит, когда вредоносный веб-сайт, электронная почта или блог
веб-браузер для выполнения нежелательных действий на доверенном сайте, на котором
пользователь в настоящее время аутентифицирован. Это подвиг того, как
браузер обрабатывает куки. Файл cookie может быть отправлен только на домены в
что это разрешено. По умолчанию это домен, который изначально
установить печенье. Файл cookie будет отправлен для запроса независимо от
находитесь ли вы на galaxies.com или hahagonnahackyou.com.
Предупреждение:
CSRF можно предотвратить с помощью синхронизированных шаблонов токенов. это
звучит сложно, но все современные веб-фреймворки имеют поддержку
это.
Например, AngularJS имеет решение для проверки того, что cookie
доступно только вашему домену. Прямо из документов AngularJS:
При выполнении запросов XHR служба $ http считывает токен из
cookie (по умолчанию XSRF-TOKEN) и устанавливает его как заголовок HTTP
(Х-XSRF-ЗНАК). Поскольку только JavaScript, который работает на вашем домене, может
прочитайте куки, ваш сервер может быть уверен, что 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/