
最近幾年的專案我都用JWT作為身份驗證令牌,我一直有一個疑問:服務端發放給瀏覽器的JWT到底應該存盤在哪里?這里只討論瀏覽器的場景,在這個場景里有三種選擇,
Cookie
服務端可以將JWT令牌通過Cookie發給瀏覽器,瀏覽器在請求服務端介面時會自動在Cookie頭中帶上JWT令牌,服務端對Cookie頭中的JWT令牌進行檢驗即可實作身份驗證,但它容易受到CSRF攻擊的影響,
解決的方法是通過設定Cookie的SameSite屬性為Strict,跨站時不會發送 Cookie,換言之,只有當前網頁的 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不同的是它不會自動在請求中攜帶令牌,需要通過代碼來實作,不過這樣會受到XSS攻擊,另外如果用戶不主動清除JWT令牌,它將永遠存盤到localStorage,
sessionStorage
sessionStorage大部分特性類似localStorage,不過它的生命周期不同于localStorage,它是會話級存盤,關閉頁面或瀏覽器后會被清除,
總結
您可能會注意到所有 3 種方法都有相同的缺點——“易受 XSS 攻擊”,請特別注意 XSS的防護,并始終遵循XSS保護的最佳實踐,
結論
三種形式都容易收到XSS攻擊,因此如果對安全性要求很高,要特別針對性的配置,在三種方式之中,Cookie 提供了一堆安全選項,例如SameSite、HttpOnly等,因此最好使用 Cookie,
從Java 9 到 Java 17之Java 11
2021-09-29
從Java 9 到 Java 17之Java 10
2021-09-27

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312001.html
標籤:其他
