1.问题
一般在node环境里,设置允许跨域请求需要配置sameSite
和secure
的值,但以下配置往往不生效,存在session在传递时丢失情况。
const express = require('express')
const session = require('express-session');
const app = express();
app.use(session({
cookie: {
sameSite: 'none',
secure: true
}
}));
2.问题分析
- Samesite属性允许服务器设定一则cookie不随着跨站请求一起发送。当值设为
None
时意味着浏览器会在跨站和同站请求中均发送cookie,设置该值必须设置Secure
属性!!! - Secure属性用于设置cookie是否被https传输。当值设置
true
网站需要启用 https协议,http访问的站点将不会设置cookie。另外,配置secure值为true
需要express设置trust proxy
。 - Secure属性在 express 设置特殊值
auto
可以自动和确定的连接的安全性相匹配。
3.解决如下
1.网站配置 https协议
2.cookie配置 sameSite 属性值为none
,secure 属性值为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. 参考
属性值 | 描述 |
---|---|
Strict | 这意味浏览器仅对同一站点的请求发送 cookie,即请求来自设置 cookie 的站点。如果请求来自不同的域或协议(即使是相同域),则携带有 SameSite=Strict 属性的 cookie 将不会被发送。 |
Lax | 意味着 cookie 不会在跨站请求中被发送,如:加载图像或 frame 的请求。但 cookie 在用户从外部站点导航到源站时,cookie 也将被发送(例如,跟随一个链接)。这是 SameSite 属性未被设置时的默认行为。 |
None | 这意味着浏览器会在跨站和同站请求中均发送 cookie。在设置这一属性值时,必须同时设置 Secure 属性,就像这样:SameSite=None; Secure |
- Secure 属性是一个带有安全属性,值为
true
时 cookie 只有在请求使用 https: 协议(localhost 不受此限制)的时候才会被发送到服务器。以阻止中间人攻击。