JavaScript:set-cookie 和 response 是否处理原子操作?

标签 javascript reactjs cookies jwt csrf

我使用以下模式进行具有 CSRF 保护的无状态身份验证:

  1. 为每个已处理的请求生成新的 JWT cookie
  2. 为每个已处理的请求生成新的 CSRF token 。将其包含在 JWT token 和响应 header 中
  3. 断言请求 header 中的 CSRF token 与 JWT token 中的匹配

客户端代码从每个响应中提取 CSRF token 并将其包含在每个请求中。新 token 存储在浏览器 session 存储中。我有点担心 cookie 和 token 在客户端不同步。

考虑以下简化示例

return axios.post(uri, payload, { headers: { 'X-CSRF-TOKEN': sessionStorage.getItem('X-CSRF-TOKEN') }})
    .then(response => sessionStorage.setItem('X-CSRF-TOKEN', response.headers['X-CSRF-TOKEN']))

浏览器 cookie 更新和响应是否处理给定 JavaScript 事件循环模型的原子操作?或者其他异步 XHR 请求是否有可能在边际时间窗口中对当前 cookie 使用陈旧的 token 值?

最佳答案

事件循环模型允许其他代码在 response => sessionStorage.setItem('X-CSRF-TOKEN', response.headers['X-CSRF-TOKEN']) 之前运行实际执行,因为此回调将在接收 HTTP 响应时排队。同时,由网络事件、计时器或页面上的用户事件触发的其他一些回调可能已排队。

您的后端应该在未收到 CSRF token 时返回 403,因此您可以实现“重试”逻辑来解决您的问题。

关于JavaScript:set-cookie 和 response 是否处理原子操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431559/

相关文章:

javascript - :id:Symbol 的未定义方法 `map'

reactjs - 什么是 onChange={(e) => setName(e.target.value)}?在 React 中

model - Redux 存储中数据可重用计算的最佳实践

php - Android:进行 HTTP 调用时使用 cookie 保持服务器 session

android - 如何在android WebView 客户端中设置cookie

javascript - 为什么当我 setState 时我的 React Hook 没有更新?

javascript - 单击指定 DIV 之外的任意位置时隐藏 DIV

javascript - 在显示页面之前完成所有组件的加载 - React JS

jquery - CORS、Ajax 和 CSRF

javascript - 从服务器读取另一台机器的文件