# 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,则需要添加:

    1. 配置Tomcat Cookie的Secure属性,并设置SameSite属性值为None,可参考Tomcat安全性设置
    2. 进入系统设置>安全设置>安全等保,勾选Cookie安全传输,设置SuccBI Cookie的Secure属性
    3. Cookie SameSite设置为关闭,设置SuccBI Cookie的SameSite=None属性

    系统设置

配置完成后,再次发起跨域请求,响应头的Set-Cookie中增加了SecureSameSite=None属性

响应头

# 方法2:反向代理所有服务到同域下

通过反向代理,把各个系统代理到同一个域下,这样就不会有跨域的问题。

TIP

  1. 为了简化反向代理部署流程,部署的系统需要带上下文根
  2. 代理以后所有的网络流量都要通过负载均衡,会占用系统带宽

# 方法3:禁用Chrome的SameSite

  1. 在Chrome地址栏输入chrome://flags,进入实验功能设置
  2. SameSite by default cookies修改为Disabled后,点击下方的Relaunch重启Chrome即可

    Chrome设置禁用SameSite

# 方法4:使用其他浏览器

更换80版本以下的Chrome,或其他未限制SameSite的浏览器

# SameSite配置问题解答

# 配置SameSite仍旧无法正常登录访问

问题分析:

  • 请打开浏览器开发者工具(F12)>应用>存储>Cookie,查看是否有设置上cookie:

    cookie查看

    这里如果没有显示有名为JSESSIONID的cookie,则说明登录时候没有设置上Cookie,然后进行下一步。

  • 浏览器开发者工具>网络中查找浏览器接收到Set-Cookie的响应头(通常为向SuccBI发送的第一个请求中包含):

    查找Set-Cookie响应头

    浏览器会通过这个感叹号来提示什么原因导致无法正确的设置Cookie。通常情况有:

    1. Cookie设置了Secure属性,而发出的请求使用的是http,改为使用https请求即可。

    2. 如果接收到响应头设置如下:

      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
是否有帮助?
0条评论
评论