一篇文章帶你分清楚JWT,JWS與JWE
隨著移動(dòng)互聯(lián)網(wǎng)的興起,傳統(tǒng)基于session/cookie的web網(wǎng)站認(rèn)證方式轉(zhuǎn)變?yōu)榱嘶贠Auth2等開放授權(quán)協(xié)議的單點(diǎn)登錄模式(SSO),相應(yīng)的基于服務(wù)器session+瀏覽器cookie的Auth手段也發(fā)生了轉(zhuǎn)變,Json Web Token出現(xiàn)成為了當(dāng)前的熱門的Token Auth機(jī)制。
Json Web Token(JWT)
JSON Web Token(JWT)是一個(gè)非常輕巧的規(guī)范。這個(gè)規(guī)范允許我們使用JWT在兩個(gè)組織之間傳遞安全可靠的信息。
| 官方定義:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties |

JWT Auth
現(xiàn)在網(wǎng)上大多數(shù)介紹JWT的文章實(shí)際介紹的都是JWS(JSON Web Signature),也往往導(dǎo)致了人們對于JWT的誤解,但是JWT并不等于JWS,JWS只是JWT的一種實(shí)現(xiàn),除了JWS外,JWE(JSON Web Encryption)也是JWT的一種實(shí)現(xiàn)。
下面就來詳細(xì)介紹一下JWT與JWE的兩種實(shí)現(xiàn)方式:

JWT,JWS與JWE
JSON Web Signature(JWS)
JSON Web Signature是一個(gè)有著簡單的統(tǒng)一表達(dá)形式的字符串:

JWS
1. 頭部(Header)
頭部用于描述關(guān)于該JWT的最基本的信息,例如其類型以及簽名所用的算法等。
JSON內(nèi)容要經(jīng)Base64 編碼生成字符串成為Header。
2. 載荷(PayLoad)
payload的五個(gè)字段都是由JWT的標(biāo)準(zhǔn)所定義的。
- iss: 該JWT的簽發(fā)者
- sub: 該JWT所面向的用戶
- aud: 接收該JWT的一方
- exp(expires): 什么時(shí)候過期,這里是一個(gè)Unix時(shí)間戳
- iat(issued at): 在什么時(shí)候簽發(fā)的
后面的信息可以按需補(bǔ)充。
JSON內(nèi)容要經(jīng)Base64 編碼生成字符串成為PayLoad。
3. 簽名(signature)
這個(gè)部分header與payload通過header中聲明的加密方式,使用密鑰secret進(jìn)行加密,生成簽名。
JWS的主要目的是保證了數(shù)據(jù)在傳輸過程中不被修改,驗(yàn)證數(shù)據(jù)的完整性。但由于僅采用Base64對消息內(nèi)容編碼,因此不保證數(shù)據(jù)的不可泄露性。所以不適合用于傳輸敏感數(shù)據(jù)。
JSON Web Encryption(JWE)
相對于JWS,JWE則同時(shí)保證了安全性與數(shù)據(jù)完整性。
JWE由五部分組成:

JWE組成
具體生成步驟為:
- JOSE含義與JWS頭部相同。
- 生成一個(gè)隨機(jī)的Content Encryption Key (CEK)。
- 使用RSAES-OAEP 加密算法,用公鑰加密CEK,生成JWE Encrypted Key。
- 生成JWE初始化向量。
- 使用AES GCM加密算法對明文部分進(jìn)行加密生成密文Ciphertext,算法會(huì)隨之生成一個(gè)128位的認(rèn)證標(biāo)記Authentication Tag。
- 對五個(gè)部分分別進(jìn)行base64編碼。
可見,JWE的計(jì)算過程相對繁瑣,不夠輕量級,因此適合與數(shù)據(jù)傳輸而非token認(rèn)證,但該協(xié)議也足夠安全可靠,用簡短字符串描述了傳輸內(nèi)容,兼顧數(shù)據(jù)的安全性與完整性。


























