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.eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ.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未被修改过(认证通过)
    
发布了20 篇原创文章 · 获赞 3 · 访问量 3577

猜你喜欢

转载自blog.csdn.net/bai1964847519/article/details/104360601