Day 27 - Spring Security (四) JWT

JWT,全名为JSON Web Token (RFC 7519),它定义了一种简洁且自包含的方式,将讯息作为JSON 物件传输,并且该讯息会经过数位签章(Digital Signature),因此是可以被验证及信任的。

JWT 组成

JWT 的组成分为HeaderPayloadSignature三个JSON Object,这三个部分会先各自进行编码再用.间隔,最後组成一个JWT 字串。

Header (section5)

第一个部分是Header 标头,又称为JOSE Header,这个部分由两个栏位组成。

  1. alg (algorithm) : 必要栏位,对於JWT 进行签章或解密的主要演算法,如HMAC、SHA256、RSA 等,对於未加密的JWT 则设置为none
  2. typ (type) : 非必要栏位,宣告这个JWT 的媒体类型,基本上就是JWT。
  3. cty (content type) : 非必要栏位,传达有关JWT 的结构讯息,一般情况下,不允许使用巢状签章或加密方法,因此这个栏位并不常见。
{
	"alg" : "HS256",
	"typ" : "JWT"
}

Payload (section4)

再来就是Payload 内容,这里放的是声明(Claim)内容,也就是存放要传递的讯息的地方,通常所有资讯都会被放在这里。

  • Registered claims
    建议存放的声明资料,这些资料有明确的定义,可以让内容更完整,但并不是必须栏位,其他声明栏位不能与之冲突。
    1. iss (Issuer) : JWT 的签发人。
    2. sub (Subject) : JWT 的主题。
    3. aud (Audience) : JWT 的受众。
    4. exp (Expiration Time) : JWT 的过期时间。
    5. nbf (Not Before) : 定义在发放JWT 之後的某个时间点前,该JWT 无法使用。
    6. iat (Issued At) : JWT 的签发时间。
    7. jti (JWT ID) : JWT 的身分标示,每个JWT 的ID 不应该重复,避免重复发放。
  • Public claims
    IANA JSON Web Token Registry 上注册的声明,可以向官方申请定义,会进行审核等步骤,实务上不太会用到。
  • Private claims
    由使用者自定义的声明,也就是Token 想要传递的主要讯息。

Signature (section6)

最後是Signature 签章,它是由前两个部分Header 和Payload 分别Base64 编码後再用.串接,接者和一个密钥经过加密演算法後取得,而拥有Signature 的JWT 就会被称为JWS,也就是有签名的JWT,没有Signature 的JWT 也被称为Unsecured JWT,也就是不安全的JWT,代表Header 中的algnone

JWS

JWS,全名为JSON Web Signature (RFC 7515),它算是JWT 最广泛使用的功能,透过将简单的资料格式与定义明确的签章演算法结合,使JWT 成为安全共享数据的理想格式。

签章的目的是允许一个或多个参与方建立JWT 的真实性,可以让我们验证Token 是否有效或被窜改,也就是说,可以执行签章检查的任何一方都可以取得JWT 提供的内容,并不会阻止任何一方读取JWT 中的内容

另外,若是具有公私钥的签章方式,如RSA 等,私钥可以新增资讯并验证其真实性,而公钥只能验证资讯的真实性,因此使用公私钥签章方式的JWS 可以允许一对多的安全分发讯息,Audience可以透过公钥验证资料的真实性,但不能使用它创建新讯息,如下图(图片来源是谁在敲打我窗?什麽是 JWT ?)。

https://ithelp.ithome.com.tw/upload/images/20211012/20140728zNEkq6q8em.png

而若是使用共享秘密的签章方式,如HMAC 等,则会因为可以验证资讯的任何一方也可以新增资讯,当合法用户变成恶意用户时,恶意用户就可以修改讯息而不被其他方注意。

JWE

既然上面提到了JWS,那就不得不提一下JWE。

JWE,全名为JSON Web Encryption (RFC 7516),相对於JWS 是提供了一种验证数据的方法,而JWE 则是提供了一种保护资料使数据对第三方不透明的方法,不透明的意思就是不可读,在这种情况下,加密的Token 不能由第三方检查。

在JWS 中,拥有私钥的一方可以签章和验证Token,而持有公钥的各方只能验证Token,但在JWE 中,拥有私钥的是唯一可以解密Token 的一方,也就是说,持有公钥的Issuer只能加密数据,持有私钥的Audience才能加密和解密数据,如下图(图片来源是谁在敲打我窗?什麽是 JWT ?)。,

https://ithelp.ithome.com.tw/upload/images/20211012/2014072893cTjl5CxV.png

参考网站

是谁在敲打我窗?什麽是 JWT ?
JWT(JSON Web Token) - 原理介绍
JWT & JWE & JWS 大乱斗!


<<:  802.1X 是网路访问控制 (NAC) 的 IEEE 标准

>>:  [Day27]ISO 27001 附录 A.15 供应者关系

Extra09 - Storybook - 元件开发框架

随着 Component Driven 兴起,元件化变为不可逆的趋势,在元件化後的可替换性与重复利用...

Day-29 快速学习Excel时间函式

今日练习档 ԅ( ¯་། ¯ԅ) 今天要来带大家认识两个与时间有关的函式,分别为TODAY()以及N...

DAY 23 Big Data 5Vs – Variety(速度) Kinesis (3)

接续串流处理相关的服务介绍: Kinesis Data Firehose(KDF): KDF是可以方...

[访谈] APCS x 竞程沙漠 Howard

今天邀请到同系同级的 Howard 来分享他在高中学习程序的经历和对於 APCS 的想法~ 程序学习...

参与实验室的研究

时间来到 2020/05,那时系上的毕业专题展刚结束,所以我跟 EC、CC Lai 都闲闲没事做,有...