记一次Cookie的SameSite属性引发的惨案

幻想 2023年09月22日 66 0

项目框架

  • jdk7 + ssh(spring struts hibernate)
  • tomcat8.5
  • Android System Webview(Chromium内核)

背景

公司有个比较老的项目,是由java后端与Android混合应用的开发方式,通过指定Android设备并绑定此app进行销售。此次的问题发生在销售换绑了供应商设备而并未通知开发导致的,之前设备是Android7的设备,这次是Android10的设备。

问题

在一个风平浪静的周末,技术服务突然给我反馈客户系统无法登录,并给了我客户的设备型号、Android系统和用户重现的步骤的视频。跟技服与销售沟通确认的过程就省略了。发现在Android10以上无法登录,而原先Android7的设备是能正常登录的,就找销售拿了在售的新旧两台设备测试。

思考

  1. 不管是Android多少,他们的后台是一样的
  2. 不同Android的Android System Webview版本不一样(样机Android7中的版本是62,样机Android10中的版本是96)
  3. 从以上基本可以得出这是跨域问题

发现

  1. Chrome从51开始引入了一个新的属性:SameSite,主要用于防止CSRF攻击和用户追踪。
  2. SameSite=None: Known Incompatible Clients 从这里得知Chrome从51到66的版本,SameSite=None都会导致拒绝跨域cookie
  3. SameSite的值:
    3.1 None 无论是否跨站都会发送 Cookie。
    3.2 Lax 允许部分第三方请求携带 Cookie。
    3.3 Strict 完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。
  4. Chrome的SameSite默认值是Lax,而Safari的默认值是Strict。

解决

既然已经找到问题所在,解决起来也就比较容易了。由于无法全局一刀切,因此不在全局配置上做cookie配置变更,而是在Filter中做处理。

  1. UserAgent判断Chrome版本>66时,加入SameSite:None
  2. UserAgent判断Chrome版本<=66时,不对SameSite设值

参考

Cookie Samesite简析
SameSite=None: Known Incompatible Clients
chrome80默认SameStie变更
chrome85策略变更

Last Updated: 2024/04/19 17:18:32
[OP](trojan-plus) fatal error: gsl/gsl: No such file or directory linux基础_设置ssh默认远程登录用户名