- JWT(Json Web Token) 的理解
格式Header.Payload.Signature
-
Header
: JWT 元数据, Json 对象,Base64Url
编码{ "alg": "HS256", "typ: "JWT" }
alg
表示Signature
使用的算法,typ
表示令牌类型, JWT 统一写为JWT
-
Payload
: 有效载荷, 包含令牌实际要传输的内容, Json 对象, JWT 规定了 7 个官方字段可供选择(非必选),Base64Url
编码- iss(issuer): 签发人
- exp(expiration time): 过期时间
- sub(subject): 主题
- aud(audience): 受众
- nbf(Not Before): 生效时间
- iat(Issued At): 签发时间
- jti(JWT ID): 编号
另外, 也可以自定义字段
-
Signature
: 签名, 字符串, 防止 JWT 被篡改
使用Header
中指定的算法, 如HS256
表示HMAC SHA256
算法, 再加上只有 JWT 签发方才知道的密钥secret
, 对Header
和Payload
进行签名, 计算公式如下:Signature = HMACSHA256((Base64UrlEncode(Header) + "." + Base64UrlEncode(Payload)), secret)
这里面用到了
Base64Url
编码, 与Base64
编码基本一样. 因为 JWT 可能会放到 URL 中, 所以前者中不能出现+
,/
和=
这 3 个字符. 所以要被替换掉:=
被省略,+
替换成-
,/
替换成_
.
计算出签名后, 按照上面给出的格式将这三个部分拼接成字符串即可.
Payload
仅仅是对 Json 字符串进行Base64Url
编码, 所以其内容相当于是明文. 因此, 严禁在Payload
中传输敏感内容(比如说密码), 如果要通过 JWT 传输敏感内容, 应该对Payload
单独进行加密处理.Signature
用来确保 JWT 没有被篡改,Header
和Payload
相当于是明文, 但是计算签名的过程中加入了密钥secret
, 只有签发者知道, 所以签发者只要用拿到的 JWT 再计算一次签名, 如果得到的结果与收到的 JWT 中的Signature
不一致, 就说明 JWT 被篡改了.JWT 只是作为令牌使用, 证明身份的临时工具(证明你是你)
拿接口调用来举例: 调用方第一次调用接口, 传输username
(全局唯一)和password
, 提供方查询数据库验证身份之后, 用username
生成了一个 JWT 还给调用方.
调用方第二次调用其他接口时, 只需要把 JWT 给提供方, 提供方对 JWT 进行验证即可, 不需要再去后台查数据库了.
-
相关文章
- 02-29SpringSecurity 退出登录/修改密码/重置密码 使JWT的token失效的解决方案
- 02-29using System.Web.Script.Serialization; 引入json所需要的命名空间
- 02-29SpringBoot集成JWT实现token验证
- 02-29JSON Web Token八步设计单点登录系统
- 02-29手机app端扫描二维码登录web端的解决方法,前后端分离,uniapp,基于token
- 02-29Vue 项目 fetch 本地 json 报错 SyntaxError: Unexpected token < in JSON at position 0
- 02-29Start SSO: Token or JWT
- 02-29JWT(Json Web Token)
- 02-29JSON Web Signature 规范解析
- 02-29webpack 打包json文件,报 Unexpected token, expected ";"错误解决方案