Cookie介绍

背景

  • HTTP协议是无状态协议,无状态是指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息
  • 问题:既然无状态,那完成一套完整的业务逻辑,需要发送多次请求,那么怎么标识这些请求都是同一个浏览器操作呢?

解决方案

  • 当浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识IDresponse一并返回给浏览器
  • 服务器在本地创建一个map结构,专门以key-value存储这个ID标识和浏览器的关系
  • 当浏览器第一次请求后已经分配一个ID,当第二次访问时会自动带上这个标识ID,服务会获取这个标识IDmap里面找上一次request的信息状态且做对应的更新操作;服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是Cookie;服务器创建的那个map结构就是Session
  • cookies由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送
  • Session服务端自己维护的一个map数据结构,记录key-Object上下文内容状态
  • 核心:它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能;浏览器查看多个站点的cookie

cookie的属性

  • Name:名称
    -Value:值
  • Domain:表示当前cookie所属于哪个域或子域下面
  • Expires/Max-age:表示cookie的有效期,是一个时间,过了这个时间,该cookie就失效了
  • Path:表示cookie的所属路径
  • size:大小,多数浏览器都是4000多个字节
  • http-only:表示这个cookie不能被客户端使用js读取到,是不公开的cookieChrom调试器的console中输入document.cookie将得不到标记为HttpOnly的字段)
    -Secure:标记为SecureCookie只应通过被HTTPS协议加密过的请求发送给服务端,从Chrom52和Firefox52开始,不安全的站点(http:)无法使用Cookie的Secure标记

Cookie的缺陷

  • Cookie会被附加在每个HTTP请求中,增加了流量
  • HTTP请求中的cookie是明文传递的,所以安全性成问题,除非用HTTPS
  • Cookie的大小是有限制,对于复杂的存储需求来说不满足
  • Cookie泄露。。。

浏览器允许每个域名所包含的cookie数量

  • 多数浏览器允许最多包含50个,部分浏览器是30或者20
  • 满后会有多种剔除策略,比如LRU(最近最少使用),权重等

Cookie现状

  • Cookie曾一度用于客户端数据的存储,因为当时并没有其他的存储办法而作为唯一的存储手段
  • 现代浏览器开始支持各种各样的存储方式,Cookie渐渐被少用了,新的浏览器API已经允许开发者直接将数据存储到本地,比如localStorage、SessionStorage
  • 参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies

一张图?

Cookie