Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:设置cookie和响应是否处理原子操作?_Javascript_Reactjs_Cookies_Jwt_Csrf - Fatal编程技术网

JavaScript:设置cookie和响应是否处理原子操作?

JavaScript:设置cookie和响应是否处理原子操作?,javascript,reactjs,cookies,jwt,csrf,Javascript,Reactjs,Cookies,Jwt,Csrf,我使用以下模式进行CSRF保护的无状态身份验证: 为每个处理的请求生成新的JWT cookie 为每个处理的请求生成新的CSRF令牌。将其包含在JWT令牌和响应头中 断言请求头中的CSRF令牌与JWT令牌中的CSRF令牌匹配 客户端代码从每个响应中提取CSRF令牌,并将其包含在每个请求中。新令牌存储在浏览器会话存储中。我有点担心cookie和令牌在客户端不同步 考虑以下简化示例 return axios.post(uri, payload, { headers: { 'X-CSRF-TOKEN'

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

  • 为每个处理的请求生成新的JWT cookie
  • 为每个处理的请求生成新的CSRF令牌。将其包含在JWT令牌和响应头中
  • 断言请求头中的CSRF令牌与JWT令牌中的CSRF令牌匹配
  • 客户端代码从每个响应中提取CSRF令牌,并将其包含在每个请求中。新令牌存储在浏览器会话存储中。我有点担心cookie和令牌在客户端不同步

    考虑以下简化示例

    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使用过时的令牌值?

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

    当没有收到CSRF令牌时,您的后端应该返回403,因此您可以实现“重试”逻辑来解决问题