Cookie
http是无状态的——意味着服务器不知道每一次http请求时用户端的状态情况。
而Cookie的出现,便使得http可以有「状态」。
Cookie的原理大致如下:
- 客户端向服务器发送http请求
- 服务器响应请求,并且在响应标头中设定
Set-Cookie
响应头 - 客户端收到
Set-Coookie
并设置Cookie(需要指出,Cookie的存储形式是键值对,或者又叫字典) - 此后每次客户端发送http请求的时候都在请求头附上设置好的Cookie
大致如图
可以发现,Cookie即可以成为http的「状态」——根据不同的Cookie,服务器可以返回不同的网页内容。
Session
session是一个抽象的概念,它相当于服务器生成一个特别的「加密id」来记录会话,然后将加密id交给客户端,客户端在进行会话时使用这个加密id来证明「这个是之前进行的会话」。
Info
有点绕?可以看看下面这个类比现实的例子:
A:定个接头口号吧,只要下次你和我说「黄河」,我就知道是你。
B:好的。
这样子每次B和A接头的时候都和A说「黄河」,A都能知道是B,不论对方是以什么样子出现的都能认出来。
——有点像一个临时的密码,对吧?
在服务器上记录会话的好处是能够进行更方便的会话管理,比如说服务器主动删除会话,这样不管客户端的加密id是否过期都没办法继续会话。
缺点则是增加了服务器的负担。
JSON Web Token (JWT)
用户登陆网页后,服务器通过生成一个JWT(Token)返回给用户,用户每次带着JWT访问的时候可以通过校验Token令牌来鉴权。
需要知道的是,JWT实际上只有签名而没有加密,它可以防修改但是不能防读取,因为JWT承载数据的payload部分只进行了简单的base64编码。如果你需要用JWT存储敏感信息,最好先进行加密处理。
此外 JWT 是不会存储在服务器上的,这也是其与Session不同的地方:Session 由服务器生成并将信息存储在服务器上,返回客户端 Session id;而 JWT 由服务器生成签名并直接传给客户端。
JWT的特点在于其对传输的数据进行了签名,以达到防止修改的效果。