cookie的基本概念

75 阅读4分钟

引言

假设服务器有一个接口,通过请求这个接口,可以添加一个管理员

但是,不是任何人都有权利做这种操作

那么服务器如何知道请求接口的人是有权力的呢

答案是:只有登录过的管理员才能做这种操作

可问题是,客户端和服务器的传输使用的是http协议,http协议是无状态的,什么叫无状态,就是服务器不知道这一次请求的人跟之前登录请求成功的人是不是同一个人

image.png

image.png 由于http协议的无状态,服务器忘记了之前的所有请求,它无法确定这一次请求的客户端就是之前登录成功的那个客户端

所以服务器想了一个办法来解决这个问题

它按照下边的流程来认证客户端的身份

  1. 客户端登录成功后,服务器会给客户端一个出入证(令牌token)
  2. 后续客户端的每次请求,都必须要附带这个出入证

image.png 服务器发扬了认证不认人的优良传统,就可以很轻松的识别身份了

但是,用户不能只在一个网站登录,于是客户端会收到来自各个网站的出入证,因此,就要求客户端要有一个类似于卡包的东西,能够具备下面的功能:

  1. 能够放多个出入证。这些出入证来自不同的网站,也可能是一个网站有多个出入证,分别用于不同的地方
  2. 能够自动出示出入证。客户端在访问不同的网站的时候,能够自动的把对应的出入证附带请求发送出去
  3. 正确的出示出入证,客户端不能将肯德基的出入证发给麦当劳
  4. 管理出入证的有效期,客户端能够自动的发现那些已经过期的出入证,并把它从卡内移除。

能够满足上边所有的要求的,就是cookie

cookie类似于一个卡包,专门用于存放各种出入证,并有着一套机制来自动管理这些证件。卡包内的每一张卡片,称之为cookie

cookie

cookie是浏览器中特有的一个概念,它能像浏览器的专属卡包,管理者各个网站的身份信息

每个cookie就相当于属于某个网站的一个卡片,它记录了下面的信息:

  • key:键,比如【身份编号】
  • value:值,比如袁潇的身份编号是【15485626436688ASDHHGCU】,这有点像卡片的条形码,当然,它可以是任何信息
  • domain: 域,表达这个cookie是属于哪个网站的,比如 yuanjin.tech,表示这个cookie是属于 yuanjin.tech 这个网站的
  • path: 路径,表达这个cookie是属于该网站的哪个基路径的,就好比是同一家公司不同部门会颁发不同的出入证。比如 /news,表示这个cookie属于 /news 这个路径的。(后续详细解释)
  • secure: 是否使用安全传输(后续详细解释)
  • expire: 过期时间,表示该cookie在什么时候过期

当浏览器向服务器发送一个请求的时候,它会瞄一眼自己的卡包,看看哪些卡片适合附带指给服务器

如果一个cookie同时满足以下条件,则这个cookie会被附带到请求中

  • cookie没有过期

  • cookie中的域和这次请求的域是匹配的

  • cookie中的path和这次请求的path是匹配的

    • 比如cookie中的path是 /news,则可以匹配的请求路径可以是 /news、/news/detail、/news/a/b/c 等等,但不能匹配 /blogs
    • 如果cookie的path是 /,可以想象,能够匹配所有的路径
  • 验证cookie的安全传输

    • 如果cookie的secure属性是true,则请求协议必须是 https,否则不会发送该cookie
    • 如果cookie的secure属性是false,则请求协议可以是 http,也可以是 https

如果一个cookie满足了上述的所有条件,则浏览器会把它自动加入到这次请求中

具体加入的方式是,浏览器会将符合条件的cookie,自动放置到请求头中,例如,当我在浏览器中访问百度的时候,它在请求头中附带了下面的cookie:

image.png 打马赛克的地方,就是请求头cookie发送到服务器的,它的格式是键=值;键=值;键=值;键=值;...,每一个键值对就是一个符合条件的cookie

cookie中包含了重要身份信息,永远不要把你的cookie泄露给别人,否则他就会拿到你的证件,有了证件就具备了为所欲为的可能性