JSON Web Token (JWT) 其实目前已经广为软件开发者所熟知了,可是 JOSE (Javascript Object Signing and Encryption) 却鲜有人知道,我第一次知道它是在 Spring Security 的官方文档中,它改变了我对 JWT 的一些认识。目前国内能找到相关中文资料不是太多。因此我以为有必要概括一下。算法
JOSE 是一种旨在提供在各方之间安全传递声明(claims)的方法的规范集。咱们经常使用的 JWT 就包含了容许客户端访问特定应用下特定资源的声明。JOSE 制定了一系列的规范来达到此目的。目前该规范还在不断的发展,咱们经常使用的包含如下几个 RFC :spring
看了对 JWT 的描述中提到 “令牌以 JWS 或者 JWE 声明表示”。莫非我以前的认知是错误的吗? 找了一些官方的资料研究了一番后,确实我以前的认知是不够全面的。安全
官方定义:框架
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties
直译过来:JSON Web令牌(JWT)是一种紧凑的URL安全方法,用于表示要在两方之间转移的声明。学习
也就是说咱们一般说的 JWT 其实是一个对声明进行 JOSE 处理方式的统称。咱们以前用的应该叫 JWS(JSON Web Signature),是 JWT 的一种实现,除了 JWS , JWT 还有另外一种实现 JWE(JSON Web Encryption) 。它们之间的关系应该是这样的:编码
JWS 咱们就不说了,就是一般咱们所说的 JWT。包括以前我在 Spring Security 实战干货 中所涉及到的 JWT 都是 JWS。咱们来讲一下 JWE 。JWS 仅仅是对声明(claims)做了签名,保证了其不被篡改,可是其 payload(中段负载) 信息是暴露的。也就是 JWS 仅仅能保证数据的完整性而不能保证数据不被泄露。因此我之前也说过它不适合传递敏感数据。
JWE 的出现就是为了解决这个问题的。具体的能够看下图:加密
从上面能够看出 JWE 的生成很是繁琐,做为 Token 可能比较消耗资源和耗时。用做安全的数据传输途径应该不错。spa
这里须要简单提一下 Spring Security 提供了 JOSE 有关的类库 spring-security-oauth2-jose
,你可使用该类库来使用 JOSE 。若是 Java 开发者要在 Spring Security 安全框架中使用 OAuth2.0 ,这个类库也是须要研究一下的。code
今天咱们对 JOSE 这个相对陌生的概念进行了认识,对 JOSE 规范集中的几个重要的 RFC 进行了列举。对以前的局限性认识也进行了纠正。为咱们后续的 OAuth2.0 相关学习进行了铺垫。 对象
关注公众号:Felordcn 获取更多资讯