使用JWT進行瀏覽器接口請求,在使用Cookie進行會話保持傳遞Token時,可能會存在 CSRF 漏洞問題,同時也要避免在產生XSS漏洞時泄漏Token問題,如下圖在盡可能避免CSRF和保護Token方面設計了方案。
要點解釋如下:
將JWT存入Cookie的優點是無需顯式傳遞,并且對于 image 和文件下載接口比較友好,但是要特別注意設置 HttpOnly
參數禁止通過JS 的方式獲取 Cookie,這樣能在系統某些場景發生XSS漏洞時也能避免Cookie泄漏。
但是基于Cookie的缺點是會存在CSRF跨站攻擊問題。為了避免CSRF問題可以通過自定義Header方式進行接口調用,所以我們可以在使用Cookie存儲傳遞JWT的基礎上,增加一個無實際意義并且唯一的sessionId(同時存入瀏覽器sessionStorage和JWT內容中),每個接口調用都從sessionStorage中讀取sessionId并設置到自定義Header中調用接口傳遞sessionId,在服務端使用過濾器或者攔截器驗證自定義header中sessionId的值是否和JWT中的值一致來保證合法性。
注:JWT只是防篡改,但是默認情況下它body區域的內容是不加密的,如果你需要存儲相對敏感信息在JWT中,可以對內容區域進行加密,在服務端解密讀取內容。
(END)