Всем привет.
На фронте SPA в связке Vue.js + Vuex + Websocket
В качестве сессий выбраны JWT токены access/refresh. Токены хранятся в cookie с флагом http only и secure.
Мой вариант который на текущий момент работает, но меня терзают сомнения :)
Мы при каждом запросе от клиента к api генерируем csrf токен, в memcached записываем токен в качестве ключа, а csrf в качестве значения. После чего по websocket отправляем наш токен всем socket.id пользователя. Те в свою очередь устанавливают новый токен в Vuex и подписывают им каждый запрос к API. На стороне api проверяем csrf и если что то не так то выдаем ошибку.
Каким образом по максимуму на сколько это возможность защитить клиента от csrf и xss атак в SPA приложении? И имеет ли мой вариант право на жизнь? Учел ли я все? Огромное спасибо за ответ.
WapSter, токен находится в cookie и отправляется куками а не заголовком. Соответственно на сайте хакера если мой пользователь выполнит запрос то куки успешно прикрепятся к запросу, а сам запрос выполнится
smichalev, ты уже используешь secure и раз ты его используешь скорее всего запросы уходят по http2. Тут уже исключаются xss атаки. Если не достаточно настрой CORS.
WapSter, к сожалению даже с флагом http only cookie можно прочитать джаваскриптом с помощью TRACE метода в XmlHttpRequest. Но я так понимаю полностью защитить то что находится на клиенте невозможно... По поводу cors думал, но cors насколько я понимаю опирается на заголовки которые посылает браузер при запросе, их тоже можно подделать. Да и как реализовать защиту cors если планируется в будущем использовать мобильное приложение которое будет получать данные по api?
P.S напишите что нибудь ответом - отмечу как решение
smichalev, по сути да невозможно. Усложни политику access refresh token записывай к примеру ip и уведомляй пользователя, если рефреш токеном воспользовались не стого ip или устройства, внеси ограничение на количество refresh tokens и при переполнении удаляй всей и записывай только новый, на жизненно обращения к api например при работе с бюджетом или просто очень важная бизнес логика запрашивай пароль пользователя. Конечно все это несет массу ограничений для пользователя, но с другой стороны приложение будет более защищенным