express-session配connect-mongodb-session 浏览器Cookie失效Postman正常
Postman 不受浏览器同源安全策略约束,所以可以正常收发Cookie,但浏览器会严格执行Cookie安全规范,只要有一项配置不符合要求,就会直接丢弃Set-Cookie响应头、不会在后续请求携带Cookie,按以下步骤逐一修改即可解决:
1. 修正前端fetch请求配置
你当前把跨域携带凭证的参数写错了位置:
credentials、mode都是fetch的顶层配置项,不能放在headers字段里,你写在headers里的Credentials、WithCredentials都是无效自定义字段,浏览器不会识别。
正确的请求写法:
const res = await fetch(`${url}`, { method: 'POST', mode: 'cors', credentials: 'include', // 固定写法,必须放在顶层,首字母小写 headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(inputValue) })
2. 修正后端session Cookie配置
你本地开发使用的是HTTP协议访问服务,但session配置中secure字段被设为true:
secure: true是浏览器强制安全规则,标记为secure的Cookie仅允许在HTTPS协议链路下存储、传输,HTTP环境下浏览器会直接忽略该Cookie。
本地开发阶段将该值设为false,生产环境部署HTTPS后再开启即可,建议用环境变量做判断适配多环境:
app.use(session({ secret: "mny", saveUninitialized: true, cookie: { path: "/", httpOnly: true, // 生产环境建议保持true,避免前端JS读取Cookie引发XSS风险,不影响当前功能 secure: process.env.NODE_ENV === 'production', // 生产环境HTTPS下自动开启,本地开发为false maxAge: 2*24 * 60 * 60 * 1000, sameSite: 'none', }, store: store, resave: false, }))
3. 跨域配置校验
你当前手写的CORS中间件逻辑基本正确,注意一个规则:当Access-Control-Allow-Credentials: true时,Access-Control-Allow-Origin不能配置为通配符*,你现在动态回传请求源req.headers.origin的写法符合要求,保持即可。
额外注意:测试时不要开启浏览器的第三方Cookie拦截功能、不要使用无痕模式访问前端页面,跨域场景下SameSite: none的Cookie在上述模式下可能被浏览器默认拦截。
修改完成后重启后端服务,清除浏览器本地缓存的无效请求记录再测试,Cookie即可正常存储、回传,会话不会重复生成。
内容的提问来源于stack exchange,提问作者Mahanand Yadav
相关产品推荐
相关产品推荐

