传统token认证和jwt区别
-
基于传统token认证
用户登录,服务端给用户返回token,并将token保存在服务端 用户将token存入浏览器 cookie,用户下次访问时,请求带上cookie 服务端从cookie中获取token后,去数据库或redis中获取token进行校验
-
基于jwt认证
用户登录,服务端给用户返回token,服务端不保存token 用户将token存入浏览器 cookie,用户下次访问时,请求带上cookie 服务端获取token后,做token校验 优点:相较于传统token认证相比,无需在服务端保存token
jwt实现原理
-
用户提交用户名和密码给服务端,如果登陆成功,使用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加密
-
用户下次访问时,需要携带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未被修改过(认证通过)