Token和JWT的相同点和区别
相同点
- 都是访问资源的令牌
- 均可以记录用户信息
- Token和JWT都是无状态的,服务器不需要在后续请求中存储任何会话信息。每个请求都包含必要的信息来验证用户身份和权限
- 都是只有验证成功后才能访问服务端上受保护的资源
区别
- Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效
- JWT:将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据
Token
概念:
令牌, 是访问资源的凭证
Token的认证流程:
- 把用户的用户名和密码发到后端
- 后端进行校验,校验成功会生成token, 把token发送给客户端
- 客户端本身保存token, 再次请求就要在Http协议的请求头中带着token去访问服务端,和在服务端保存的token信息进行比对校验。
特色:
这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息
JWT
概念:
JSON WEB TOKEN 的简写,jwt是token的一种实现方式,它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证,能够使用在RESTFUL接口定义, 也能够使用在普通的web中使用
组成:
JWT包含三个部分: Header头部,Payload负载和Signature签名。由三部分生成token,三部分之间用“.”号做分割。
列如 : xxxxxxxxxxxx.xxxxxxxxxxx.xxxxxxxxxxxx
- Header 在Header中通常包含了两部分:type:代表token的类型,这里使用的是JWT类型。alg:使用的Hash算法,例如HMAC SHA256或RSA. { "alg": "HS256", "typ": "JWT" } 这会被经过base64Url编码形成第一部分
- 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编码后形成第二部分
- signature 使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。例如使用的是HMAC SHA256算法,大致流程类似于: HMACSHA256( base64UrlEncode(header) +"." + base64UrlEncode(payload), secret)这个signature字段被用来确认JWT信息的发送者是谁,并保证信息没有被修改 。
验证流程:
- 在头部信息中声明加密算法和常量, 而后把header使用json转化为字符串
- 在载荷中声明用户信息,同时还有一些其余的内容;再次使用json 把载荷部分进行转化,转化为字符串
- 使用在header中声明的加密算法和每一个项目随机生成的secret来进行加密, 把第一步分字符串和第二部分的字符串进行加密, 生成新的字符串。词字符串是独一无二的。
- 解密的时候,只要客户端带着JWT来发起请求,服务端就直接使用secret进行解密。
特色:
- 三部分组成,每一部分都进行字符串的转化
- 解密的时候没有使用数据库,仅仅使用的是secret进行解密。
- JWT的secret千万不能泄密!!!