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生成自签名证书:
- 安装
mkcert后生成证书:mkcert 127.0.0.1 - 后端启用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);
- 前端开启HTTPS访问(如vue-cli添加
--https参数启动),此时secure: true和sameSite: 'None'即可生效
内容的提问来源于stack exchange,提问作者KH A
相关产品推荐
相关产品推荐

