Closed luanguang closed 5 years ago
JWT全称是JSON Web Token
,样子如下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJodHRwOi8vY2FtcHVzLWFkbWluLmxvY2FsL2xvZ2luIiwiaWF0IjoxNTQwNzc4Njk1LCJleHAiOjE1HJ2IjoiOWJlM2ZkZTA2ZGJlY2I3YmUxMDlkYTg1OTY4M2JkMGEwYmQ5Mjg5YiJ9.
m_ifvMaQSSwYHu9-PS1eOREkP6XHC2T2vLkDhfgxw28
由点.
分成三部分,分别代表了JWT的三部分
头部通常是这样子的
{
"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的运行过程
众所周知,HTTP是无状态的。为了能够记录下信息,引入了session和cookie。
cookie是存放在用户客户端(大多是在浏览器里),每次对一些已经登陆过或者浏览过的网页进行访问的时候,都会带上这个cookie,方便服务器识别自己。
cookies具有不跨域名性,你拿京东的cookie给淘宝,淘宝肯定也不认。 假如服务器不支持cookie,也会在url上带上sid用于分别用户。
session则是存放在服务器内存、数据库、文件等当中,是一串字符串,记录了用户的信息。 session的扩展能力不是很好,比如说一个集群有两台机器AB,那么登录A,只在A记录了session,B不能使用。除非让他们同步,或者弄一台机器专门存储session。但是随着信息增加,这就造成了一个大的负担。