首頁 >後端開發 >Python教學 >python中JWT的簡單介紹

python中JWT的簡單介紹

不言
不言轉載
2018-12-13 10:48:383077瀏覽

這篇文章帶給大家的內容是關於python中JWT的簡單介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

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

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

擴展性: 用戶認證之後,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味著用戶下次請求還必須要請求在這台伺服器上,這樣才能拿到授權的資源,這樣在分佈式的應用上,相應的限制了負載平衡器的能力。這也意味著限制了應用的擴展能力。

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

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

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

聲明類型,這裡是jwt
聲明加密的演算法通常直接使用HMAC SHA256
完整的頭部就像下面這樣的JSON:

{
  'typ': 'JWT',
  'alg': 'HS256'
}

然後將頭部進行base64加密(該加密是可以對稱解密的),構成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
payload
載荷就是存放有效資訊的地方。這個名字像是特指飛機上承載的貨品,#payload

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


標準中註冊的聲明
公共的聲明
私有的聲明

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


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

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


header (base64後的)
payload (base64後的)
secret
這個部分需要base64加密後的header和base64加密後的payload使用.連接組成的字串,然後透過header中宣告的加密方式進行加鹽secret組合加密,然後就構成了jwt的第三部分。
將這三部分用.連接成一個完整的字串,構成了最終的jwt

secret是保存在伺服器端的,jwt的簽發生成也是在伺服器端的,secret就是用來進行jwt的簽發和jwt的驗證,所以,它就是你服務端的私鑰,在任何場景都不應該流露出去。一旦客戶端得知這個secret, 那就意味著客戶端是可以自我簽發jwt了。


優點
因為json的通用性,所以JWT是可以進行跨語言支援的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
因為有了payload部分,所以JWT可以在自身儲存一些其他業務邏輯所需的非敏感資訊。
方便傳輸,jwt的組成非常簡單,位元組佔用很小,所以它是非常方便傳輸的。
它不需要在服務端保存會話信息, 所以它易於應用的擴展
安全相關
不應該在jwt的payload部分存放敏感信息,因為該部分是客戶端可解密的部分。
保護好secret私鑰,這個私鑰非常重要。

如果可以,請使用https協定

###

以上是python中JWT的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除