Open yaofly2012 opened 4 years ago
Cookie是服务器存储在客户端的数据(小段文本)。 这是见过最好的描述,你品,你细品。
HTTP是stateless,Cookie是实现HTTP State Management Mechanism。
Cookie
传给给HTTP服务端;Set-Cookie
管理HTTP客户端存储的Cookie;Don't exceed 50 cookies per domain, and don't exceed 4093 bytes per domain
name
和value
是用户自定义的,但是需要都采用US-ASCII
字符集;name
如空格,tab, ) < > @ , ; : \ " / [ ] ? = { }等value
需要转移;
如分号,空格,其他非US-ASCII
字符集的字符。decodeURIComponent
对value
进行转义;name
和value
属性Expires
和Max-Age
Domain
和Path
Secure
和HttpOnly
,SameSite
HttpOnly
防止客户端脚本通过 document.cookie 等方式访问 Cookie,有助于避免 XSS 攻击。Secure
防止 Cookie 在传输过程中被窃取和篡改.
SameSite
可以让 Cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。
Set-Cookie
头cookie
数据,一个Set-Cookie
对应一个cookie数据;;
隔开(其中分号后面是0个或多个空格);Cookie
头;
隔开(其中空格可选,0个或者多个); domain
不能用作安全措施;Cookie并不严格遵循浏览器同源策略,而是同站(SameSite),即主域
一致就可以共享。
document.cookie
表示当前文档能访问的cookie(这也是为啥cookie
熟悉不是在window
对象下)。document.cookie
// 读所有的cookies
allCookies = document.cookie;
// 写单个cookie
document.cookie = newCookie;
document.cookie
作为右值时,则返回当前domain
下可以访问且有效的cookie(key-value对)字符串列表。
"_test_k1=hello1; _test_k3=world3; _test_session=session%20cookie;"
document.cookie
作为左值时,表示对单个cookie进行操作(新增,编辑,删除)。document.cookie
操作cookie挺麻烦的。
document.cookie
倒是很方便在HTTP请求头添加Cookie
头时取值。document.cookie
返回的是所有的cookie列表字符串,如果要读取单个cookie一般有两种方式:
document.cookie
转成对象,再读取。
30-seconds-of-code parseCookie
const parseCookie = str =>
str
.split(';')
.map(v => v.split('='))
.reduce((acc, v) => {
acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim());
return acc;
}, {});
社区也有其他cookie解析库npm cookie
expressjs提供了更加语义化的操作API。
value
进行加密、解密处理(缺点就是影响性能)
再看cookie