cookies几个属性的含义
Secure
Set-Cookie: token=en-US; Secure
该属性没有值,属性本身存在就代表设置为安全模式。
即请求必须为安全连接(HTTPS),cookie 才会被保存下来。HTTP 协议下,cookie 无效。
- 劣势: 要求使用安全连接(HTTPS)。在某些情况下,可能会导致一些开发或测试环境无法使用该Cookie。
- 注意事项: 使用Secure属性的前提是确保整个网站都在使用 HTTPS 协议,否则该Cookie 将无法在 HTTP 协议下使用。
缺点:如果网站只通过HTTP协议提供服务,攻击者可能会在不安全的网络环境中截获Cookie。因此,使用Secure属性可能导致在非加密连接上无法使用Cookie,但也确保了在安全连接下的信息传输安全性。
HttpOnly
Set-Cookie: token=abcd; HttpOnly
设置后,只能通过 HTTP 响应报文的 Set-Cookie 来新增或更新 cookie ,客户端无法通过脚本的方式来读写 cookie。
对于敏感信息比如用户凭证,请一定要加上 HttpOnly。如果攻击者成功地实施了 XSS 攻击,会因为无法读取 cookie 而拿不到敏感信息。
HttpOnly值为 true或 false,若设置为true,则不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见,但在发送请求时依旧会携带此Cookie。
- 劣势: 限制了通过脚本(如JavaScript)访问Cookie的能力,这样可能影响某些前端操作或功能。
- 注意事项: 使用HttpOnly是为了防止XSS攻击,但并不是绝对安全,一些高级的攻击仍可能绕过这种防护。
缺点:尽管HttpOnly限制了通过脚本访问Cookie的能力,但如果网站本身存在其他安全漏洞,如XSS攻击,攻击者可能会尝试绕过这一保护。攻击者可能使用其他手段来窃取敏感信息或进行其他恶意行为。
SameSite
Set-Cookie: token=abcd; SameSite=Strict
cookie 在跨域时是否应该被发送。
- Strict:跨域请求严禁携带本站 cookie。
- Lax:默认值。可通过顶级导航的方式并使用 GET 请求发时可以携带(目前我没有通过 demo 实现该效果,或者我们可以将其无限接近于 Strict)。在 Chrome 80 版本之后,Cookie 的 SameSite 由原来的 None 改为了 Lax。
- None:会携带 cookie。但前提是 Secure 设置为 true,即只能在 HTTPS 协议下使用(之前的标准没有这个要求)。
- 劣势: 在某些情况下,可能导致与其他站点的集成或嵌套的问题,需要根据具体情况慎重设置。
- 注意事项: 在旧版浏览器中可能不受支持,需要确保浏览器版本的兼容性。
缺点:在一些需要与其他域名集成的情况下,Strict模式可能导致一些功能失效。攻击者可能尝试通过一些方式绕过SameSite的限制,尤其是在处理旧版本浏览器的情况下,可能存在风险。
HostOnly
在HTTP Cookie的Set-Cookie
头部中,有一个名为HostOnly
的属性。该属性指示浏览器仅在与设置该Cookie的请求的域名完全匹配时才发送该Cookie。换句话说,如果HostOnly
为true
,则Cookie将仅适用于设置它的域名,而不包括其子域名。
这对于提高安全性和隐私性很有用,因为它可以防止Cookie在子域之间传递。例如,如果Cookie的HostOnly
为true
,并且它是在example.com
上设置的,那么它将仅发送到example.com
,而不会发送到subdomain.example.com
。这有助于减少跨站点请求伪造(CSRF)和其他潜在的安全风险。
- 劣势: 在某些场景下,可能会导致子域之间的共享和传递问题。
- 注意事项: 如果涉及到跨子域的场景,需要谨慎考虑是否启用HostOnly属性,以免影响到预期的功能。
缺点:如果网站涉及多个子域,启用HostOnly属性可能导致一些预期之外的问题。攻击者可能尝试通过某些手段利用子域之间的通信来绕过这一限制,特别是在共享认证信息的情况下。