移动端兴起和OAuth2的流行导致JWT这几年火得一塌糊涂。今天要介绍另一个规范集JOSE[1],全称Javascript Object Signing and Encryption,它和JWT有莫大的关系。
JOSE简介
JOSE是一个Javascript对象签名和加密协议,目的是提供一种在各个通讯方之间安全传输声明( claims,例如授权信息 )的方法,它特意构建在JSON和BASE64之上,以便在 Web应用程序中轻松使用。目前该规范还在不断地发展,我们常用的包含以下几个由RFC文档定义的概念:
JOSE规范集
❝JWT就可以用JWS或JWE表示,稍后我会详细介绍这一方面的知识。
JWS
JSON Web签名,基于JSON数据结构、使用数字签名技术或者消息认证码技术保护的内容(MAC)都可以称为JWS。该规范使用的密码算法和标识符在另一个规范JWA中定义。规则是比较多的参见RFC7515[2],这里我们通过序列化来感受一下即可。
JWS 序列化
JWS的序列化分为JWS Compact Serialization和JWS JSON Serialization两种。
JWS Compact Serialization
该序列化表示为一种URL安全的、紧凑的字符串。格式为:
例如:
❝JWT通常就是这种格式。
JWS JSON Serialization
该序列化表示为一个JSON对象,有两种格式。一般格式为:
平铺格式为:
举个一般格式的例子:
JWE
JWS 仅仅是对声明(claims)作了签名,保证了其不被篡改,但是其 payload(中段负载) 信息是暴露的。也就是 JWS 仅仅能保证数据的完整性而不能保证数据不被泄露。它不适合传递敏感数据。JWE 的出现就是为了解决这个问题的。具体的可以看下图:
JWE示意图
从上面可以看出 JWE 的生成非常繁琐,作为 Token 可能比较消耗资源和耗时。用作安全的数据传输途径应该不错。举个例子:
一共有五个部分,被四个英文句号隔开。
❝其实JWE也有对应的JSON格式,同样具有JWS的两种序列化方式,参见RFC7516[3]。
JWT和JWS、JWE的关系
以下是RFC7519[4]对JWT的说明:
JWT的定义
从上面可以得出一些结论:
简而言之,JWT是包含了特定的JWS或者JWE字符串。我们常见的大部分都属于JWS。
❝另外,我们通常读作、、,实际建议读作(角特),关于JWT的定义和规范请参阅RFC7519[5]。
JWK
JWK是本文最重要的知识点,这对我们后面学习资源服务器(Resource Server)非常重要。
场景描述
我相信签名公私钥这个大家都不陌生。JWT本身也要做使用私钥进行签名防止信息被篡改,公钥用来发给下游消费方来验证JWT的可靠性。通常情况下,公钥的配置方式为静态文件集成,这有一个弊端,当上游公私钥进行了改动,下游就无法动态进行公钥适配。这就是JWK要解决的问题,它对密码算法和标识符进行了规范设计,它紧凑的JSON数据结构非常方便在上下游之间传输。
JWK 格式
JWK是表示加密密钥的JSON对象。该对象包含的名称必须是唯一的,在此基础上JWK可以包含一些自定义字段。下面是一个P-256 EC(椭圆曲线离散密码)密钥的JWK表示:
按照RFC7517[6]的定义,JWK JSON对象可能包含以下属性:
JWK的定义属性
❝根据不同的算法JWK还可能包含其它的属性。
JWK Set
JWK Set 表示一组具有不同的JWK,这非常容易理解。它也是一个JSON对象,唯一的就是。举个例子:
❝OAuth2配置中的JWK Set URL就是输出JWK Set的端点。
JWA
JWA规范规定了哪些算法可以作为JWS和JWE的密码算法。还规定了这些算法对应的JWK中的属性,以及特定算法在JWK包含的属性例如前面EC算法中的、、,这些属性并不是一成不变的,它们会根据算法的迭代进行调整。如果你对JWA的细节感兴趣,请参阅RFC7518[7]。
❝你可以通过JWK生成器[8]自行使用一些算法生成JWK观察不同算法之间的区别。
小结
今天对JOSE规范进行简单的介绍了解,对你学习OAuth2和OIDC相关的知识非常有帮助。不要求深入但是一定要了解相关的知识。
参考资料
[1]
JOSE: https://datatracker.ietf.org/wg/jose/documents/
[2]
RFC7515: https://datatracker.ietf.org/doc/rfc7515/
[3]
RFC7516: https://datatracker.ietf.org/doc/rfc7516/
[4]
RFC7519: https://datatracker.ietf.org/doc/rfc7519/
[5]
RFC7519: https://datatracker.ietf.org/doc/rfc7519/
[6]
RFC7517: https://datatracker.ietf.org/doc/rfc7517/
[7]
RFC7518: https://datatracker.ietf.org/doc/rfc7518/
[8]
JWK生成器: https://mkjwk.org/
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/7858.html