本文介绍JWT组成原理及适用范围。
概览
JWT,全称JSON Web Token,是一种包含信息的Token,相较于普通的Token,唯一多的内容是:包含部分信息。与JWT相关的协议比较简单,但数量较多,本文只是对此加以总结。
术语说明
这其中会涉及到很多简写,先介绍一下
- JWS:JSON Web Signature,表示使用基于JSON的数据结构,对内容进行数字签名或MAC。具体内容下文详述。
- JWE:JSON Web Encryption,类似JWS,但这里是加密,而非数字签名。
- JWK:JSON Web Key,以JSON的形式表示一个加密key。
- JWA:JSON Web Algorithms,表示上面的签名、加密支持的算法。
- JWT:JSON Web Token,使用JSON表示的Token形式,可以采用JWS或JWE进行签名或加密。
- JOSE:JSON Object Signature and Encryption,即对上面JWS和JWE的统称。标准中常提到JOSE Header,代表的是JWS的Header或JWE的Header。
JWS
组成
JWS包含三部分
-
头部(JOSE Header),即一些键值对
-
typ:type,即这一整个JWS代表的类型,典型值为JWT
-
alg:algorithm,算法,当前JWS签名或加密所采用的算法,需要在JWA中存在才可以用
-
jku:JWK Set URL,存放公钥的地址,必须遵守JWK规范
-
jwk:JSON Web Key,用于签名的秘钥,以JSON的形式发放,详情参考JWK
-
kid:key id,即秘钥id,jwk可能返回多个密码,kid精确指定
-
x5系列:X.509证书相关,这里忽略
-
其它
-
-
载荷(JWS Payload),即主要的正文内容
-
签名(JWS Signature),签名方式如下
- 待签名内容:
ASCII(BASE64URL(UTF8(JWS Protected Header)) || ’.’ || BASE64URL(JWS Payload))
- 签名算法:头部alg字段指定的算法
- 待签名内容:
两种序列化格式
-
压缩方式:一种压缩的、URL安全的序列化方式
最终输出格式如下,即三个部分除头部需额外处理外,其余均进行BASE64及URL编码,将结果通过点号连接起来。这也是我们最常见的JWT的形式。
BASE64URL(UTF8(JWS Protected Header)) || ’.’ || BASE64URL(JWS Payload) || ’.’ || BASE64URL(JWS Signature)
-
JSON方式:序列化结果就是一个JSON,签名等用字段表示
最终输出格式如下,这种格式不常见,我们仅作了解就好
{ "protected": BASE64URL(UTF8(JWS Protected Header)), "header": "<不受