本文是我在学习JWT过程中一些简单的总结,欢迎大家批评指正。
参考文章
简介
JWT(JSON Web Token)是一种非常简单的规范,可以让我们通过它生成一种特定格式的token,来实现client和server之间的安全传递信息。并且不需要后台来管理这个token,只需要在每次用户请求接口的时候对这个token进行计算即可。我把它理解为是一种特殊的session。
组成
JWT由三部分组成:header、payload、signature。
- header:所使用加密算法。进行base64编码
- payload:一条包括JWT标准定义的几个字段和用户自定义的字段的json信息。然后进行base64编码
- signature:用header里描述的算法,和后台的秘钥,把header和payload的base64字符串拼接完以后的字符串,进行加密
样例
JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.XbPfbIHMI6arZ3Y922BhjWgQzWXcXNrz0ogtVhfEd2o
header:
{
"alg": "HS256",
"typ": "JWT"
}
payload:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
使用方式
- 用户登录
- 后台验证用户名密码以后,签发token,并存储到cokkie
- 用户再次访问
- 后台从cokkie中获取token;验证payload中token签发者、接受者、生效失效时间等;并重新根据header中的算法,把header和payload加密,与signature比对是否一致
- 比对一致以后从payload中获取用户id等自定义信息,进行业务处理,相应用户信息
与普通session存储方式对比
后台无需存储session,但需要每次请求都要重新计算token是否有效。
还有很多,大家可以一起讨论。
注
base64编码是可逆的,所以不要在payload里存放敏感信息。