MST

星途 面试题库

面试题:安全认证之JWT用户角色权限控制基础

请阐述JWT(JSON Web Token)的基本结构,以及在基于JWT的用户角色权限控制中,如何通过JWT来传递用户角色信息?
13.5万 热度难度
后端开发安全认证

知识考点

AI 面试

面试题答案

一键面试

JWT基本结构

JWT 由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature),它们之间用点(.)分隔。

  1. 头部(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传递用户角色信息

  1. 生成JWT时包含角色信息:在用户登录或进行身份验证成功后,服务器在生成 JWT 时,将用户的角色信息作为自定义声明添加到载荷部分。例如上述载荷中的 "role": "admin"
  2. 客户端存储与传递:客户端收到包含角色信息的 JWT 后,通常会将其存储在本地(如 localStorage、sessionStorage 或 cookie 中,注意安全性)。在后续的请求中,客户端将 JWT 放在请求头(如 Authorization: Bearer <token>)中发送给服务器。
  3. 服务器验证与权限判断:服务器接收到请求及 JWT 后,首先验证 JWT 的签名以确保其真实性和完整性。验证通过后,从 JWT 的载荷中提取出用户角色信息。然后,根据预先定义的权限规则,判断该角色是否有权限执行当前请求的操作。例如,如果某个 API 只允许 admin 角色访问,服务器提取到 JWT 中的角色为 admin 时,则允许该请求,否则返回权限不足的错误。