JWT應該保存在哪裡?你找到了嗎?

最近幾年的項目我都用JWT作為身份驗證令牌。我一直有一個疑問:服務端發放給瀏覽器的JWT到底應該存儲在哪裡?這裡只討論瀏覽器的場景,在這個場景裡有三種選擇。


最近幾年的項目我都用JWT作為身份驗證令牌。我一直有一個疑問:服務端發放給瀏覽器的JWT到底應該存儲在哪裡?這裡只討論瀏覽器的場景,在這個場景裡有三種選擇。

 

Cookie

服務端可以將JWT令牌通過Cookie發給瀏覽器,瀏覽器在請求服務端接口時會自動在Cookie頭中帶上JWT令牌,服務端對Cookie頭中的JWT令牌進行檢驗即可實現身份驗證。但它容易受到CSRF攻擊的影響。

 

解決的方法是通過設置CookieSameSite屬性為Strict。跨站時不會發送 Cookie。換言之,只有當前網頁的 URL 與請求目標一致,才會帶上 Cookie

 

Cookie除了易受CSRF攻擊還有XSS攻擊。黑客可以通過JS腳本讀取Cookie中的信息。為了防止這一點,可以設置Cookie的屬性為HttpOnly

你可以通過設置Max-Age來設置其生存時間。

 

localStorage

localStorage也可以存儲JWT令牌,這種方法不易受到 CSRF 的影響。但是和Cookie不同的是它不會自動在請求中攜帶令牌,需要通過代碼來實現。不過這樣會受到XSS攻擊。另外如果用戶不主動清除JWT令牌,它將永遠存儲到localStorage

 

sessionStorage

sessionStorage大部分特性類似localStorage,不過它的生命週期不同於localStorage,它是會話級存儲。關閉頁面或瀏覽器後會被清除。

 

總結

您可能會注意到所有 3 種方法都有相同的缺點——“易受 XSS 攻擊”。請特別注意 XSS的防護,並始終遵循XSS保護的最佳實踐。

 

結論

三種形式都容易收到XSS攻擊,因此如果對安全性要求很高,要特別針對性的配置。在三種方式之中,Cookie 提供了一堆安全選項,例如SameSiteHttpOnly等。因此最好使用 Cookie

 

本文轉載自微信公眾號「碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯繫碼農小胖哥公眾號。