1. 程式人生 > >【JWT 介紹】

【JWT 介紹】

Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源,也可以增加一些額外的其它業務邏輯所必須的宣告資訊,該token也可直接被用於認證,也可被加密。

 

基於session認證所顯露的問題

Session: 每個使用者經過我們的應用認證之後,我們的應用都要在服務端做一次記錄,以方便使用者下次請求的鑑別,通常而言session都是儲存在記憶體中,而隨著認證使用者的增多,服務端的開銷會明顯增大。

 

擴充套件性: 使用者認證之後,服務端做認證記錄,如果認證的記錄被儲存在記憶體中的話,這意味著使用者下次請求還必須要請求在這臺伺服器上,這樣才能拿到授權的資源,這樣在分散式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴充套件能力。

 

CSRF: 因為是基於cookie來進行使用者識別的, cookie如果被截獲,使用者就會很容易受到跨站請求偽造的攻擊。

 

基於token的鑑權機制

基於token的鑑權機制類似於http協議也是無狀態的,它不需要在服務端去保留使用者的認證資訊或者會話資訊。這就意味著基於token認證機制的應用不需要去考慮使用者在哪一臺伺服器登入了,這就為應用的擴充套件提供了便利。

 

流程上是這樣的:

1)使用者使用使用者名稱密碼來請求伺服器

2)伺服器進行驗證使用者的資訊

3)伺服器通過驗證傳送給使用者一個token

4)客戶端儲存token,並在每次請求時附送上這個token值

 

 

JWT是由三段資訊構成的,將這三段資訊文字用.連結一起就構成了Jwt字串。

 

JWT的構成

第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似於飛機上承載的物品),第三部分是簽證(signature).

 

header

jwt的頭部承載兩部分資訊:

宣告型別,這裡是jwt

宣告加密的演算法 通常直接使用 HMAC SHA256

 

 

playload

載荷就是存放有效資訊的地方。這個名字像是特指飛機上承載的貨品,這些有效資訊包含三個部分

 

標準中註冊的宣告

公共的宣告

私有的宣告

標準中註冊的宣告 (建議但不強制使用) :

 

iss: jwt簽發者

sub: jwt所面向的使用者

aud: 接收jwt的一方

exp: jwt的過期時間,這個過期時間必須要大於簽發時間

nbf: 定義在什麼時間之前,該jwt都是不可用的.

iat: jwt的簽發時間

jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。

公共的宣告 :

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

 

私有的宣告 :

私有宣告是提供者和消費者所共同定義的宣告,一般不建議存放敏感資訊,因為base64是對稱解密的,意味著該部分資訊可以歸類為明文資訊。

 

 

signature

jwt的第三部分是一個簽證資訊,這個簽證資訊由三部分組成:

 

header (base64後的)

payload (base64後的)

secret

這個部分需要base64加密後的header和base64加密後的payload使用.連線組成的字串,然後通過header中宣告的加密方式進行加鹽secret組合加密,然後就構成了jwt的第三部分。