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