HTTP 的 Cookie
HTTP 的 Cookie 机制要用到两个字段:响应头字段 Set-Cookie 和请求头字段 Cookie。
Cookie 可以设置多个 key-value 对, 响应头中可以设置多个 Set-Cookie 字段,请求头Cookie后面可以设置多个键值对,用分号隔开:
Expires 和 Max-Age
Cookie 的有效期可以使用 Expires 和 Max-Age 两个属性来设置。
- Expires 表示绝对有效时间,即截止时间,俗称“过期时间”
- Max-Age 表示相对有效时间,单位是秒,浏览器用收到报文的时间点加上 Max-Age 就可以得到失效的绝对时间。
Expires 和 Max-Age 可以同时出现,两者的失效时间可以一致,也可以不一致,但浏览器会优先采用 Max-Age 计算失效期。
Domain 和 Path
我们需要设置 Cookie 的作用域,让浏览器仅发送给特定的服务器和 URL,避免被其他网站盗用。
“Domain” 和 “Path” 指定了 Cookie 所属的域名和路径,浏览器在发送 Cookie 前会 从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性。如果不满足条件,就不会在请求头里发送 Cookie。
HttpOnly
属性 “HttpOnly” 会告诉浏览器,此 Cookie 只能通过 HTTP 协议传输,禁止其他方式访问,浏览器的 JS 引擎就会禁用 document.cookie
等一切相关的API,防止脚本攻击。
SameSite
另一个属性 “SameSite” 可以防范“跨站请求伪造” (XSRF)攻击,设置成 “SameSite=Strict” 可以严格限定 Cookie 不能随着跳转链接跨站发送,而 “SameSite=Lax” 则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。
HTTP 的缓存控制
一般的话,浏览器拿到响应内容后,会将响应内容缓存到磁盘文件中。
至于浏览器是不是直接使用本地磁盘缓存中的内容,取决于缓存策略。浏览器也会有缓存清理策略,定期的清理磁盘中的缓存页面。
缓存策略:no-store
不允许客户端使用缓存,用于某些变化非常频繁的数据,例如秒杀页面。
缓存策略:max-age
时间的计算起点是响应报文的创建时刻,而不是客户端收到报文的时刻,也就是说包含了在链路传输过程中所有节点所停