面试题答案
一键面试JWT基本组成结构
- Header(头部):
- 内容:通常由两部分组成,令牌的类型(如JWT)和所使用的签名算法,例如
{ "alg": "HS256", "typ": "JWT" }
。 - 编码:经过Base64Url编码后成为JWT的第一部分。
- 内容:通常由两部分组成,令牌的类型(如JWT)和所使用的签名算法,例如
- Payload(负载):
- 内容:包含声明(claims),这些声明是关于实体(通常指用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss,exp,sub等)、公共声明和私有声明。例如
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
。 - 编码:同样经过Base64Url编码后成为JWT的第二部分。
- 内容:包含声明(claims),这些声明是关于实体(通常指用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss,exp,sub等)、公共声明和私有声明。例如
- Signature(签名):
- 生成:要创建签名部分,需要使用编码后的头部、编码后的负载、一个密钥(secret)和头部中指定的签名算法。例如,如果使用HMAC SHA256算法,签名会按如下方式创建:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
。 - 作用:用于验证消息在传输过程中没有被更改,并且在使用私钥签名的情况下,还可以验证JWT的发送者身份。
- 生成:要创建签名部分,需要使用编码后的头部、编码后的负载、一个密钥(secret)和头部中指定的签名算法。例如,如果使用HMAC SHA256算法,签名会按如下方式创建:
通过JWT实现用户身份验证和简单权限判断
- 用户身份验证:
- 登录流程:用户在客户端输入用户名和密码,发送到服务器端进行验证。如果服务器验证通过,会生成一个JWT,其中Payload部分会包含用户的标识信息(如用户ID等)。
- 验证流程:客户端收到JWT后,在后续的请求中,会将JWT放在请求头(如
Authorization: Bearer <token>
)中发送给服务器。服务器接收到请求后,会从请求头中提取JWT,使用相同的密钥和签名算法对JWT的Signature进行验证。如果验证通过,说明JWT是由合法服务器生成且未被篡改,从而确认用户身份。
- 简单权限判断:
- 权限信息存储:在生成JWT时,可以在Payload部分添加用户的权限信息,例如
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022, "permissions": ["read:article", "write:article"] }
。 - 权限判断流程:当服务器接收到需要权限验证的请求时,解析JWT获取其中的权限信息。然后根据请求的操作(如访问某个API接口),判断用户是否具备相应的权限。例如,如果请求是读取文章,服务器会检查JWT中
permissions
字段是否包含read:article
权限,如果包含则允许访问,否则拒绝访问。
- 权限信息存储:在生成JWT时,可以在Payload部分添加用户的权限信息,例如