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

Node.js接口返回Set-Cookie 浏览器无法获取问题求助

var app = express();

app.use(cors())
app.use(session({
name: 'sid',
secret: 'akh999',
saveUninitialized: false,
resave: true,
store: MongoStore.create({
mongoUrl: 'mongodb://localhost:27017/usersList'
}),
cookie: {
secure: false,
sameSite: 'None',
httpOnly: false,
maxAge: 1000 * 60 * 60 * 6,
}
}))

router.post('/', function (req, res, next) {
...
req.session.text = 'xxx'
req.session.user = userName
});

### 前端测试代码
```js
// vue3 
console.log(document.cookie) // 无数据

已尝试的方案

  • Cookie配置设置httpOnly: false, sameSite: 'None'
  • 尝试申请HTTPS证书,本地127.0.0.1无法申请成功
  • 前端axios设置withCredentials: true,后端手动设置Access-Control-Allow-Origin: http://127.0.0.1,但无效

解决方案

1. 修复CORS配置

跨域携带Cookie时,CORS不能使用通配符*,必须精确指定允许的源,同时开启凭证支持:

app.use(cors({
  origin: 'http://127.0.0.1', // 严格匹配前端地址
  credentials: true // 允许携带Cookie等凭证
}))

2. 调整Session的Cookie参数

  • sameSite: 'None'强制要求secure: true(仅HTTPS生效),本地HTTP环境下改为Lax即可:
app.use(session({
  name: 'sid',
  secret: 'akh999',
  saveUninitialized: false,
  resave: false, // 建议设为false,减少不必要的存储操作
  store: MongoStore.create({
    mongoUrl: 'mongodb://localhost:27017/usersList'
  }),
  cookie: {
    secure: false, // HTTP环境下必须设为false
    sameSite: 'Lax', // 本地跨域场景用Lax足够
    httpOnly: false, // 若不需要前端JS读取,可改回true提升安全性
    maxAge: 1000 * 60 * 60 * 6,
    domain: '127.0.0.1' // 明确指定Cookie域名,避免跨域匹配问题
  } 
}))

3. 确保请求携带凭证

前端axios保持withCredentials: true,且请求地址需与后端CORS配置的源一致:

axios.post('http://127.0.0.1:3000/xxx', parameters, { withCredentials: true });

4. 检查浏览器设置

  • 确认浏览器未禁用第三方Cookie(本地跨域属于第三方Cookie范畴),可在浏览器设置中开启允许第三方Cookie
  • 打开开发者工具Application标签,查看Cookies列表是否存在sid,若存在但document.cookie读不到,检查httpOnly是否被误设为true

本地HTTPS临时方案(可选)

若必须使用sameSite: 'None',可通过mkcert生成自签名证书:

  1. 安装mkcert后生成证书:mkcert 127.0.0.1
  2. 后端启用HTTPS:
const https = require('https');
const fs = require('fs');
const options = {
  key: fs.readFileSync('./127.0.0.1-key.pem'),
  cert: fs.readFileSync('./127.0.0.1.pem')
};
https.createServer(options, app).listen(3000);
  1. 前端开启HTTPS访问(如vue-cli添加--https参数启动),此时secure: true和sameSite: 'None'即可生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:23:32