http是无状态的——意味着服务器不知道每一次http请求时用户端的状态情况。

而Cookie的出现,便使得http可以有「状态」。

Cookie的原理大致如下:

  1. 客户端向服务器发送http请求
  2. 服务器响应请求,并且在响应标头中设定Set-Cookie响应头
  3. 客户端收到Set-Coookie并设置Cookie(需要指出,Cookie的存储形式是键值对,或者又叫字典)
  4. 此后每次客户端发送http请求的时候都在请求头附上设置好的Cookie

大致如图

可以发现,Cookie即可以成为http的「状态」——根据不同的Cookie,服务器可以返回不同的网页内容。

Session

session是一个抽象的概念,它相当于服务器生成一个特别的「加密id」来记录会话,然后将加密id交给客户端,客户端在进行会话时使用这个加密id来证明「这个是之前进行的会话」。

Info

有点绕?可以看看下面这个类比现实的例子:

A:定个接头口号吧,只要下次你和我说「黄河」,我就知道是你。

B:好的。

这样子每次B和A接头的时候都和A说「黄河」,A都能知道是B,不论对方是以什么样子出现的都能认出来。

——有点像一个临时的密码,对吧?

在服务器上记录会话的好处是能够进行更方便的会话管理,比如说服务器主动删除会话,这样不管客户端的加密id是否过期都没办法继续会话。

缺点则是增加了服务器的负担。