众所周知,HTTP是无状态的。为了能够记录下信息,引入了session和cookie。

cookie是存放在用户客户端(大多是在浏览器里),每次对一些已经登陆过或者浏览过的网页进行访问的时候,都会带上这个cookie,方便服务器识别自己。

cookies具有不跨域名性,你拿京东的cookie给淘宝,淘宝肯定也不认。
假如服务器不支持cookie,也会在url上带上sid用于分别用户。

session则是存放在服务器内存、数据库、文件等当中,是一串字符串,记录了用户的信息。
session的扩展能力不是很好,比如说一个集群有两台机器AB,那么登录A,只在A记录了session,B不能使用。除非让他们同步,或者弄一台机器专门存储session。但是随着信息增加,这就造成了一个大的负担。

JWT全称是JSON Web Token,样子如下

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJodHRwOi8vY2FtcHVzLWFkbWluLmxvY2FsL2xvZ2luIiwiaWF0IjoxNTQwNzc4Njk1LCJleHAiOjE1HJ2IjoiOWJlM2ZkZTA2ZGJlY2I3YmUxMDlkYTg1OTY4M2JkMGEwYmQ5Mjg5YiJ9.
m_ifvMaQSSwYHu9-PS1eOREkP6XHC2T2vLkDhfgxw28

由点.分成三部分,分别代表了JWT的三部分

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

头部通常是这样子的

{
  "alg": "HS256",
  "typ": "JWT"
}

对其进行base64编码得到

ew0KICAiYWxnIjogIkhTMjU2IiwNCiAgInR5cCI6ICJKV1QiDQp9

alg是告诉我们所用的签名算法是HS256算法。

负载也是一段json数据,官方定义了7个字段

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

除了官方定义的字段,也可以添加自定义字段。
但是记住,base64并不是加密算法,只是转码,所以不要存放隐私数据在里面。
加密后如下

eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9

签名是将前面我们拼接完成的字符串进行当时定义的算法进行加密,我们定义的是HS256,。在加密的时候我们需要添加一个密钥secret。这个密钥保存在服务器当中。然后得到加密后的一段

m_ifvMaQSSwYHu9-PS1eOREkP6XHC2T2vLkDhfgxw28

这么一段token就这么完成了。

JWT的运行过程

  1. 通过post请求登录信息
  2. 与数据库中的账号密码进行对比,配对了则返回用户信息(不带密码)的json字符串
  3. 与服务器内的密钥进行加密处理返回给用户
  4. 用户下次登录带上token
  5. 服务器校验token是否配对过期,成功返回用户信息

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!