2024年回炉计划之JWT(五)

一、简介        

        WT(JSON Web Token)是一种用于在网络应用间安全地传递信息的开放标准(RFC 7519)。它是一种紧凑且自包含的方式,用于在各方之间传输信息作为 JSON 对象。JWT 可以通过数字签名(使用 HMAC 算法)或使用公钥/私钥对(RSA 或 ECDSA)进行验证,以保证信息的完整性和可信度。

JWT 由三部分组成,它们分别是:

  1. Header(头部):包含了两部分信息,声明类型(typ)和所使用的签名算法(alg),通常为 JSON 对象。
  2. Payload(载荷):包含了需要传递的信息,也是一个 JSON 对象,其中包含了一些预定义的声明,比如过期时间(exp)、发行者(iss)、接收者(aud)等,也可以包含一些自定义的声明。
  3. Signature(签名):由前两部分的编码信息与一个秘密密钥结合后经过签名算法生成。

JWT 的工作流程通常如下:

  1. 认证:用户提供其凭据,服务器验证凭据的有效性。
  2. 生成 Token:一旦验证通过,服务器生成一个 JWT 并将其返回给客户端。
  3. 存储 Token:客户端通常会将 JWT 存储在本地,例如在浏览器的 localStorage 中或者移动端的本地存储中。
  4. 发送 Token:客户端在每次与服务器进行通信时,都会将 JWT 发送给服务器,通常是通过 HTTP 请求的头部部分发送(通常是 Authorization 头)。
  5. 验证 Token:服务器收到 JWT 后,会验证其签名和有效期,以确保其合法性和有效性。
  6. 处理请求:如果验证通过,服务器会处理请求,并相应客户端请求。

二、签名过程详解

        JWT 的 Signature 部分是用于验证 JWT 的完整性和真实性的关键组成部分。它通过对 Header 和 Payload 的内容使用指定的加密算法并结合密钥生成的签名,确保了 JWT 在传输过程中没有被篡改。

Signature 部分的生成流程如下:

  1. 构造待签名的字符串:将 Base64 编码后的 Header 和 Payload 拼接成一个字符串,形如 base64UrlEncode(header) + '.' + base64UrlEncode(payload)
  2. 使用指定的算法进行签名:使用 Header 中指定的算法(通常是 HMAC SHA-256 或 RSA)对上述构造的字符串进行签名。对于 HMAC 算法,需要使用共享的密钥来进行签名;对于 RSA 算法,需要使用私钥来进行签名。
  3. 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

2024年回炉计划之JWT(五)_第1张图片

        至于生成JWT的token与校验代码,不再赘述。

你可能感兴趣的:(java)