项目框架
- jdk7 + ssh(spring struts hibernate)
- tomcat8.5
- Android System Webview(Chromium内核)
背景
公司有个比较老的项目,是由java后端与Android混合应用的开发方式,通过指定Android设备并绑定此app进行销售。此次的问题发生在销售换绑了供应商设备而并未通知开发导致的,之前设备是Android7的设备,这次是Android10的设备。
问题
在一个风平浪静的周末,技术服务突然给我反馈客户系统无法登录,并给了我客户的设备型号、Android系统和用户重现的步骤的视频。跟技服与销售沟通确认的过程就省略了。发现在Android10以上无法登录,而原先Android7的设备是能正常登录的,就找销售拿了在售的新旧两台设备测试。
思考
- 不管是Android多少,他们的后台是一样的
- 不同Android的Android System Webview版本不一样(样机Android7中的版本是62,样机Android10中的版本是96)
- 从以上基本可以得出这是跨域问题
发现
- Chrome从51开始引入了一个新的属性:SameSite,主要用于防止CSRF攻击和用户追踪。
- SameSite=None: Known Incompatible Clients 从这里得知Chrome从51到66的版本,SameSite=None都会导致拒绝跨域cookie
- SameSite的值:
3.1 None 无论是否跨站都会发送 Cookie。
3.2 Lax 允许部分第三方请求携带 Cookie。
3.3 Strict 完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。 - Chrome的SameSite默认值是Lax,而Safari的默认值是Strict。
解决
既然已经找到问题所在,解决起来也就比较容易了。由于无法全局一刀切,因此不在全局配置上做cookie配置变更,而是在Filter中做处理。
- UserAgent判断Chrome版本>66时,加入SameSite:None
- UserAgent判断Chrome版本<=66时,不对SameSite设值
参考
Cookie Samesite简析
SameSite=None: Known Incompatible Clients
chrome80默认SameStie变更
chrome85策略变更
0