Cookie的httponly和samesite属性
什么是Cookie?
背景:HTTP协议本身是无状态的。什么是无状态呢,就是服务器本身无法判断用户身份。Cookie实际上是一小段文本信息(key-value格式)。客户端向服务端发起请求,如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个Cookie。客户端的浏览器就会把此Cookie保存起来。当浏览器再次请求该网站时,浏览器把请求的网址连同该Cookie一并提交给服务器,服务器检查Cookie,以此来辨别用户状态。
cookie使用过程:
- 浏览器向服务器发起请求
- 服务器响应时,会发送Set-Cookie响应头;浏览器会把这个头写入Cookie。
- Cookie到期前,浏览器发送该域下的所有请求,都会带上这个Cookie
httponly
背景:XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。
解释:指定该Cookie无法通过JavaScript脚本拿到,主要是Document.cookie属性。
作用:Cookie无法通过js脚本拿到。 防止了XSS攻击,窃取Cookie内容。给Cookie设置httponly可增加Cookie的安全性。
httponly的使用:response.setHeader("Set-Cookie","deniro=1; Path=/;Domain=www.test.com;" + "Max-Age=30;HTTPOnly");
samesite
背景:防止 CSRF攻击(CSRF 攻击:往往用来存储用户的身份信息,恶意网站可以设法伪造带有正确 Cookie 的 HTTP 请求)和用户追踪。
解释:Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。
Samesite的值:
Strict:
最为严格,完全禁止第三方Cookie,跨站点时,任何情况下都不会发送Cookie。
Set-Cookie: CookieName=CookieValue; SameSite=Strict;注:该规则过于严格,可能给用户造成非常不友好的体验。比如当前网页有一个GitHub链接,用户点击跳转就不会带有GitHub的Cookie,都是未登录状态。
Lax:
规则稍稍放宽,大多数情况下也是不发送第三方Cookie,但是导航到目标网址的GET请求除外(链接,预加载请求,GET 表单)。
Set-Cookie: CookieName=CookieValue; SameSite=Lax;None:
Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
有效设置:
Set-Cookie: widget_session=abc123; SameSite=None无效设置:
Set-Cookie: widget_session=abc123; SameSite=None; Secure