一、简介
WT(JSON Web Token)是一种用于在网络应用间安全地传递信息的开放标准(RFC 7519)。它是一种紧凑且自包含的方式,用于在各方之间传输信息作为 JSON 对象。JWT 可以通过数字签名(使用 HMAC 算法)或使用公钥/私钥对(RSA 或 ECDSA)进行验证,以保证信息的完整性和可信度。
JWT 由三部分组成,它们分别是:
- Header(头部):包含了两部分信息,声明类型(typ)和所使用的签名算法(alg),通常为 JSON 对象。
- Payload(载荷):包含了需要传递的信息,也是一个 JSON 对象,其中包含了一些预定义的声明,比如过期时间(exp)、发行者(iss)、接收者(aud)等,也可以包含一些自定义的声明。
- Signature(签名):由前两部分的编码信息与一个秘密密钥结合后经过签名算法生成。
JWT 的工作流程通常如下:
- 认证:用户提供其凭据,服务器验证凭据的有效性。
- 生成 Token:一旦验证通过,服务器生成一个 JWT 并将其返回给客户端。
- 存储 Token:客户端通常会将 JWT 存储在本地,例如在浏览器的 localStorage 中或者移动端的本地存储中。
- 发送 Token:客户端在每次与服务器进行通信时,都会将 JWT 发送给服务器,通常是通过 HTTP 请求的头部部分发送(通常是 Authorization 头)。
- 验证 Token:服务器收到 JWT 后,会验证其签名和有效期,以确保其合法性和有效性。
- 处理请求:如果验证通过,服务器会处理请求,并相应客户端请求。
二、签名过程详解
JWT 的 Signature 部分是用于验证 JWT 的完整性和真实性的关键组成部分。它通过对 Header 和 Payload 的内容使用指定的加密算法并结合密钥生成的签名,确保了 JWT 在传输过程中没有被篡改。
Signature 部分的生成流程如下:
- 构造待签名的字符串:将 Base64 编码后的 Header 和 Payload 拼接成一个字符串,形如
base64UrlEncode(header) + '.' + base64UrlEncode(payload)
。 - 使用指定的算法进行签名:使用 Header 中指定的算法(通常是 HMAC SHA-256 或 RSA)对上述构造的字符串进行签名。对于 HMAC 算法,需要使用共享的密钥来进行签名;对于 RSA 算法,需要使用私钥来进行签名。
- Base64 编码签名结果:将签名结果进行 Base64 编码,得到最终的 Signature。
验证 JWT 时,接收方会根据相同的算法和密钥对收到的 JWT 进行解析,然后按照相同的步骤重新计算 Signature,最后比对计算得到的 Signature 是否与 JWT 中的 Signature 一致。如果一致,则说明 JWT 没有被篡改过,可以信任其中的信息。
需要注意的是,JWT 的 Header 中包含了算法的信息,因此验证方需要根据 Header 中指定的算法来选择相应的方法进行签名验证。同时,为了保证安全性,应该尽量避免将敏感信息存储在 JWT 中,因为虽然 JWT 的内容经过了 Base64 编码,但仍然可以通过解码还原出原始数据。
三、示例
构成:header.payload.Signature
示例:eyJ0eXBlIjoiand0IiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJqaWtlMjUwc3ViamVjdCIsInVzZXJOYW1lIjoiaGhiYmVpamluZ0AxNjMuY29tIiwiaWF0IjoxNzA4MjIzMzk4LCJleHAiOjE3MDY1MjA0MzF9.2-SSAT5Fvt1tsDHWhf9CwT8rS9KgzRn-dxuqFimGlw4
解析:JSON Web Tokens - jwt.io
至于生成JWT的token与校验代码,不再赘述。