原创

JWT实现原理


传统token认证和jwt区别

- 基于传统token认证

用户登录,服务端给用户返回token,并将token保存在服务端
用户将token存入浏览器 cookie,用户下次访问时,请求带上cookie
服务端从cookie中获取token后,去数据库或redis中获取token进行校验

- 基于jwt认证

用户登录,服务端给用户返回token,服务端不保存token
用户将token存入浏览器 cookie,用户下次访问时,请求带上cookie
服务端获取token后,做token校验

优点:相较于传统token认证相比,无需在服务端保存token

jwt实现原理

1. 用户提交用户名和密码给服务端,如果登陆成功,使用jwt创建一个token,并返回给用户

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcm
YiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzM
zBlIiwiaWF0IjoxNDc2NDI3OTMzfQ.PA3QjeyZSUh7H0GfE0vJaKW4LjKJuC3dVLQiY4hii8s

注意:jwt生成的token是由三段字符串组成,并用 . 连接起来

第一段字符串: Header 头部,内部包含加密算法(HS256)和token类型(JWT)
json转化成字符串,然后做base64加密

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

第二段字符串: Payload 负载,自定义值
json转化成字符串,然后做base64加密

   {
	"id" : "12345",
    "name" : "bai",
    "exp" : 1441594722  # 超时时间
   }

第三段字符串Signature 签名

第一步:将第1,2部分密文拼接起来
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ 
第二步:对前两部分密文进行HS256加密 + 加盐
第三步:对HS256加密后的密文再做base64加密 

2. 用户下次访问时,需要携带token,后端对token进行校验

第一步:获取token

第二步:对token进行切割(按 . 分成三部分)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ
PA3QjeyZSUh7H0GfE0vJaKW4LjKJuC3dVLQiY4hii8s

第三步:对第二段进行base64解密,获取Payload信息,检测token是否已经超时

{
	"id" : "12345",
	"name" : "bai",
	"exp" : 1441594722  # 超时时间
 }

第四步:把第1,2段拼接,再次进行HS256加密

第一步:将第1,2部分密文拼接起来 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ 
第二步:对前两部分密文进行HS256加密 + 加盐

密文 = base64解密(PA3QjeyZSUh7H0GfE0vJaKW4LjKJuC3dVLQiY4hii8s)  # 第三段
如果相等,表示token未被修改过(认证通过)
Jwt

评论