Хотя существует множество способов решения этой проблемы, я предложу метод, при котором клиент отправляет JWT дважды при каждом запросе: в HttpOnly cook ie, а также заголовок Authentication:
.
Давайте рассмотрим, какую проблему безопасности решает каждый из них:
HttpOnly Cook ie
Из документации Mozilla :
Для предотвращения атак с использованием межсайтовых сценариев (XSS) файлы cookie HttpOnly недоступны для JavaScript Document.cook ie API; они отправляются только на сервер.
Это должно снизить риск межсайтового скриптинга; представьте, что на вашем сайте есть XSS - например, я могу добавить <script>some_code{..}</script>
в комментарий, и любой пользователь, просматривающий мой комментарий, запустит мой код в своем браузере. Да, код злоумышленника выполняется внутри зарегистрированного браузера жертвы, но из-за флага HttpOnly
он не может извлечь сессионный повар ie и отправить его злоумышленнику.
Заголовок аутентификации
Проблема с аутентификацией cook ie заключается в том, что браузер автоматически присоединяет их к любому запросу к домену, к которому принадлежит повар ie, это позволяет подделка межсайтовых запросов атаки. Чтобы предотвратить это, обычным способом является отправка токена сеанса (в вашем случае JWT) клиенту другим способом, отличным от cook ie, ie в другом заголовке или, возможно, в скрытом HTML field.
Если клиент может передать вам токен JWT при следующем запросе, это означает, что он смог прочитать предыдущий ответ и не является злоумышленником, выполняющим CSRF-атаку при слепом внедрении.
Общее предложение
Объедините два!
Два метода служат разным целям: файлы cookie HttpOnly защищают от атак XSS, а заголовки аутентификации защищают от атак CSRF.
Есть много способов их объединить, но все они сводятся к тому, чтобы поместить JWT в какой-то заголовок аутентификации и поместить sessionID в команду cook ie, а сервер должен проверить, что они принадлежат одному и тому же сеансу. , Важно: помните, что злоумышленник, достигший XSS на вашем сайте, сможет прочитать JWT, поэтому для повара ie, выполняющего свою работу, повар ie должен быть отдельным значением, которое не содержится в JWT , (ie если злоумышленник может определить правильное значение повара ie, посмотрев на JWT, то повар ie не обеспечивает никакой безопасности).