文章目录
1.什么是JWT?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
2.什么时候使用JWT?
Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。
3.JWT请求流程(流程图无比重要)
4.JWT的结构
java web token信息是由三部分组成
1.header:(JWT的头部承载两部分信息:token类型和采用的加密算法。)
2.payload:负载
3.signature:签名
JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了JWT字符串
类似下列:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
4.1(第一部分)header(信息)
JWT的头部承载两部分信息:token类型和采用的编码算法。
{
"alg": "HS256",
"typ": "JWT"
}
声明类型:这里是jwt
声明编码的算法:通常直接使用 HMAC SHA256
4.2 (第二部分)payload(负载)
负载里面存放的信息一般有三部分
- 标准中注册的声明
- 公共的声明
- 私有的声明
4.2.1 标准的注册声明(建议,但是不是必须)
类型 | 说明 |
---|---|
iss | jwt的签发者 |
sub | 面向的用户 |
aud | 接受jwt的一方 |
exp | 过期时间戳(过期时间一定要大于当前时间) |
iat | jwt的签发时间 |
jti | jwt的唯一标识,主要用来作为一次性token,从而回避重放攻击 |
4.2.2 公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
4.2.3 私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
4.3 (第三部分)Signature
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload (base64后的)
secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加secret(密匙)组合加密,然后就构成了jwt的第三部分。
密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和进行验证,所以需要保护好。