什麼是JWT
根據維基百科的定義,JSON WEB Token(JWT,讀作 [/dʒɒt/]),是一種基於JSON的、用於在網絡上聲明某種主張的令牌(token)。JWT通常由三部分組成: 頭信息(header), 消息體(payload)和簽名(signature)。
JWT管理session還有如下缺點:
-
更多的空間佔用。如果將原存在服務端session中的各類信息都放在JWT中保存在客戶端,可能造成JWT佔用的空間變大,需要考慮cookie的空間限制等因素,如果放在Local Storage,則可能受到XSS攻擊。
-
更不安全。這裏是特指將JWT保存在Local Storage中,然後使用Javascript取出後作爲HTTP header發送給服務端的方案。在Local Storage中保存敏感信息並不安全,容易受到跨站腳本攻擊,跨站腳本(Cross site script,簡稱xss)是一種“HTML注入”,由於攻擊的腳本多數時候是跨域的,所以稱之爲“跨域腳本”,這些腳本代碼可以盜取cookie或是Local Storage中的數據。可以從這篇文章查看XSS攻擊的原理解釋。
-
無法作廢已頒佈的令牌。所有的認證信息都在JWT中,由於在服務端沒有狀態,即使你知道了某個JWT被盜取了,你也沒有辦法將其作廢。在JWT過期之前(你絕對應該設置過期時間),你無能爲力。
-
不易應對數據過期。與上一條類似,JWT有點類似緩存,由於無法作廢已頒佈的令牌,在其過期前,你只能忍受“過期”的數據。
總結
- 在Web應用中,別再把JWT當做session使用,絕大多數情況下,傳統的cookie-session機制工作得更好
- JWT適合一次性的命令認證,頒發一個有效期極短的JWT,即使暴露了危險也很小,由於每次操作都會生成新的JWT,因此也沒必要保存JWT,真正實現無狀態。
擴展參考:講真,別再使用JWT了!