讲token需要先复习一下cookie和session。

客户端保存用户信息的方式,也是session实现机制之一。

我们每次打开一个以前打开过的编辑栏,他可能会自动填写我们以前填的内容,这就是cookie机制啦。

但是cookie特别小,一般不超过4kb,所以只存一些用户信息。

session

存在服务端里用于验证客户端身份的,同时也带有一大堆自定义信息,这里就有很多操作了。

客户端访问服务端的时候,就会把这玩意留在服务器上。

不止是账号密码,比如客户端想知道你买了啥,就需要用到session啦。

但是session需要存在服务端上,很费服务端空气。

token

token相当于是进步的session,它不再需要存在服务器上了,只需要双方用算法验证即可。

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。当客户端第一次访问服务端,服务端会根据传过来的唯一标识userId,运用一些算法,并加上密钥,生成一个Token,然后通过BASE64编码一下之后将这个Token返回给客户端,客户端将Token保存起来(可以通过数据库或文件形式保存本地)。下次请求时,客户端只需要带上Token,服务器收到请求后,会用相同的算法和密钥去验证Token。

最简单的Token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器)。

盐:就是我们常见的md5算法啦。

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  • 客户端使用用户名跟密码请求登录
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  • 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者数据库里
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  • 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

增加性能

同样,如果频繁获取该token,服务端就要多次进行计算,也非常浪费资源。

这时候我们就可以引入redis,用于保存token,把重复的token都拦下来!