Open yaofly2012 opened 4 years ago
突然本地启动的应用通过公司SSO登录后依旧拿不到登录态信息。排查发现保存登录态的cookie增加了Secure属性:
SSO
Secure
set-cookie: ticket=86A24; Max-Age=7775999; Domain=test.com; Path=/;HttpOnly; SameSite=None; Secure
咦?平台团队怎么突然加了Secure属性,并且SameSite=None;又是啥?
SameSite=None;
SameSite
同站: 顶级域名+1相同(即主域相同)的站点(跟端口无关),也叫本方(First-party); 跨站:非同站,也叫第三方(Third-party)。
顶级域名+1
同源:协议(https?)+域名+端口 三者完全相同; 跨域:非同源。
协议(https?)
域名
端口
首先要明白一个页面引用的外部资源(CSS,JS,图片以及通过JS API发送的请求等)可能来自不同的站点。 跟页面不是同站的请求都是跨站请求。 如页面www.example.com/a里引用了图片www.baidu.com/image/dog.png,加载图片的请求就是跨站请求。
www.example.com/a
www.baidu.com/image/dog.png
跨站请求概念是相对的,如图片www.baidu.com/image/dog.png在页面www.example.com/a里是跨站请求,但是在www.baidu.com/a页面里是同站请求。
www.baidu.com/a
SameSite属性就是控制哪些跨站请求可以携带cookie。
CSRF
严格模式,必须同站请求才携带cookie。 如用户访问的页面www.example.com/a里引用了图片www.baidu.com/image/dog.png:
SameSite=Strict
set-cookie
这是浏览器中的默认值。 Cookies允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送,其他情况则同Strict。
Strict
显示的禁止SameSite限制,必须配合Secure(即要使用HTTPS)一起使用(浏览器最后的坚持)。
比较难理解的就是"顶级导航",比如:
<a>
<form>
GET
location.href
window.open()
首先看cookie怎么用的:
cookie
SameSite=Lax
SameSite=None; Secure
CSRF(Cross Site Request Forgery)
解决CSRF问题的一种方案。
登录态cookie需要被跨站访问,所以平台把登录态cookie设置成SameSite=None; Secure。因为本地开发时启动的应用是http协议的,所以无法拿到登录态cookie。
http
Chrome报错错误:
详情~戳~
SameSite=None
FireFox提示:
一、背景
突然本地启动的应用通过公司
SSO
登录后依旧拿不到登录态信息。排查发现保存登录态的cookie增加了Secure
属性:咦?平台团队怎么突然加了
Secure
属性,并且SameSite=None;
又是啥?二、Cookie的
SameSite
属性是啥?2.1 先弄清几个概念
1. 同站(Same Site)和跨站(Cross Site)
同站:
顶级域名+1
相同(即主域相同)的站点(跟端口无关),也叫本方(First-party); 跨站:非同站,也叫第三方(Third-party)。2. 同源(同域)(Same Origin)和跨域(Cross Origin)
同源:
协议(https?)
+域名
+端口
三者完全相同; 跨域:非同源。3. 跨站请求
首先要明白一个页面引用的外部资源(CSS,JS,图片以及通过JS API发送的请求等)可能来自不同的站点。 跟页面不是同站的请求都是跨站请求。 如页面
www.example.com/a
里引用了图片www.baidu.com/image/dog.png
,加载图片的请求就是跨站请求。跨站请求概念是相对的,如图片
www.baidu.com/image/dog.png
在页面www.example.com/a
里是跨站请求,但是在www.baidu.com/a
页面里是同站请求。2.2 干什么?
SameSite
属性就是控制哪些跨站请求可以携带cookie。CSRF
攻击。2.3 语法
三种取值
1. Strict
严格模式,必须同站请求才携带cookie。 如用户访问的页面
www.example.com/a
里引用了图片www.baidu.com/image/dog.png
:SameSite=Strict
的cookie;SameSite=Strict
的set-cookie
会被拒绝2. Lax (relax缩写)
这是浏览器中的默认值。 Cookies允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送,其他情况则同
Strict
。3. None
显示的禁止
SameSite
限制,必须配合Secure
(即要使用HTTPS)一起使用(浏览器最后的坚持)。顶级导航&GET请求
比较难理解的就是"顶级导航",比如:
<a>
的点击;<form>
的GET
方式提交;location.href
;window.open()
方式产生的请求。2.4 怎么用?
首先看
cookie
怎么用的:SameSite=Lax
/SameSite=Strict
;SameSite=None; Secure
;SameSite
默认,跨浏览器的默认行为不一致。 Chrome可以控制三、跟
CSRF(Cross Site Request Forgery)
啥关系?解决CSRF问题的一种方案。
四、再看文档开头提到的问题:
登录态cookie需要被跨站访问,所以平台把登录态cookie设置成
SameSite=None; Secure
。因为本地开发时启动的应用是http
协议的,所以无法拿到登录态cookie。4.1 解决方案
Secure
属性删掉。参考
SameSite
examples