Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標准((RFC 7519).該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。簡單來說就是 JWT(Json Web Token)是實現token技術的一種解決方案
JWT的使用場景主要包括:
1) 認證,這是比較常見的使用場景,只要用戶登錄過一次系統,之后的請求都會包含簽名出來的token,通過token也可以用來實現單點登錄。
2)交換信息,通過使用密鑰對來安全的傳送信息,可以知道發送者是誰、放置消息被篡改。
token驗證和session認證的區別
傳統的session認證
http協議本身是一種無狀態的協議,而這就意味着如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據http協議,我們並不能知道是哪個用戶發出的請求,所以為了讓我們的應用能識別是哪個用戶發出的請求,我們只能在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發送給我們的應用,這樣我們的應用就能識別請求來自哪個用戶了,這就是傳統的基於session認證。
session缺點
基於session的認證使應用本身很難得到擴展,隨着不同客戶端用戶的增加,獨立的服務器已無法承載更多的用戶
Session方式存儲用戶id的最大弊病在於要占用大量服務器內存,對於較大型應用而言可能還要保存許多的狀態。
基於session認證暴露的問題
- Session需要在服務器保存,暫用資源
- 擴展性 session認證保存在內存中 ,無法擴展到其他機器中
- CSRF 基於cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
JWT包含了使用.分隔的三部分: Header 頭部 Payload 負載 Signature 簽名
優點
- 因為json的通用性,所以JWT是可以進行跨語言支持的。
- 因為有了payload部分,所以JWT可以在自身存儲一些其他業務邏輯所必要的非敏感信息。
- 便於傳輸,jwt的構成非常簡單,字節占用很小,所以它是非常便於傳輸的。
- 它不需要在服務端保存會話信息, 所以它易於應用的擴展
python 中的Demo
import jwt encoded_jwt = jwt.encode({'username':'adimn'},'secret_key',algorithm='HS256') de_code = jwt.decode(encoded_jwt,'secret_key',algorithms=['HS256']) print(encoded_jwt) print(de_code) #運行結果: b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkaW1uIn0.MeQOdDiiI39mBpgbFNnBVNdJMDhUpRTxziPeFJKB2fA' {'username': 'adimn'}
