这是我参与「第三届青训营 -后端场」笔记创作活动的第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。
同时该网站可以查询不同编程语言的不同第JWT包对JWT签名加密算法和载荷中预定义声明的支持情况。