Прежде всего, я предполагаю, что бэкэнд управляет входами для предотвращения уязвимостей XSS.
В этот ответ @Les Hazlewood объясняет, как защитить JWT на стороне клиента.
Предполагая 100% TLS для всех сообщений - как во время, так и во все времена после входа в систему - аутентификация с именем пользователя/паролем через базовую аутентификация и получение JWT в обмене является допустимым вариантом использования. Это почти точно, как поток OAuth 2 ( "предоставление пароля" ) работает. [...]
Вы просто установите заголовок авторизации:
Authorization: Bearer <JWT value here>
Но, если говорить, если ваш клиент REST "не доверен" (например, JavaScript-браузер), я бы даже не сделал этого: любое значение в HTTP-ответ, доступный через JavaScript - в основном любой заголовок значение или значение тела ответа - можно обнюхивать и перехватывать через Атаки MITM XSS.
Лучше хранить значение JWT в файле cookie только для безопасного доступа, только для http (cookie config: setSecure (true), setHttpOnly (true)). Это гарантирует что браузер будет:
- только когда-либо передают файл cookie через соединение TLS и
- никогда не делает значение cookie доступным для кода JavaScript.
Этот подход - это почти все, что вам нужно сделать для лучших практик безопасность. Последнее, что нужно для обеспечения защиты CSRF на каждый HTTP-запрос, чтобы гарантировать, что внешние домены инициируют запросы на ваш сайт не может функционировать.
Самый простой способ сделать это - установить только защищенный (но не только HTTP) cookie со случайным значением, например. UUID.
Я не понимаю, почему нам нужен файл cookie со случайным значением, чтобы гарантировать, что внешние домены, инициирующие запросы на ваш сайт, не могут функционировать. Это не освобождает вас от политики одинакового происхождения?
От OWASP:
Проверка заголовка источника
Стандарт заголовка исходного HTTP был введен как метод защиты от CSRF и других междоменных атак. в отличие от referer, источник будет присутствовать в запросе HTTP, который возникает с URL-адреса HTTPS.
Если присутствует заголовок источника, его необходимо проверить для последовательность.
Я знаю, что общая рекомендация от OWASP сама по себе - это Synchronizer Token Pattern, но я не вижу, какие уязвимости остаются в ней:
- TLS + JWT в защищенном httpOnly cookie + политика одинакового происхождения + отсутствие уязвимостей XSS.
ОБНОВЛЕНИЕ 1: Политика одного и того же происхождения применяется только к XMLHTTPRequest, поэтому злой сайт может легко запросить форму POST-запроса, и это нарушит мою безопасность. Требуется явная проверка заголовка заголовка. Уравнение:
- TLS + JWT в защищенном httpOnly cookie + Проверка заголовка заголовка + Нет уязвимостей XSS.