JWT應該保存在哪里?你找到了嗎?
最近幾年的項目我都用JWT作為身份驗證令牌。我一直有一個疑問:服務端發(fā)放給瀏覽器的JWT到底應該存儲在哪里?這里只討論瀏覽器的場景,在這個場景里有三種選擇。
Cookie
服務端可以將JWT令牌通過Cookie發(fā)給瀏覽器,瀏覽器在請求服務端接口時會自動在Cookie頭中帶上JWT令牌,服務端對Cookie頭中的JWT令牌進行檢驗即可實現(xiàn)身份驗證。但它容易受到CSRF攻擊的影響。
解決的方法是通過設置Cookie的SameSite屬性為Strict。跨站時不會發(fā)送 Cookie。換言之,只有當前網(wǎng)頁的 URL 與請求目標一致,才會帶上 Cookie。
Cookie除了易受CSRF攻擊還有XSS攻擊。黑客可以通過JS腳本讀取Cookie中的信息。為了防止這一點,可以設置Cookie的屬性為HttpOnly。
- response.setHeader("Set-Cookie", "jwt=jwt_value;Path=/;Domain=domainvalue;Max-Age=seconds;HttpOnly");
你可以通過設置Max-Age來設置其生存時間。
localStorage
localStorage也可以存儲JWT令牌,這種方法不易受到 CSRF 的影響。但是和Cookie不同的是它不會自動在請求中攜帶令牌,需要通過代碼來實現(xiàn)。不過這樣會受到XSS攻擊。另外如果用戶不主動清除JWT令牌,它將永遠存儲到localStorage。
sessionStorage
sessionStorage大部分特性類似localStorage,不過它的生命周期不同于localStorage,它是會話級存儲。關閉頁面或瀏覽器后會被清除。
總結
您可能會注意到所有 3 種方法都有相同的缺點——“易受 XSS 攻擊”。請?zhí)貏e注意 XSS的防護,并始終遵循XSS保護的最佳實踐。
結論
三種形式都容易收到XSS攻擊,因此如果對安全性要求很高,要特別針對性的配置。在三種方式之中,Cookie 提供了一堆安全選項,例如SameSite、HttpOnly等。因此最好使用 Cookie。
本文轉(zhuǎn)載自微信公眾號「碼農(nóng)小胖哥」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號。