面试题答案
一键面试1. 头部(Header)
- 作用:包含两部分信息,一是令牌的类型,通常为JWT;二是所使用的签名算法,如HMAC SHA256或RSA。它为后续处理JWT提供了必要的元数据,告知接收方如何验证签名。
- 常见内容格式示例:
{
"alg": "HS256",
"typ": "JWT"
}
经过Base64Url编码后成为JWT的第一部分。
2. 负载(Payload)
- 作用:携带一些声明(claims),这些声明是关于实体(通常是用户)和其他数据的陈述。分为三种类型:注册声明(如iss、exp、sub等,预定义的,非强制但推荐使用)、公共声明(自定义的,可共享给其他应用的信息)、私有声明(自定义的,仅在特定应用中使用的信息)。它用于在客户端和服务器之间传递实际需要的数据。
- 常见内容格式示例:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
同样经过Base64Url编码后成为JWT的第二部分。
3. 签名(Signature)
- 作用:用于验证消息在传递过程中没有被更改,并且在使用私钥签名的情况下,还可以验证JWT的发送者身份。它通过对编码后的头部、编码后的负载、一个密钥(secret)以及头部中指定的签名算法来生成。接收方可以使用相同的密钥和算法来重新计算签名,与接收到的签名进行比对,从而验证JWT的完整性和真实性。
- 常见内容格式示例:假设使用HMAC SHA256算法,其生成的签名类似这样一串加密后的字符串:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最终完整的JWT由三部分组成,通过点(.)连接,即base64UrlEncode(header).base64UrlEncode(payload).signature
。