Если вам действительно необходим такой тип безопасности, вы можете объединить токен JWT с безопасным (= куки-файлы, разрешенные к отправке только через https) cookie-файл только для http, и хранить в нем своего рода маркер запроса, который отправляется на каждый запрос.
Вы можете прочитать Где хранить ваши JWT - файлы cookie и веб-хранилище HTML5 , который охватывает тему и объясняет преимущества и недостатки локального хранилища по сравнению с файлами cookie для JWT.
Файлы cookie только для HTTP не могут быть прочитаны с помощью скриптов JavaScripts (и, следовательно, не украдены) и, следовательно, защищены от атак XSS. А атакам на основе CSRF не удается получить токен JWT (поскольку он отправляется через заголовки).
Таким образом, в атаках на основе XSS не будет маркера на основе файлов cookie, а в запросе на основе CSRF не будет маркера JWT, необходимого для аутентификации пользователя. Маркер cookie может быть создан при входе в систему, поэтому он привязан к пользователю, который входит в систему на этом компьютере.
Конечно, вы также можете перевернуть его и получить JWT в защищенном коке и токен анти-запроса в качестве заголовка.
Конечно, вы все равно можете украсть файл cookie для защиты от подделки с физическим доступом к машине, но это не XSS и не CSRF, и они не могут быть защищены одним приложением, сами машины должны быть защищены от физических атак. .
В качестве альтернативы, не храните токены JWT в локальном хранилище. Когда вы используете поток OpenID, ваше приложение при первой загрузке увидит, что оно не авторизовано, перенаправит вас к провайдеру OpenID, позволит пользователю ввести свои учетные данные и перенаправит их обратно с токеном (или кодом для кода авторизации). поток).
Когда пользователь закрывает браузер и снова открывает сайт, токена больше нет, пользователь будет перенаправлен к поставщику OpenID. Поскольку пользователь все еще вошел в систему, учетные данные не будут запрашиваться, и он будет перенаправлен обратно на страницу, с которой он пришел, включая новый набор токенов. Вам просто нужно сохранить токены в памяти (и обновить их по истечении срока) для текущего сеанса приложения.