面试题答案
一键面试JWT基本组成部分及在安全认证中的作用
- Header(头部)
- 组成:通常由两部分组成,令牌的类型(如JWT)和使用的哈希算法,例如
{ "alg": "HS256", "typ": "JWT" }
。这部分内容经过Base64Url编码后成为JWT的第一部分。 - 作用:告知服务器或其他验证方使用何种算法来验证签名,同时明确令牌的类型,使得接收方能够正确解析和处理该令牌。
- 组成:通常由两部分组成,令牌的类型(如JWT)和使用的哈希算法,例如
- Payload(负载)
- 组成:包含声明(claims),这些声明是关于实体(通常是用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss、exp、sub等)、公共声明和私有声明。例如
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
,编码后成为JWT的第二部分。 - 作用:携带了一些必要的用户信息或元数据,用于在不同服务之间传递数据,并且部分声明(如exp表示过期时间)有助于安全认证,接收方可以根据这些信息验证令牌的有效性和时效性。
- 组成:包含声明(claims),这些声明是关于实体(通常是用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss、exp、sub等)、公共声明和私有声明。例如
- Signature(签名)
- 组成:要创建签名部分,需要使用编码后的header、编码后的payload、一个密钥(secret)和header中指定的签名算法。例如使用HMAC SHA256算法,签名公式为
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
。这部分是JWT的第三部分。 - 作用:用于验证消息在传递过程中有没有被更改,并且,在使用私钥签名的情况下,还可以验证JWT的发送者身份。接收方使用相同的算法和密钥来重新计算签名,并与接收到的JWT中的签名进行对比,如果匹配,则说明令牌是可信的。
- 组成:要创建签名部分,需要使用编码后的header、编码后的payload、一个密钥(secret)和header中指定的签名算法。例如使用HMAC SHA256算法,签名公式为
JWT在后端开发中常用的场景
- 用户身份验证:在用户登录成功后,后端服务器生成JWT并返回给前端。前端在后续请求中将JWT包含在请求头中,后端验证JWT的有效性来确认用户身份,无需在服务器端存储用户会话信息,实现无状态身份验证,便于分布式系统的扩展。
- 单点登录(SSO):多个子系统之间可以通过JWT实现单点登录。用户在一个子系统登录成功后,生成的JWT可以在其他子系统中进行验证,使得用户无需在每个子系统重复登录,提高用户体验和系统间的集成性。