生产环境Firefox未设置Cookie,Chrome正常,求解决办法
问题分析
前后端均部署在Vercel上,登录请求已携带withCredentials: true,Chrome能正常设置Cookie,但Firefox中存储面板看不到Cookie,且控制台提示Cookie缺少Partitioned属性。这是因为Firefox默认启用Total Cookie Protection,会隔离第三方Cookie,当前Cookie配置未适配该规则;同时Chrome也开始要求跨站Cookie添加该属性,避免未来被拦截。
解决方案
1. 给Cookie添加Partitioned属性
修改服务端设置Cookie的代码,在配置项中新增partitioned: true,保留原有安全属性:
export const genTokenAndSetCookie = (userId, res) => { const token = jwt.sign({ userId }, process.env.JWT_SECRET, { expiresIn: "151d", }); res.cookie("jwt", token, { httpOnly: true, maxAge: 151 * 24 * 60 * 60 * 1000, sameSite: "None", secure: true, partitioned: true // 新增属性,适配浏览器分区存储规则 }); return token; };
该属性会指示浏览器将Cookie存储在对应站点的独立分区中,既适配Firefox的Total Cookie Protection,也解决Chrome的警告提示。
2. 确认Vercel的CORS配置正确
确保服务端CORS配置允许携带凭证,且Origin指定为客户端的Vercel域名(不能用*,带凭证时通配符无效):
以Express的cors中间件为例:
const corsOptions = { origin: process.env.CLIENT_URL, // 客户端实际域名,如https://your-client.vercel.app credentials: true }; app.use(cors(corsOptions));
需在Vercel环境变量中正确配置CLIENT_URL为客户端部署地址。
3. 验证Firefox隐私设置
检查Firefox是否开启Total Cookie Protection(默认开启),若手动关闭第三方Cookie拦截会影响功能,但保持默认设置即可,添加Partitioned属性后就能适配默认规则。
原理说明
Firefox的Total Cookie Protection会将不同站点的Cookie分区存储,跨站请求的Cookie若无Partitioned属性,会被隔离或拦截;Chrome也在逐步推行这一标准,控制台警告就是提示需添加该属性避免未来Cookie被拒绝。添加Partitioned属性后,Cookie可在对应站点分区中正常存储读取,同时保留httpOnly、secure等安全属性。
内容的提问来源于stack exchange,提问作者coded_machine

