在开发环境中遇到一个奇怪的现象, 服务器发给浏览器的 Set-Cookies 指令没有生效, 导致无法完成身份验证.
仔细看浏览器的网络调试面板, 可以看到 Set-Cookie 有个明显的告警. 鼠标放上去能看到说明文字如下:
大意是 浏览器屏蔽了这个Set-Cookie 指令, 因为服务器说它的 SameSite 是Lax, 但是它自己却是(非顶级导航的)跨站响应.
每个单词,我都认识, 但串在一起, 这句话让人一脸懵逼.
经过研究, 这种行为是浏览器的一种安全策略.
最严格的 SameSite 为 Strict , 代表只有同站的请求才会加上 Cookie.
最宽松的 SameSite 为 None, 表示任何请求都会加上 Cookie. 但前提是请求必须是HTTPS的安全请求.
最常见的是 Lax, 它表示除了同站请求之外, 顶级导航的跨站请求也发送Cookie.
啥是 "顶级导航的跨站请求" 呢? 直白的说, 就是浏览器的地址栏会发生改变的请求, 例如你在邮箱里点击一个外链, 这个请求就是"顶级导航的跨站请求". 而在 iframe/图片/ajax 里的请求, 都是浏览器背地里干的活, 不会改变地址栏, 这种请求就不算"顶级导航的跨站请求", 因此这些(外站)请求不会携带 Cookie .
而我遇到的场景, 恰恰是 iframe 里的跨站请求没有cookie, 总算找到病根了.
网友评论