文档章节

你知道你对 JSON Web Token 的认识存在误解吗

码农小胖哥
 码农小胖哥
发布于 2019/12/04 22:29
字数 956
阅读 2.9K
收藏 8

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 编码并由 JWSJWE 保护的声明的表示形式

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。我们来说一下 JWEJWS 仅仅是对声明(claims)作了签名,保证了其不被篡改,但是其 payload(中段负载) 信息是暴露的。也就是 JWS 仅仅能保证数据的完整性而不能保证数据不被泄露。所以我以前也说过它不适合传递敏感数据。 JWE 的出现就是为了解决这个问题的。具体的可以看下图:

从上面可以看出 JWE 的生成非常繁琐,作为 Token 可能比较消耗资源和耗时。用作安全的数据传输途径应该不错。

5. Spring Security jose 相关

这里需要简单提一下 Spring Security 提供了 JOSE 有关的类库 spring-security-oauth2-jose ,你可以使用该类库来使用 JOSE 。如果 Java 开发者要在 Spring Security 安全框架中使用 OAuth2.0 ,这个类库也是需要研究一下的。

6. 总结

今天我们对 JOSE 这个相对陌生的概念进行了认识,对 JOSE 规范集中的几个重要的 RFC 进行了列举。对之前的局限性认识也进行了纠正。为我们后续的 OAuth2.0 相关学习进行了铺垫。

关注公众号:Felordcn获取更多资讯

个人博客:https://felord.cn

© 著作权归作者所有

码农小胖哥

码农小胖哥

粉丝 129
博文 124
码字总数 149842
作品 1
郑州
程序员
私信 提问
加载中

评论(6)

y
youngkun
不知道
广州首席架构师_0
广州首席架构师_0
水货,
isscy
isscy
你说了些啥?
码农小胖哥
码农小胖哥 博主
JOSE 难道很前沿吗
SpringBoot中文社区
SpringBoot中文社区
这咋呼呼的标题。
头号大宝贝
头号大宝贝
+1.哈哈哈哈
【大前端】认识单点登录

初识单点登录 最初接触到单点登录要追溯到3年多以前了,那时候看到的只是passport,当时要做全国所有社区的登录,然后就照着内部文档写了代码,然后就接入了(这里要提一句是百度与腾讯一旦形...

范大脚脚
2017/11/10
0
0
Shiro和SpringBoot简单集成

Shiro是一种简单的安全框架,可以用来处理系统的登录和权限问题。 本篇记录一下Spring Boot和Shiro集成,并使用Jwt Token进行无状态登录的简单例子。 参考Demo地址,此Demo适合用于SpringBoo...

萌璐琉璃
2018/09/10
0
0
JWT refreshtoken 实践

Json web token (JWT), 根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)...

goodspeed
2019/04/29
0
0
前后端分离-从MVC到前后端分离

摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强。MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Strut...

郭恩洲_OSC博客
2016/11/21
211
0
IdentityServer4 知多少

1. 引言 现在的应用开发层出不穷,基于浏览器的网页应用,基于微信的公众号、小程序,基于IOS、Android的App,基于Windows系统的桌面应用和UWP应用等等,这么多种类的应用,就给应用的开发带...

『圣杰』
2018/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何查看Android的系统版本?

有谁知道我怎么能检查系统版本(例如1.0 , 2.2 ,等)编程? #1楼 我无法对答案发表评论,但是Kaushik的答案存在一个严重错误:SDK_INT与系统版本不同,但实际上是指API级别。 if(Build.VER...

技术盛宴
46分钟前
35
0
引入AI变量,精准农业正在加速豹变?

  不久前,“江苏省脱贫率达 99.99%,尚未脱贫人数仅剩 6 户、17 人”这样一则新闻刷屏。“把这 17 个人迁出,江苏就全省脱贫”、“最后这 6 户人家拖了后腿”,在网民们的调侃和质疑声背后...

水果黄瓜
50分钟前
41
0
Elasticsearch系列---结构化搜索

概要 结构化搜索针对日期、时间、数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么...

清茶豆奶
今天
69
0
每天AC系列(一):三数之和

1 题目 LeetCode第15题,难度中等,题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答...

Blueeeeeee
今天
120
0
OSChina 周四乱弹 —— 水果你们都没吃全

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @ 莱布妮子:分享五月天的单曲《温柔》@小小编辑 @cIouddyy @clouddyy 《温柔》- 五月天 手机党少年们想听歌,请使劲儿戳(这里) @FalconChe...

小小编辑
今天
1.9K
11

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部