JSON Web Token的原理及应用
1.token基本介绍
最近了解下基于 Token 的身份验证,很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”
2.session和token的区别
首先,我们知道http是一种无状态协议,它无法记住客户端的登陆状态,比如我们发送了一个请求登录一个网站,当我们再次请求时这个状态就消失了
解决方法是当用户请求登录时,我们在服务端生成一条记录,这个记录可以当前用户的id记录下来并发送给客户端,客户端收到后存在cookie中,在下次再向服务端请求时携带cookie信息,服务端会查找这条记录,如果通过,说明该用户已经登录过,直接返回登录后的页面
上面的方法就是session id,但这种方法对服务器的负荷太大,要储存大量的信息,并且一些大点的网站的后台服务器有多个,session id无法互通
所以我们想可不可以将这个id信息储存在客户端,token就是这种想法的产物,下面是具体流程:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
token分为三个部分header,payload,signature(签名),token值用base64编码
2.1header
header中包含了使用的算法,是否带有签名和加密,主要是说明怎么处理这个token
2.2payload
payload里是token的具体值,下面时标准字段:
- iss:Issuer,发行者
- sub:Subject,主题
- aud:Audience,观众
- exp:Expiration time,过期时间
- nbf:Not before
- iat:Issued at,发行时间
- jti:JWT ID
2.3 signature
这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密钥,这个密码秘密地存储在服务端。
3.token的原理
通过加密算法,我们可以对数据做一个签名,并生成一个密钥
当token有客户端发给服务端时,我们在用相同的算法以及相同的密钥对token进行解密,并和token中的签名对比,如果相同则成功,不同则是伪造的,这样的我们的服务器就不用保存大量的数据了
514/201805/1350514-20180504123326596-1492094512.png)