19 | 让我知道你是谁:HTTP的Cookie机制
HTTP协议是无状态的,即上一次请求和本次请求没有任何关系,对于某些事务性需求,如购物,需要记录访问者身份,如果不能记录用户身份信息,每次请求需要验证身份,显然十分不便。
因此,引入了cookie,由服务端对用户信息做标记,客户端后继请求带上该信息,即解决了身份识别的问题。
cookie【RFC6265】是服务器委托浏览器存储在浏览器本地的kv对形式的用户身份标识信息。
工作流程:
- 客户端访问页面,执行登录动作
- 服务端识别用户身份,并在响应报文中用Set-Cookie: key=value + 若干参数设置cookie标识用户身份
- 客户端后继请求消息中带上相关cookie,标识客户端
- 服务端通过cookie识别用户身份,并进行后继动作。
注: cookie不是HTTP标准,它使用的参数之间的分隔符是";“而不是”,"
典型应用:
- 身份识别
- 广告追踪
常用字段:
响应字段,每个Set-cookie带一个键值对,Set-cookie可以用多次
- Set-cookie: x=y
- Set-cookie: a=b
请求字段,一个Cookie带多个键值对
- Cookie:x=y;a=b
Cookie的属性用来控制cookie的生存期和访问控制
生存期包括Max-age,Expires,优先使用Max-age:
- Max-age=10 #注浏览器用收到报文时间+max-age作为cookie的生存期
- Expires= xxx
控制Cookie的可见URI,包括Domain和path2部分,即仅把cookie发给匹配的URI
- Domain= URI
- Path=/
安全性
- HttpOnly 限制cookie只能通过HTTP协议访问,而不能通过JS访问
- SameSite= Strict 禁止跨站访问、 Lax 仅安全方式可以跨站访问
- Secure 仅能用HTTPS传输
课后作业
如果 Cookie 的 Max-Age 属性设置为 0,会有什么效果呢?
- cookie立即失效。
Cookie 的好处已经很清楚了,你觉得它有什么缺点呢?
- 如果没有合理设置有效期,有效范围,安全性,如HttpOnly, SameSite等,则有潜在安全风险。