众所周知,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的运行过程
- 通过post请求登录信息
- 与数据库中的账号密码进行对比,配对了则返回用户信息(不带密码)的json字符串
- 与服务器内的密钥进行加密处理返回给用户
- 用户下次登录带上token
- 服务器校验token是否配对过期,成功返回用户信息
遇事不决先重启,重启失败就装机。实在不行……50包邮解君愁
友情提示:垃圾评论一律封号...