原文地址
cookie的基本概念
cookie是存储在浏览器的一段数据,由于http协议是无状态的,为了识别用户信息,服务端会把session存储到cookie上,后续的请求会在请求头携带cookie发送给服务端,一般不超过4kb。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
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。不过也可以手动设置删除时间【前端cookie详解】Max-Age: cookie的有效期,单位s 例如
token=123456;
max-age=3600
,表示cookie有效期为3600sDomain: 指定域,例如
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
标记
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
标记的 cookiecookie安全 由于客户端能够直接通过js来操作cookie,这样无疑很容易被不良少年利用,但并不代表不能用,为了提高 cookie 的安全,可以通过以下解决方法
- 设置
HttpOnly
,例如NodeJs的设置方法如下
response.setHeader('Set-Cookie', 'foo=bar;
HttpOnly');
- 给 cookie 设置超期时间,设置
SameSite
值为Strict
或Lax
- 升级站点为 HTTPS