JWT是什么 | 青训营笔记

133 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。

JWT全称是JSON Web Token,JWT是一种开放标准(RFC7519),它定义了一种紧凑方式传输JSON对象,同时经过数字签名可以进行验证。

JWT的应用场景:

  • 授权。在用户登录后得到一个JWT作为token,后续访问时提交token。
  • 信息安全交换。通过签名信息可以验证消息是否被篡改。

JWT的结构包含3部分:头部、载荷、签名,类似xxx.yyy.zzz,它们由.分隔。

  • 头部
    头部包含了token类型信息和使用的签名算法,通过将其组成JSON对象然后通过base64转码后得到。
    { 
        "alg": "HS256",
        "typ": "JWT" 
    }
    
  • 载荷
    载荷中同样也是由JSON对象通过base64转码后得到,载荷中包含3种声明(claims)。
    第一种是预定义声明,如iss签发人(issuer),exp过期时间(expiration time),sub消费者(subject)等,这种信息通常可以被各种包自动效验token是否合法。
    第二种是公共声明,是签发人自己添加的信息。
    第三种是私有声明,是签发人和消费者共同定义的信息。
    三种声明被组成一个JSON对象,需要说明的是base64是对称解密的,因此在客户端中也可以解密token获得载荷内的信息,因此JWT并没有加密传输信息的功能。
  • 签名
    签名部分需要依赖base64转码后的头部和载荷xxx.yyy作为输入,同时在后端生成时可以加入私钥,通过头部指定的加密算法生成加密信息。

JWT是三个由点分隔的base64编码字符串,因此可以直接在http请求中使用。如果JWT中存储了太多的信息,则生成的token可能很大,需要使用其它方式。

可以通过JSON Web Tokens - jwt.io在线尝试编码/解码JWT。

image.png

同时该网站可以查询不同编程语言的不同第JWT包对JWT签名加密算法和载荷中预定义声明的支持情况。

image.png