(一)JsonWebToken是什么?
JSON Web Token 是一个开放标准协议,它定义了一种“紧凑”和“自包含”的方式,它用于各方之间作为JSON对象安全地传输信息。
紧凑:数据量较少,并且能通过url参数,http请求提交的数据以及http header的方式来传递。
自包含:这个串可以包含很多信息,比如用户ID,订单号ID等,如果被其他人拿到该信息,也就可以拿到关键业务信息。
(二)优点:
1. 可以适用于分布式的单点登录场景。
2. 可以使用跨域认证解决方案。
3. jwt实现自动刷新token的方案。
Token在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。
(三)基本原理
客户端 账号密码登录 请求 登录的接口
登录成功 服务器 用签名密钥 生成 JWT ==> JWT返回客户端
客户端 再一次 请求服务端 其他接口 请求头带上JWT
服务端 验证 JWT有效性后 对客户端作出相应的响应
客户端 服务器
1.Post 登录(用户名/密码)
------------------------------------------------------------------------>>>
2.生成JWT
<<<------------------------------------------------------------------------
3.返回JWT给客户端
4.再次访问服务器,请求头带着JWT
------------------------------------------------------------------------>>>
5.检查JWT,获取用户信息
<<<------------------------------------------------------------------------
6..向客户端发送响应
(四)基本数据结构
1.基本的JWT的数据结构 XXXXXXXXX.XXXXXXXXXXX.XXXXXXXXX
由三部分组成的,中间使用 . 分割
Header(头部).PayLoad(负载).Signature(签名)
(1)Header
Header部分是一个JSON对象,描述JWT的 元数据
{ "typ": "JWT", "alg": "HS256" }
alg属性表示签名的算法,默认是 HMAC SHA256 (缩写为:HS256);
typ属性表示这个令牌(token)的类型为JWT,最后将上面的JSON对象使用 Base64URL的算法转成字符串。
(2)Payload
Payload部分也是一个JSON对象,用来存放实际需要传递的数据,官方提供了7个字段
iss(issuer): 签发人
exp (expiration time): 过期时间
sub (subject): 主题
aud (audience): 受众
nbf (Not Before): 生效时间
iat (Issued At): 签发时间
jti (JWT ID): 编号
ayload中文含义是载荷,它可以理解为存放有效信息的地方。这些有效信息一般包含三个部分
标准中注册的声明:(就是官方提供的7个字段)。
公共的声明:公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但是不建议添加敏感信息,因为该部分在客户单可解密。
私有的声明:私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,该部分信息可以理解为明文信息。
(3)Signature
Signature 是对前面两部分的签名,防止数据被篡改。
签名原理:
Header和payload对应的json结构进行base64 编码后
得到的两个串 用英文句点号拼接起来的,
根据header里面的alg指定的前面算法(默认算法是 HMAC SHA256)生成出来的。