You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已开启withCredentials,Axios请求为何未携带refresh token Cookie?

问题分析与解决方案

核心问题定位:SameSite 策略限制

从你的刷新请求头可以看到Sec-Fetch-Site: cross-site,说明这是跨域请求。而你后端设置的refreshToken Cookie配置了SameSite=Strict,这个规则会禁止浏览器在跨域请求中携带该Cookie——但Postman不受浏览器的SameSite策略约束,所以Postman能正常发送Cookie,这是导致问题的最关键原因。

具体排查与修复步骤

1. 调整SameSite属性适配跨域场景

如果前后端是跨域部署,需要修改SameSite的取值:

  • 开发环境可改为Lax(允许部分跨域场景携带Cookie)
  • 生产环境改为None(完全允许跨域携带,但必须搭配secure: true)

修改后端Express的Cookie设置代码:

res.cookie('refreshToken', refreshToken, {
  httpOnly: true,
  secure: process.env.APP_ENV === 'production',
  sameSite: process.env.APP_ENV === 'production' ? 'None' : 'Lax',
  maxAge: 90 * 24 * 60 * 60 * 1000,
  domain: process.env.APP_ENV === 'production' ? 'your-production-domain.com' : undefined // 生产环境需指定域名
});

注意:使用SameSite=None时,必须确保secure: true(仅HTTPS环境生效),否则浏览器会拒绝存储该Cookie。

2. 统一Axios实例的withCredentials配置

检查你是否使用了自定义Axios实例(代码中的_axios),如果是,必须全局开启withCredentials,避免仅在单个请求中设置导致的配置不一致:

// 自定义Axios实例时的全局配置
const _axios = axios.create({
  baseURL: 'your-server-base-url',
  withCredentials: true // 全局开启后,所有请求自动携带Cookie
});

拦截器中刷新token的请求建议使用同一个自定义实例,不要混用全局axios。

3. 验证Cookie的Domain属性

如果前后端域名不同(比如前端是localhost:5173,后端是api.example.com),后端设置Cookie时必须指定domain为后端的根域名,否则浏览器会将Cookie绑定到当前请求的域名,后续跨域请求不会携带:

// 生产环境使用通配符域名,确保子域名也能共享Cookie
domain: process.env.APP_ENV === 'production' ? '.example.com' : undefined

4. 适配本地开发的Secure属性

本地开发通常是HTTP协议,前端设置access_token的secure: true会导致Cookie无法存储,建议根据环境动态调整:

cookies.set("access_token", newAccessToken, {
  path: "/",
  secure: process.env.NODE_ENV === 'production', // 开发环境设为false
  sameSite: "strict",
});

额外验证点

  • 打开浏览器开发者工具(Application -> Cookies),确认refreshToken是否已正确存储,检查其Domain、Path、SameSite、Secure属性是否符合预期。
  • 确认刷新token的请求URL路径正确,避免因路径不匹配导致Cookie的Path规则限制。

内容的提问来源于stack exchange,提问作者Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:15:10