1.前言
JSON Web Token (JWT) 其实目前已经广为软件开发者所熟知了,但是 JOSE (Javascript Object Signing and Encryption) 却鲜有人知道,我第一次知道它是在 Spring Security 的官方文档中,它改变了我对 JWT 的一些认识。目前国内能找到相关中文资料不是太多。所以我觉得有必要归纳一下。
2. JOSE 概述
JOSE 是一种旨在提供在各方之间安全传递声明(claims)的方法的规范集。我们常用的 JWT 就包含了允许客户端访问特定应用下特定资源的声明。JOSE 制定了一系列的规范来达到此目的。目前该规范还在不断的发展,我们常用的包含以下几个 RFC :
- JWS(RFC 7515) -JSON Web签名,描述生成和处理签名消息
- JWE(RFC 7516) -JSON Web加密,描述了保护和处理加密 消息
- JWK(RFC 7517) -JSON Web密钥,描述 Javascript 对象签名和加密中加密密钥的 格式和处理
- JWA(RFC 7518) -JSON Web算法,描述了 Javascript 对象签名和加密中使用的 加密 算法
- JWT(RFC 7519) -JSON Web令牌,描述以 JSON 编码并由 JWS 或 JWE 保护的声明的表示形式
3. 我们都看错了 JWT
看了对 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) 。它们之间的关系应该是这样的:
4. 什么是 JWE
JWS 我们就不说了,就是通常我们所说的 JWT。包括之前我在 Spring Security 实战干货 中所涉及到的 JWT 都是 JWS。我们来说一下 JWE 。JWS 仅仅是对声明(claims)作了签名,保证了其不被篡改,但是其 payload(中段负载) 信息是暴露的。也就是 JWS 仅仅能保证数据的完整性而不能保证数据不被泄露。所以我以前也说过它不适合传递敏感数据。 JWE 的出现就是为了解决这个问题的。具体的可以看下图:
从上面可以看出 JWE 的生成非常繁琐,作为 Token 可能比较消耗资源和耗时。用作安全的数据传输途径应该不错。
5. Spring Security jose 相关
这里需要简单提一下 Spring Security 提供了 JOSE 有关的类库 spring-security-oauth2-jose
,你可以使用该类库来使用 JOSE 。如果 Java 开发者要在 Spring Security 安全框架中使用 OAuth2.0 ,这个类库也是需要研究一下的。
tail -f /home/wwwlogs/access.log
148.70.179.32 - - [15/Nov/2019:05:46:28 +0800] "POST /wp-cron.php?doing_wp_cron=1573767987.5338680744171142578125 HTTP/1.1" 200 31 "http://www.test.com.cn/wp-cron.php?doing_wp_cron=1573767987.5338680744171142578125" "WordPress/5.0.7; http://www.test.com.cn" 220.181.108.143 -www.tianhyLzc.cn - [15/Nov/2019:05:46:28 +0800] "GET / HTTP/1.1" 200 5596 "-" "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 111.206.198.18 - - [15/Nov/2019:05:46:28 +0800] "GET /wp-includes/css/dist/block-library/style.min.css?ver=5.0.7 HTTP/1.1" 200 25658 "http://www.test.com.cn/" "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)"
打印下访问日志的IP列表
awk -F" "www.yachengyl.cn '{print $1}' /home/wwwlogs/access.log
148.70.179.32 91.228.8.210 1.119.148.54 121.51.40.28 1.119.148.54 1.119.148.54
给IP加上文件名行列号
awk -F" " '{print FILENAME"|www.jinyang3zhuc.cn "NR"|"NF"|"$0}' /home/wwwlogs/access.log
/home/wwwlogs/access.www.huanhua2zhuc.cn |9979|12|150.109.77.71 /home/wwwlogs/access.www.wujiu5zhuce.cn |9980|20|150.109.77.71 /home/wwwlogs/access.www.jiuyueguojizc.cn |9981|20|150.109.77.71 /home/wwwlogs/access.www.jinyang3.xyz |9982|22|156.220.107.221 /home/wwwlogs/access.log|9983|22|138.204.135.251 /home/wwwlogs/access.log|9984|13|148.70.179.32 /home/wwwlogs/access.log|9985|18|148.70.243.161 /home/wwwlogs/access.log|9986|18|148.70.243.161 /home/wwwlogs/access.log|9987|18|148.70.243.161 /home/wwwlogs/access.log|9988|12|201.174.10.7 /home/wwwlogs/access.log|9989|13|148.70.179.32 /home/wwwlogs/access.log|9990|23|220.181.108.143 /home/wwwlogs/access.log|9991|31|111.206.198.18 /home/wwwlogs/access.log|10000|13|170.238.36.20
6. 总结
今天我们对 JOSE 这个相对陌生的概念进行了认识,对 JOSE 规范集中的几个重要的 RFC 进行了列举。对之前的局限性认识也进行了纠正。为我们后续的 OAuth2.0 相关学习进行了铺垫。