博主信息
弘德誉曦的博客
博文
135
粉丝
1
评论
0
访问量
113522
积分:1
P豆:427

cookie之SameSite属性

2020年09月28日 09:42:42阅读数:4017博客 / 弘德誉曦的博客/ 浏览器

cookie之SameSite属性

新版chrome跨域问题:cookie之SameSite属性
原创dominx 最后发布于2020-03-16 16:00:02 阅读数 299 收藏
展开
最近在使用前后端分离开发的时候,遇到了一个诡异的问题,无论如何设置跨域,同一个页面获取到的session始终不一致。

事情的起始大概是这样的:

首先说一下我的业务逻辑,其实就是最常见的登录功能,获取验证码后存入session,用户提交登录时,将用户提交的验证码与从session里获取的验证码进行对比;功能简单,也好理解。可是却遇到了如下一系列问题:

发现问题:

登录界面前后端分离,ajax提交登录时出错。
验证码接口和登录接口的session不一致(跨域问题);
在网上搜索跨域问题,重新设置,问题依旧。
错因排除:

ajax允许cookie(已经设置 xhrFields: { withCredentials: true} )。
springboot尝试设置了多种跨域方法(springboot解决跨域)。
深入分析:

使用其它浏览器(firefox, ie),session却是一致的。。
对比chrome和firefox请求头和响应头:
firefox:首次发起请求后,服务端返回sessionId后,之后每次请求中的cookie都会带上sessionId。

chrome:请求头始终未携带sessionId,甚至整个cookie都为空,导致服务器每次都接受不到sessionId,每次都会重新分 配 一 个 session。

出现转机:
搜索chrome未携带cookie原因,发现cookie新属性:SameSite(chrome77版本后支持) 。对该属性的介绍可以参考这篇文章:SameSite。同时,查看chrome的cookie,由于没有指明SameSite的取值,chrome默认将其设置为了Lax:
在这里插入图片描述

寻找解决方案:

DefaultCookieSerializer(待解决)
翻到不少博客说可以使用DefaultCookieSerializer通过如下代码设置SameSite,然后我的项目中并没有CookieSerializer以及DefaultCookieSerializer这两个类,,原因暂且未知。

@Bean
public CookieSerializer httpSessionIdResolver() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
cookieSerializer.setSameSite(null);
return cookieSerializer;
}
设置CookieProcessor(待解决)
全局搜索SameSite,发现tomcat下的CookieProcessor提供了setSameSiteCookies方法,可是设置后无效,,可能是使用方法不对。

设置response的header(推荐)
通过在后端中设置response.setHeader(“Set-Cookie”, “HttpOnly;Secure;SameSite=None”),响应头可以看到设置的Set-Cookie,但是chrome提示 如下:
在这里插入图片描述

由于设置SameSite为NONE时,需要同时设置secure,不设置secure无效,而设置secure之后,必须使用https来传输cookie。相对来说较为安全。

我的最终方案:
继续查找资料的时候,幸运的找到了github上对于该问题的探究:New cross-site cookie not ‘SameSite’ warning in Chrome

看到其中的一条解决方案: 禁用chrome samesite。方法如下:

  1. 在chrome中打开链接: chrome://flags/#site-isolation-trial-opt-out,搜索samesite
    在这里插入图片描述

2.将上述三个选项禁用(设为disable)后重启chrome,问题解决。

在这里插入图片描述

总结:
存在即合理,SameSite的设计初衷是为了防止CSRF攻击,禁用SameSite实际上并没有解决问题,属于下下策。这里提供一下我的理解,SameSite为了防止CSRF攻击,加强了对cookie的管理,防止用户带着cookie去访问第三方网站,而这又涉及到了跨域问题。然而,我们不可能要求用户像我们一样去禁用新版chrome的SameSite,目前的建议就是在header中设置samesite,即上述的response.setHeader(“Set-Cookie”, “HttpOnly;Secure;SameSite=None”)后,使用https传输cookie。

