JWT,JWS與JWE差別
原文:https://www.jianshu.com/p/50ade6f2e4fd
随着移動網際網路的興起,傳統基于session/cookie的web網站認證方式轉變為了基于OAuth2等開放授權協定的單點登入模式(SSO),相應的基于伺服器session+浏覽器cookie的Auth手段也發生了轉變,Json Web Token出現成為了目前的熱門的Token Auth機制。
Json Web Token(JWT)
JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在兩個組織之間傳遞安全可靠的資訊。
官方定義:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties
現在網上大多數介紹JWT的文章實際介紹的都是JWS(JSON Web Signature),也往往導緻了人們對于JWT的誤解,但是JWT并不等于JWS,JWS隻是JWT的一種實作,除了JWS外,JWE(JSON Web Encryption)也是JWT的一種實作。
下面就來詳細介紹一下JWT與JWE的兩種實作方式:
-
JSON Web Signature(JWS)
JSON Web Signature是一個有着簡單的統一表達形式的字元串:
頭部(Header)
頭部用于描述關于該JWT的最基本的資訊,例如其類型以及簽名所用的算法等。
JSON内容要經Base64 編碼生成字元串成為Header。
載荷(PayLoad)
payload的五個字段都是由JWT的标準所定義的。
- 1 iss: 該JWT的簽發者
- 2 sub: 該JWT所面向的使用者
- 3 aud: 接收該JWT的一方
- 4 exp(expires): 什麼時候過期,這裡是一個Unix時間戳
-
5 iat(issued at): 在什麼時候簽發的
後面的資訊可以按需補充,項目開發中比較常見的填一些需要的自定義資料,比如使用者id或使用者名。
JSON内容要經Base64 編碼生成字元串成為PayLoad。
簽名(signature)
這個部分header與payload通過header中聲明的加密方式,使用密鑰secret進行加密,生成簽名。
JWS的主要目的是保證了資料在傳輸過程中不被修改,驗證資料的完整性。但由于僅采用Base64對消息内容編碼,是以不保證資料的不可洩露性。是以不适合用于傳輸敏感資料。
而且JWS還經常用于設計使用者認證和授權系統,甚至實作Web應用的單點登入(單點登入SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。)。實作原理:在任何一台服務節點上都能夠通過解析認證token判斷使用者是否有權限,并且可以通過token中攜帶的自定義資料(PayLoad)中的使用者資訊如使用者名或id,得知目前攜帶這個token請求的使用者是誰。
如果需要可以看下我的下一篇文章介紹 基于JWT規範的JWS實作token認證過程,采用JWT庫jose4j,附springboot項目 demo源碼下載下傳
-
JSON Web Encryption(JWE)
相對于JWS,JWE則同時保證了安全性與資料完整性。
JWE由五部分組成:
具體生成步驟為:- 1 JOSE含義與JWS頭部相同。
- 2 生成一個随機的Content Encryption Key (CEK)。
- 3 使用RSAES-OAEP 加密算法,用公鑰加密CEK,生成JWE Encrypted Key。
- 4 生成JWE初始化向量。
-
5 使用AES GCM加密算法對明文部分進行加密生成密文Ciphertext,算法會随之生成一個128位的認證标記Authentication Tag。
6.對五個部分分别進行base64編碼。
可見,JWE的計算過程相對繁瑣,不夠輕量級,是以适合與資料傳輸而非token認證,但該協定也足夠安全可靠,用簡短字元串描述了傳輸内容,兼顧資料的安全性與完整性。