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

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 不受此限制)的时候才会被发送到服务器。以阻止中间人攻击。

猜你喜欢

转载自blog.csdn.net/wzp20092009/article/details/130176509