一、什么是JWT(what)
- JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息。
- JWT是一个数字签名,生成的信息是可以验证并被信任的。
- 使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对JWT进行签名。
- JWT是目前最流行的跨域认证解决方案
1.1 JWT令牌结构
SON Web令牌以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是:
- Header
- Payload
- Signature
即为: xxxx.yyyy.zzzz
1.1.1 Header
Header通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法(例如HMAC SHA256或RSA)。 例如:
{
"alg": "HS256",
"typ": "JWT"
}
Header会被Base64Url编码为JWT的第一部分。即为:
$ echo -n '{"alg":"HS256","typ":"JWT"}'|base64
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
1.1.2 Payload
Payload是有关实体(通常是用户)和其他数据的声明,它包含三部分:
(1)注册声明
这些是一组预定义的权利要求,不是强制性的,而是建议使用的,以提供一组有用的可互操作的权利要求。其中一些是: iss(JWT的签发者), exp(expires,到期时间), sub(主题), aud(JWT接收者),iat(issued at,签发时间)等。
注意:声明名称都是三个字符
(2)公开声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密。
(3)私有声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
例子:
{ "iat": 1593955943,
"exp": 1593955973,
"uid": 10,
"username": "test",
"scopes": [ "admin", "user" ]
}
Payload会被Base64Url编码为JWT的第二部分。即为:
$ echo -n '{"iat":1593955943,"exp":1593955973,"uid":10,"username":"test","scopes":["admin","user"]}'|base64
eyJ1c2VybmFtZ