面试题答案
一键面试JWT基本结构
JWT 由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature),它们之间用点(.)分隔。
- 头部(Header):通常由两部分组成,令牌的类型(即JWT)和使用的哈希算法,如HMAC SHA256或RSA。它是一个 JSON 对象,示例如下:
{
"alg": "HS256",
"typ": "JWT"
}
之后这个 JSON 对象会被 Base64Url 编码,形成 JWT 的第一部分。 2. 载荷(Payload):也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了一组公共声明(如iss - 签发者,exp - 过期时间,sub - 主题等),除此之外,也可以自定义私有声明。例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"role": "admin" // 用户角色信息
}
同样,这个 JSON 对象会被 Base64Url 编码,成为 JWT 的第二部分。 3. 签名(Signature):要创建签名部分,需要使用编码后的头部、编码后的载荷、一个密钥(secret)和头部中指定的签名算法。例如,如果使用 HMAC SHA256 算法,签名会按如下方式创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
签名用于验证消息在传输过程中没有被更改,并且,在使用私钥签名的情况下,还可以验证 JWT 的发送者的身份。
在用户角色权限控制中通过JWT传递用户角色信息
- 生成JWT时包含角色信息:在用户登录或进行身份验证成功后,服务器在生成 JWT 时,将用户的角色信息作为自定义声明添加到载荷部分。例如上述载荷中的
"role": "admin"
。 - 客户端存储与传递:客户端收到包含角色信息的 JWT 后,通常会将其存储在本地(如 localStorage、sessionStorage 或 cookie 中,注意安全性)。在后续的请求中,客户端将 JWT 放在请求头(如
Authorization: Bearer <token>
)中发送给服务器。 - 服务器验证与权限判断:服务器接收到请求及 JWT 后,首先验证 JWT 的签名以确保其真实性和完整性。验证通过后,从 JWT 的载荷中提取出用户角色信息。然后,根据预先定义的权限规则,判断该角色是否有权限执行当前请求的操作。例如,如果某个 API 只允许
admin
角色访问,服务器提取到 JWT 中的角色为admin
时,则允许该请求,否则返回权限不足的错误。