node的express-session设置sameSite和secure不生效且session丢失

在Node.js环境中,配置express-session处理跨域请求时,需设置sameSite为none和secure为true。但这样可能导致session丢失,解决方案是启用HTTPS协议,设置cookie的secure属性为auto,并配置express的trustproxy以使secure设置生效。这样确保了安全性并允许跨站cookie传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题

一般在node环境里,设置允许跨域请求需要配置sameSitesecure的值,但以下配置往往不生效,存在session在传递时丢失情况。

const express = require('express')
const session = require('express-session');

const app = express();

app.use(session({
	cookie: {
		sameSite: 'none',
		secure: true
	}
}));

2.问题分析

  1. Samesite属性允许服务器设定一则cookie不随着跨站请求一起发送。当值设为None时意味着浏览器会在跨站和同站请求中均发送cookie,设置该值必须设置Secure属性!!!
  2. Secure属性用于设置cookie是否被https传输。当值设置true网站需要启用 https协议,http访问的站点将不会设置cookie。另外,配置secure值为true需要express设置trust proxy
  3. Secure属性在 express 设置特殊值auto可以自动和确定的连接的安全性相匹配。

3.解决如下

1.网站配置 https协议
2.cookie配置 sameSite 属性值为nonesecure 属性值为auto
3.配置express值trust proxy

const express = require('express')
const session = require('express-session');

//	网站需要https协议,需要开发者单独处理

const app = express();

//	配置该属性将使secure值设为true生效
app.set('trust proxy', 1);	

app.use(session({
	cookie: {
		//	允许跨站和同站请求中均发送cookie
		sameSite: 'none',
		//	“auto”设置自动和确定的连接的安全性相匹配
		secure: ‘auto’
	}
}));

4. 参考

  1. express 详细配置信息请参考这里
  2. SameSite 属性允许服务器设定一则 cookie 不随着跨站请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击(CSRF)。
属性值描述
Strict这意味浏览器仅对同一站点的请求发送 cookie,即请求来自设置 cookie 的站点。如果请求来自不同的域或协议(即使是相同域),则携带有 SameSite=Strict 属性的 cookie 将不会被发送。
Lax意味着 cookie 不会在跨站请求中被发送,如:加载图像或 frame 的请求。但 cookie 在用户从外部站点导航到源站时,cookie 也将被发送(例如,跟随一个链接)。这是 SameSite 属性未被设置时的默认行为。
None这意味着浏览器会在跨站和同站请求中均发送 cookie。在设置这一属性值时,必须同时设置 Secure 属性,就像这样:SameSite=None; Secure
  1. Secure 属性是一个带有安全属性,值为true时 cookie 只有在请求使用 https: 协议(localhost 不受此限制)的时候才会被发送到服务器。以阻止中间人攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值