面试题答案
一键面试JWT跨域安全认证基本原理
在跨域资源共享场景下,客户端向服务端请求认证,服务端验证通过后生成包含用户身份等信息的JWT返回给客户端。客户端后续请求资源时,在请求头中携带JWT。服务端收到请求后,验证JWT的合法性,若合法则允许访问资源。
JWT组成部分及认证流程作用
- Header(头部)
- 组成:通常包含两部分,令牌的类型(如JWT)和使用的哈希算法(如HMAC SHA256或RSA)。例如:
{ "alg": "HS256", "typ": "JWT" }
。 - 作用:在认证流程中,服务端通过头部信息知道使用何种算法来验证签名,同时识别出这是一个JWT。它会被Base64Url编码后成为JWT的第一部分。
- 组成:通常包含两部分,令牌的类型(如JWT)和使用的哈希算法(如HMAC SHA256或RSA)。例如:
- Payload(负载)
- 组成:包含声明(claims),这些声明是关于实体(通常指用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss、exp、sub等)、公共声明和私有声明。例如:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
。 - 作用:在认证流程中,服务端可以从负载中获取用户相关信息,用于授权决策等。不过由于负载可以被解码查看,不建议存放敏感信息。它同样会被Base64Url编码后成为JWT的第二部分。
- 组成:包含声明(claims),这些声明是关于实体(通常指用户)和其他数据的陈述。有三种类型的声明:注册声明(如iss、exp、sub等)、公共声明和私有声明。例如:
- Signature(签名)
- 组成:要创建签名部分,需要使用编码后的header、编码后的payload、一个密钥(secret)和header中指定的签名算法。例如使用HMAC SHA256算法,签名会按如下方式创建:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
。 - 作用:在认证流程中,服务端接收到JWT后,会使用相同的算法和密钥重新生成签名,并与JWT中的签名进行对比。若两者一致,则说明JWT未被篡改,且是由拥有正确密钥的服务端生成的,从而确认JWT的合法性。
- 组成:要创建签名部分,需要使用编码后的header、编码后的payload、一个密钥(secret)和header中指定的签名算法。例如使用HMAC SHA256算法,签名会按如下方式创建: