JWT
JWT
-
JWT(json web token)作为一个开放的标准,通过紧凑(compact)或者包含(self-contained)的方式,定义用于在各方之间发送的安全 josn对象。
-
JWT 可以很好的充当访问令牌和刷新令牌的载体,这时 web双方之间进行安全传输信息的良好方式。只有授权服务器持有签发和验证 JWT的密钥那么就只有授权服务器能验证 JWT的有效以及发送带有签名的 JWT,这就唯一保证了 JWT 载体的令牌的有效和安全性。
-
JWT的一般格式如下所示
eyJhbGciOiJIUzI1NiisinR5cCI6IkpXVCJ9 .eyJuYW11joiY2FuZyB3dSisimV4cCI6MTUxODA1MTElNywdXNlcklkijoMTizNDU2In0 .IV4XZOy0nMpmMX9orv0gqsEMOxXXNQOE680CKkkPQcs
-
它由三部分组成,每部分通过 . 分隔开,分别是
Header(头部)
Payload(有效负荷)
Signature(签名)
1. 头部(Header)
- 通常由两部分组成
- typ:类型,一般为 JWT
- alg:加密算法,通常是 HMAC,SHA256,RSA
{ "alg":"hs256", "typ":"jwt" }
- 这部分 json会由 Base64Url编码,构成 JWT的第一部分
eyJhbGciOJIUzI1N i isinR5cCI6IkpXVCJ9
2. 有效负荷(Payload)
- 是 JWT的第二部分,是用来携带有效信息的载体,主要是关于用户实体和附加元素的声明,组成如下
- Registered claims(注册声明)。这是一组预定的声明,但并不强制要求。他提供了一套有用的,能共同使用的声明。主要由 iss(JWT 签发者),exp(JWT 过期时间),sub(JWT 面向的用户),aud(接受 JWT的一方)等。
- Public claims(公开声明)。公开声明中可以添加任何信息,一般是用户信息或者业务拓展信息等。
- Private claims(私有声明)。由 JWT 提供者和消费者共同定义的声明,既不属于注册声明也不属于公开声明。
- 一般不建议在 Payload中添加任何敏感信息,因为 Base64是对称解密的,这意味着 Payload中的信息是可见的。
{ "name":"cang wu", "exp":"1232323", "userId":"123456" }
- 这部分 JSON会由 Base64编码,构成 JWT的第二部分,
eyJuYW11IjoiY2FuZyB3dSisimV4cCI6MTUxODA1MTE1NywidXNlcklkijoiMTizNDU2In0
3. 签名(Signature)
- 要创建签名,需要编码后的头部,编码后的 Payload,一个密钥,最后通过在头部 alg键值定义加密算法加密生成签名,生成签名的伪代码如下
HMACSHA256( base64Encode(header) + "." + base64Encode(payload) , secret )
- 上述代码中用到的加密算法为 HMACSHA256。密钥保存在服务端用于验证 JWT以及签发 JWT,所以必须由服务端持有,不该泄露出去。
IV4XZ0y0nMpmMX9orv0gqsEMOxXXNQOE680CKkkPQcs
- 这将称为 JWT的第三部分。这三部分通过 “.”分隔,组成最终的 JWT。
https://jwt.io/
https://www.baeldung.com/spring-security-oauth-revoke-tokens
https://www.cnblogs.com/better-farther-world2099/p/9146143.html