token和jwt存在什么区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42117262/article/details/84190998

相同:

都是访问资源的令牌,都可以记录用户的信息,都是只有验证成功后,客户端才能链接服务端

区别:

服务端验证客户端发送的token信息要进行数据的查询操作
Jwt验证客户端发来的token就不用,在服务端使用密钥校验就可以了,不用数据库的查询。

最直观的:token需要查库验证token 是否有效,而JWT不用查库或者少查库,直接在服务端进行校验,并且不用查库。因为用户的信息及加密信息在第二部分payload和第三部分签证中已经生成,只要在服务端进行校验就行,并且校验也是JWT自己实现的。

TOKEN

概念: 令牌, 是访问资源的凭证。

Token的认证流程:

  1. 用户输入用户名和密码,发送给服务器。
  2. 服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。
  3. 客户端自己保存token,后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。

特点:
这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息。

JWT

概念:
JWT是json web token缩写。可以使用在RESTFUL接口定义,也可以使用在普通的web。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

组成:
JWT包含三个部分: Header头部,Payload负载和Signature签名。由三部分生成token,三部分之间用“.”号做分割。 列如 : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

扫描二维码关注公众号,回复: 4150157 查看本文章
  1. Header 声明信息。 在Header中通常包含了两部分:type:代表token的类型,这里使用的是JWT类型。 alg:使用的Hash算法,例如HMAC SHA256或RSA.
    { “alg”: “HS256”, “typ”: “JWT” } 这会被经过base64Url编码形成第一部分

  2. Payload token的第二个部分是荷载信息,它包含一些声明Claim(实体的描述,通常是一个User信息,还包括一些其他的元数据) 声明分三类: 1)Reserved Claims,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等 2)Plubic Claims, 3)Private Claims,交换信息的双方自定义的声明 { “sub”: “1234567890”, “name”: “John Doe”, “admin”: true } 同样经过Base64Url编码后形成第二部分

  3. signature 使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。 例如使用的是HMAC SHA256算法,大致流程类似于: HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret) 这个signature字段被用来确认JWT信息的发送者是谁,并保证信息没有被修改 。

验证流程:

  1. 在头部信息中声明加密算法和常量,然后把header使用json转化为字符串
  2. 在载荷中声明用户信息,同时还有一些其他的内容,再次使用json把在和部分进行转化,转化为字符串
  3. 使用在header中声明的加密算法来进行加密,把第一部分字符串和第二部分的字符串结合和每个项目随机生成的secret字符串进行加密,生成新的字符串,此字符串是独一无二的
  4. 解密的时候,只要客户端带着jwt来发起请求,服务端就直接使用secret进行解密,解签证解出第一部分和第二部分,然后比对第二部分的信息和客户端穿过来的信息是否一致。如果一致验证成功,否则验证失败。

特点:

  1. 三部分组成,每一部分都进行字符串的转化
  2. 解密的时候没有使用数据库,仅仅使用的是secret进行解密
  3. Jwt使用的secret千万不能丢失

例如下面这个例子:

现在有一个接口/viptest只能是vip用户访问,我们看看服务端如何根据Token判断用户是否有效。

普通token版:

  1. 查库判断是否过期
  2. 查库判断时候是VIP

JWT 版本:
假如payload部分如下:
{
“exp”: 1518624000,
“isVip”: true,
“uid”:1
}

  1. 解析JWT
  2. 判断签名是否正确,根据生成签名时使用的密钥和加密算法,只要这一步过了就说明是payload是可信的
  3. 判断JWT token是否过期,根据exp,判断是否是VIP,根据isVip
    JWT版是没有查库的,他所需要的基础信息可以直接放到JWT里,服务端只要判断签名是否正确就可以判断出该用户是否可以访问该接口,当然JWT里的内容也不是无限多的,其他更多的信息我们就可以通过id去查数据库

猜你喜欢

转载自blog.csdn.net/weixin_42117262/article/details/84190998
今日推荐