时间问题文章逻辑可能并不严谨,仅供参考,如发现错误欢迎指正。
————————————————
版权声明:本文为CSDN博主「dominx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38527695/article/details/104899751

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • css中设置英文单词间间距的是word-spacing。word-spacing可以增加或减少字与字间的空白,如【p{word-spacing:30px;}】。
    前的文章中我们介绍了获取文件,检查文件是否可读、可写、可执行的方法。下面本篇文章继续来给大家聊聊文件,看看文件的三个时间:创建时间、修改时间和上次访问时间如何获取。
    对于那些刚开始学习Vue的人来说,方法,计算和观察者间的差异让人有些困惑。尽管经常可以使用它们中的每一个来完成或多或少相同的事情,但是知道它们在哪些方面优于其他的是很重要的。
    前的文章中给大家带来了《PHP数据库学习PDO怎样进行错误处理?》,其中详细的介绍了PHP中PDO错误处理的相关知识,本篇文章我们一起来看一下PHP中怎样设置与获取PDO。希望对大家有帮助!
    本专题通过图文、视频的全面介绍了php cookie的由来,php cookie有哪些,php cookie函数用法以及php cookie实际应用实例,通俗易懂!欢迎php中文网的同学们学习!
    在javascript中,可以使用document对象的cookie来设置、读取或删除cookie,语法“document.cookie="cookieName=Value;expires
    在javascript中想要删除cookie,首先需要找到cookie对应的name对应的值,将其设置为过期;然后设置expire的值为过期日期(即任何过去日期)即可,浏览器会自动删除cookie文件
    在php中cookie与其它程序中没什么两样,cookie都是用来存储信息到客户端,常用用于安全要求不高的一些应用中,如用户登录记住密码类的,下面我来给大家介绍一下php cookie学习笔记
    如果在同一个域下系统会自动将Cookie带着,如果要跨域就需要拼接到URL后面,Cookie是一段不超过4KB的小型文本数据,由一个名称、一个值和其它几个用于控制Cookie有效期、安全、使用范围的可选组成的
    除了大量的bug修复和小的改进,全球的开发人员也将获得一些新的有趣特。名单虽然还没有结束,但是,我们可以查看我们期待的新特。我将准备一系列短篇文章,每一篇都将重点介绍...
    在javascript中,可以利用delete运算符来删除对象的,语法格式“delete 对象.名;”。当删除对象后,不是将该值设置为undefined,而是从对象中彻底清除
    style标签的用法是:1、style标签放在head标签里;2、作为放在元素的开始标签中,每个间使用【;】分开;3、使用color,添加style的字体颜色。

    2021-03-01

    990

    zoom是ie专有,除了设置或者检索对象的缩放比例外,它还有可以触发ie的haslayout、清除浮动、清除margin重叠等作用。
    确定一个控件在窗体上的位置的是Top和Left;top规定元素的顶部边缘,该定义了一个定位元素的上外边距边界与其包含块上边界间的偏移;left规定元素的左边缘,该定义了定位元素左外边距边界与其包含块左边界间的偏移
    在html中,可以使用cellspacing即可去除边框间隙,只需要给表格元素设置“cellspacing="0px"”样式即可。
    在css中,before的用法是在元素内容前插入新内容,只需要给元素设置“元素:before{:值;}”即可。“:before”选择器必须使用content来指定要插入的内容。
    vue计算:在【Vue.js 0.12.8】版本前,只要读取相应的计算,对应的getter就会重新执行。
    访问器是对象的两大一,在日常使用过程中可能会因为变量名称等原因,出现优先级的问题,本文就带大家一起来看一看。
    在css中,可以使用“letter-spacing”设置字间距,语法“letter-spacing:间距值”。
    css设置间距的方法:1、使用letter-spacing设置字间距;2、使用line-height设置行间距,即行高;3、使用margin或padding设置段落间距或元素间的距离。