Token:
资源凭证
,也成为令牌
传统的Token
令牌
,value:userId
(用户信息)Redis
中,返回对应的Token返回给客户端。可以作为请求头传递,或者请求路径传递等
),服务器端接收到该token之后,从redis中查询如果存在的情况下,则说明在有效期内,如果在Redis
中不存在的情况下,则说明过期或者token错误。uuid
(Token),value是userId
Token
放在请求头里带上redis
中验证该Token
是否存在userId
。根据userId
查询数据库用户信息。userId
用户,则说明认证成功,可以访问资源。优点
缺点
Redis
或数据库
存储第三方存储
,那还不如使用Session
JWT:
JSON WEB Token
,是一种流行的跨域认证解决方案。用户信息
加密到Token
里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证Token的正确性,只要正确即通过验证。JWT分3部分 —— Header、Payload、Signature
(1)Header(头) 作用:记录令牌类型、签名算法等 例如:{“alg":“HS256”,“type”,"JWT}
(2)Payload(有效载荷) 作用:携带一些用户信息 例如{“userId”:“1”,“username”:“mayikt”}
(3)Signature(签名) 作用:防止Token被篡改、确保安全性 例如 计算出来的签名,一个字符串
Header(头)
{
Typ=“jwt” —类型为jwt
Alg:“HS256” —加密算法为hs256
}
Payload(有效载荷)
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
Signature(签名)
这段是签证信息,非常非常关键的部分。
这关乎你的这个 Token 是否安全,是否能被人仿造。
一般是对 header (base64后的) 和 payload (base64后的) 这两部分的数据通过 secret(私钥)进行签名后的结果。
所以这个签名算法就非常关键了,常用的有 SHA256 和 HMAC,个人更推荐使用 RSA。
加密流程:
JWT包含三个部分: Header
头部,Payload
负载和Signature
签名。由三部分生成Token
,三部分之间用“.”号做分割。 列如 :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header
声明信息。 在Header中通常包含了两部分:type
:代表token的类型,这里使用的是JWT
类型。alg
:使用的Hash
算法,例如HMAC SHA256
或RSA
。{ “alg”: “HS256”, “typ”: “JWT” } 这会被经过base64Url
编码形成第一部分Payload
Token的第二个部分是荷载信息,它包含一些声明Claim
(实体的描述,通常是一个User信息,还包括一些其他的元数据)Reserved Claims
,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等Plubic Claims
,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
进行解密secret
千万不能丢失优点
缺点
userId
、手机号码
(如果非要放userId,deptId等信息,可采用rsa256
算法加密)rsa256
生成JWTToken
需要查库
验证Token
是否有效JWT
不用查库,直接在服务端进行校验
。因为用户的信息及加密信息在第二部分Payload
和第三部分签证中已经生成,只要在服务端进行校验就行,并且校验也是JWT
自己实现的。