Published on

[JWT] JSON Web Token 简介

Authors

1. 什么是 JWT

JSON Web Token,简称JWT,读作/dʒɒt/, 是一种开放标准(RFC 7519),用于以JSON对象的方式安全地传输信息,由于传输的信息是经过数字签名的,所以信息可被验证和信任。

2. JWT 的使用场景

  • 授权:这是使用JWT最常见的场景。用户登录后,每个后续请求都将包含JWT,从而允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用JWT的功能,它的开销小并且能够轻松跨域使用。例如,服务器可以生成一个声明为“以管理员身份登录”的令牌,并将其提供给客户端,客户端可以使用该令牌来证明它以管理员身份登录。
  • 信息交换:JWT是在应用间安全传输信息的好方法。JWT可以使用密钥对进行签名,所以可以确定发送者。由于签名是使用HeaderPayload计算的,因此可以验证内容是否未被篡改。

3. JWT 的结构

一个JWT是由HeaderPayloadSignature三个元素构成的字符串,使用.分隔(Header.Payload.Signature)。前两个元素是特定结构的JSON对象,通常经过base64url编码。第三个是将Header和Payload的内容组合并加密。下面是一个JWT示例(为了方便阅读,加了换行符):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

https://jwt.io/#debugger-io 进行解码后如下图所示,Header 中指定了使用HS256算法进行签名,令牌类型为JWT;Payload中包含了sub、name、admin信息;Signature中, 使用header和payload以及特定的secret来生成签名。

image-20231114171718443.png
  • Header:通常由令牌的类型和签名算法两部分组成,经过对该JSON进行Base64Url编码后形成第一个元素。

  • Payload:包含传输的数据。官方称作声明( claims),用来描述实体(通常是用户)和附加数据,声明分为三类:

    • 注册声明(registered claims):预定义的声明,非强制性,都只有三个字符,旨在紧凑。包含:
      • iss :Issuer
      • exp:Expiration Time
      • sub :Subject
      • aud:Audience
      • nbf:Not Before
      • iat:Issued At
      • jti:JWT ID
    • 公共声明(public claims):遵循 IANA JSON Web Token Registry 中定义的声明命名,或者防冲突的命名
    • 私有声明(private claims):用户自定义声明。
  • Signature 用于验证JWT的真实性和完整性,签名的生成方式通常是将Header和Payload组合起来,使用一个secret key 进行计算,然后再与令牌中的签名部分比对

4. JWT 工作流程

1269fc4dd4a144b5a001f35b4a7804d9.png

首先客户端发送带有用户名和密码的Post请求。服务端验证身份成功后,生成JWT返回给客户端。后续所有的请求中,客户端都会在Header中带上这个toekn(JWT),服务端通过token验证用户身份,返回对应的响应数据。

参考文献