# Chrome80的Cookie SameSite问题
Chrome从版本80开始将SameSite
默认设置为Lax
,将默认只发送GET类请求的第三方Cookie,其它请求比如POST(包括img标签的src)不再发送第三方Cookie。也就是说SuccBI的报表嵌入到第三方系统时不能很方便的单点登录了,其它系统嵌入到SuccBI也类似,解决方法如下:
# 方法1:配置https和SameSite=None
前提:跨域的双方系统都使用https协议
如果使用nginx作为服务器代理,在nginx配置中添加
proxy_cookie_path / "/; secure; SameSite=None;";
说明: /
为服务器上下文,如果部署SuccBI的系统上下文为/bi
,请修改为proxy_cookie_path /bi/ "/bi/; secure; SameSite=None;";
。
如果单独使用tomcat,则需要添加:
- 配置Tomcat Cookie的
Secure
属性,并设置SameSite
属性值为None
,可参考Tomcat安全性设置 - 进入系统设置>安全设置>安全等保,勾选
Cookie安全传输
,设置SuccBI Cookie的Secure
属性 - 将
Cookie SameSite
设置为关闭
,设置SuccBI Cookie的SameSite=None
属性
- 配置Tomcat Cookie的
配置完成后,再次发起跨域请求,响应头的Set-Cookie中增加了Secure
及SameSite=None
属性
# 方法2:反向代理所有服务到同域下
通过反向代理,把各个系统代理到同一个域下,这样就不会有跨域的问题。
TIP
- 为了简化反向代理部署流程,部署的系统需要带上下文根
- 代理以后所有的网络流量都要通过负载均衡,会占用系统带宽
# 方法3:禁用Chrome的SameSite
WARNING
- chrome91版本已经无法通过这种方式来修改设置 (opens new window)。
- 这个方法也不通用,建议使用方法1或者方法2
- 在Chrome地址栏输入
chrome://flags
,进入实验功能设置 - 将
SameSite by default cookies
修改为Disabled
后,点击下方的Relaunch
重启Chrome即可
# 方法4:使用其他浏览器
更换80版本以下的Chrome,或其他未限制SameSite
的浏览器
# SameSite配置问题解答
# 配置SameSite仍旧无法正常登录访问
问题分析:
请打开浏览器开发者工具(F12)>应用>存储>Cookie,查看是否有设置上cookie:
这里如果没有显示有名为
JSESSIONID
的cookie,则说明登录时候没有设置上Cookie,然后进行下一步。浏览器开发者工具>网络中查找浏览器接收到
Set-Cookie
的响应头(通常为向SuccBI发送的第一个请求中包含):浏览器会通过这个感叹号来提示什么原因导致无法正确的设置Cookie。通常情况有:
Cookie设置了Secure属性,而发出的请求使用的是
http
,改为使用https
请求即可。如果接收到响应头设置如下:
Set-Cookie: JSESSIONID=B4F779251E9A39AA7D9B025296142C81; Path=/; secure; SameSite=None; HttpOnly; SameSite=Strict
响应头中有两次对于SameSite的描述,第一个使用
proxy_cookie_path
针对nginx
进行的设置,后一个是被代理服务器(比如tomcat)
的设置,浏览器会默认使用后一个。被代理服务器设置SameSite=Strict
导致跨域情况下不会设置Cookie。解决方式:- 如果被代理服务器不默认设置SameSite,建议将配置都放到nginx代理中统一配置。
- 如果被代理服务器默认有设置SameSite,就只能针对被代理的所有服务器分别都配置SameSite=None。