1. 程式人生 > >JWT篇1:JWT基礎知識

JWT篇1:JWT基礎知識

1、JWT簡介

   JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規範,可實現無狀態、分散式的Web應用授權;官網:https://jwt.io。

 GitHub上jwt的java客戶端:https://github.com/jwtk/jjwt。

【JWT的執行流程】

2、JWT的資料格式

一個jwt實際上由三部分組成,分別是:頭部Header、載荷playload、簽名signature。

2.1、JWT的頭部Header

JWT的頭部Header通常有兩部分組成:

(1)宣告的型別,一般是JWT;

(2)加密演算法,通常都是自定義。

通常會對頭部進行base64加密(可解密),得到第一部分資料。頭部header用於描述關於JWT的最基本的資訊,例如期型別以及簽名所用的演算法等,也可以被表示成為一個JSON物件。

{"type":"JWT","alg":"HS256"}
#type型別是JWT,alg表示簽名加密演算法是HS256。

 【注意】(1)上面的程式碼進行BASE64編碼(參考http://base64.xpcha.com/)後得到的字串是eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

(2)Base64是一種基於64個可列印字元來表示二進位制資料的表示方法。由於2的6次方等於64,所以每6個位元為一個單元,對應某個可列印字元。三個位元組有24個位元,對應於4個Base64單元,即3個位元組需要用4個可列印字元來表示。JDK 中
提供了非常方便的 BASE64Encoder 和 BASE64Decoder,用它們可以非常方便的完成基於 BASE64 的編碼和解碼。

2.2、JWT的載荷playload

載荷Playload就是存放有效資訊的地方。載荷playload包含三個部分:

(1)標準中的宣告,官方建議使用但是不強制使用的原則;

iss: jwt簽發者
sub: jwt所面向的使用者
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大於簽發時間
nbf: 定義在什麼時間之前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。

(2)公共的宣告:公共的宣告可以新增任何的資訊,一般新增使用者的相關資訊或其他業務需要的必要資訊,但不建議新增敏感資訊,因為這部分內容在客戶端可解密。

(3)私有的宣告:私有宣告是提供者和消費者所共同定義的宣告,一般不建議存放敏感資訊,因為base64是對稱加密的,因為該部分內容資訊是明文資訊。

     我們現在自定義一個Playload載荷:

#定義playload載荷內容
{"sub":"1234567890","name":"kefei","roles":"admin"}
#對以上載荷內容進行base64加密之後得到:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImtlZmVpIiwicm9sZXMiOiJhZG1pbiJ9

 2.3、JWT的簽名signature

  JWT簽名信息是由三部分組成:header部分base64加密之後、playload部分內容base64加密之後的內容、secret。

     JWT簽名signature部分需要base64加密後的header和base64加密後的playload使用符號點.連線組成的字串,然後通過header頭部宣告的加密方式進行加鹽secret組合加密,最後形成JWT的第三部分。

【注意】簽名部分secret是確保在伺服器端的,jwt的簽發生成也是在伺服器端的,secret就是用來進行jwt的簽發和jwt的驗證,所以它就是你伺服器端的私鑰,在任何場景都不應該公開。

JWT的頭部header、載荷playload、簽名signature三部分之間通過符號點.連線組成一個完整的字串,最終形成jwt:

         使用JWT實現單點登入時,需要注意token時效性。token是儲存在客戶端的令牌資料,如果永久有效,則有被劫持的可能。token在設計的時候,可以考慮一次性有效或一段時間內有效。如果設定有效時長,則需要考慮是否需要重新整理token有效期問題。

3、token儲存

3.1、token的儲存

         使用JWT技術生成的token,客戶端在儲存的時候可以考慮cookie或localStorage。cookie儲存方式,可以實現跨域傳遞資料。localStorage是域私有的本地儲存,無法實現跨域。

3.2、webstorage

      webstorage可儲存的資料容量為5M。且只能儲存字串資料。webstorage分為localStorage和sessionStorage
      localStorage的生命週期是永久的,關閉頁面或瀏覽器之後localStorage中的資料也不會消失。localStorage除非主動刪除資料,否則資料永遠不會消失。
      sessionStorage是會話相關的本地儲存單元,生命週期是在僅在當前會話下有效。sessionStorage引入了一個“瀏覽器視窗”的概念,sessionStorage是在同源的視窗中始終存在的資料。只要這個瀏覽器視窗沒有關閉,即使重新整理頁面或者進入同源另一個頁面,資料依然存在。但是sessionStorage在關閉了瀏覽器視窗後就會被銷燬。同時獨立的開啟同一個視窗同一個頁面,sessionStorage也是不一樣的。