原文地址
cookie的基本概念
cookie是存储在浏览器的一段数据,因为http协定是无状态的,为了辨认用户信息,服务端会把session存储到cookie上,后续的申请会在申请头携带cookie发送给服务端,个别不超过4kb。通常,它用于告知服务端两个申请是否来自同一浏览器,如放弃用户的登录状态。
<!-- truncate -->
<div className="google-adsense" data-slot="4036845214" />
cookie应用场景
- 会话状态治理(登录状态,购物车,游戏分数)
- 个性化设置(自定义主题)
- 浏览器行为跟踪(跟踪剖析用户行为)
cookie的定义
Set-Cookie: name=value[; expires=date][; max-age=secondes][; domain=domain][; path=path][; secure][; HttpOnly][; SameSite=Lax|Strict]
name: cookie的键,不辨别大小写
value: cookie的值,必须URL编码
Expires: cookie的过期工夫,值是GTM格局的,例如:Sat, 11 Dec 2021 13:06:06 GMT
,默认状况下,浏览器会话完结就会删除cookie。不过也能够手动设置删除工夫
Max-Age: cookie的有效期,单位s 例如 token=123456; max-age=3600
,示意cookie有效期为3600s
Domain: 指定域,例如 domain=blog.1024nav.com
则只会在 blog.1024nav.com
域下无效
Path: 指定门路匹配,不匹配则不会设置cookie,例如 path=/blog
则只会在 /blog
门路下无效
Secure: 只能被 HTTPS 协定加密过的申请发送给服务端,因而能够预防中间人攻打
HttpOnly: cookie只在http传输,客户端无奈通过js document.cookie
获取到
SameSite: Set-Cookie: key=value; SameSite=Strict
,容许服务器要求某个 cookie 在跨站申请时不会被发送,从而能够阻止跨站申请伪造攻打
当初新版浏览器,例如Chorme或Firefox,如果网站不上HTTPS,就无奈应用Cookie的 Secure
标记
<div className="google-adsense" data-slot="6621456589" />
cookie前缀
cookie能够应用自定义前缀,只有在cookie设置 Secure
指令,就能够蕴含 __Secure-
或者 __Host-
前缀,而且 Path 必须为整站 "/"
一个残缺的cookie例子
Set-Cookie: id=u8dd; Expires=Mon, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly
nodejs设置Cookie的办法
response.setHeader('Set-Cookie', ['name=1024nav.com', 'Token=kjjijwe1231dsad']);
客户端操作cookie
通过 document.cookie
属性可创立新的 cookie,也可通过该属性拜访非 HttpOnly
标记的 cookie
<div className="google-adsense" data-slot="5116803225" />
cookie平安
因为客户端可能间接通过js来操作cookie,这样无疑很容易被不良少年利用,但并不代表不能用,为了进步 cookie 的平安,能够通过以下解决办法
- 设置
HttpOnly
,例如NodeJs的设置办法如下
response.setHeader('Set-Cookie', 'foo=bar; HttpOnly');
- 给 cookie 设置超期工夫,设置
SameSite
值为Strict
或Lax
- 降级站点为 HTTPS