我們在昨天介紹了Django REST framework(DRF)中BasicAuthentication與TokenAuthentication的認證流程,並且也在認識認證流程的同時意識到這兩種方法各自的風險,並且也提到JSON Web Token(JWT)在某方面處理了這兩種方法各自的痛點
網路上關於介紹JWT的相關資訊非常多且十分詳細,尤其推薦:
JSON Web Token (JWT) explained
我們今天把重點放在JWT本身的特色、使用場景以及在納入資安考慮後應該要做什麼調整
在下一篇才會進行實際操作
今日重點:
JWT是一種基於JSON的開放標準(RFC 7519),用於在各方之間使用JSON物件的形式安全的傳遞資料,並且因為有經過數位簽章,因此可以被信任。
JWT的結構可以分成以下三點,每一部分以(.)點作為區分
{"alg": "HS256", "typ": "JWT"}
{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
<header>.<payload>.<signature>
並且JWT也有以下特點:
初始登入流程:
正常請求流程:
Token刷新流程:
當 Access Token 過期時:
跟Token認證中有一些區別:
那我們可以從各方面比較一下兩者的優劣勢
安全特性 | JWT | 傳統 Token | 優勢 |
---|---|---|---|
信息包含 | 包含用戶信息,可能有信息洩露風險 | 通常只是隨機字符串,不包含敏感信息 | 傳統 Token* |
密鑰管理 | 依賴於單一密鑰的安全性,一旦洩漏便可能有所有JWT都會被偽造 | 每個 Token 獨立,單個泄露影響有限 | 傳統 Token |
撤銷機制 | 雖然有配置過期時間,但是配置過長的時間風險會提高 | 可以通過刪除數據庫記錄立即撤銷 | 傳統 Token* |
跨域安全 | 適合跨域場景,不依賴 Cookie | 如使用 Cookie 存儲,可能面臨 CSRF 風險 | JWT |
加密選項 | 可使用 JWE 進行加密 | 通常不提供內置加密 | JWT |
簽名驗證 | 使用密碼學簽名,可驗證完整性 | 通常依賴隨機性和數據庫查找 | JWT |
存儲位置 | 通常存儲在 localStorage,可能面臨XSS風險,可以使用 | 可存儲在 HttpOnly Cookie,對 XSS 有更好防護 | 傳統 Token* |
性能與可擴展性 | 無需數據庫查詢,減少安全風險 | 需要資料庫查詢,可能增加攻擊面 | JWT |
但是這樣整理只是非常片面的資訊,使用工具時可以更靈活,我針對有打星號的部分再展開說明
選擇哪種方法主要取決於具體需求和應用場景。例如:
我們今天介紹了另一種認證的方式:JWT,並且詳細的比較了JWT與DRF內建Token認證的比較
以及也考慮到實作上如果納入資安的考量,我們可以在對JWT的認證系統能有什麼改良
我們下一篇就來實際進行應用吧!