session无法读取问题解决(cookie浏览器权限)

问题

使用go的 "github.com/gin-contrib/sessions"库对session进行设置并获取时,浏览器拒绝掉请求携带cookie,体现在浏览器上为“被过滤掉的session”,并携带小三角提示符。

基本概念

SameSite

Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。
它有三个值:
Strict:默认设置。完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。
Lax:规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
None:网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

domain

domain表示的是cookie所在的域,默认为请求的地址,如网址为www.test.com/test/test.aspx,那么domain默认为www.test.com。
而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。

path

path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。

解决

了解了基本概念,解决问题就很简单了。在程序中,我既没有设置cookie的path,导致设置cookie和获取cookie的api路径不一致;也没有改变samesite和cookie Secure的值。
解决方法:将domain/paht设置正确(可以加上端口),协议可以不加。
(附加)为了保险起见,我同时也修改了samesite和cookie Secure的值,代码体现如下:

	sess := sessions.Default(ctx)
	sess.Options(sessions.Options{
		Path:     "/",
		MaxAge:   648000,
		Secure:   true,
		SameSite: http.SameSiteNoneMode,
	})

你可能感兴趣的:(go,前端,gin,cookie)