我想對Stormpath post中的JWT令牌和CSRF提出疑問,解釋將JWT存儲在localStorage或cookie中的優缺點。爲什麼我應該將CSRF令牌放入JWT令牌中?
[...]如果你正在讀出JS使用一個Cookie,這意味着你 不能設置中HTTPOnly標誌上的Cookie值,所以現在在您的網站 任何JS可以讀取它,從而使其與在localStorage中存儲 東西的安全級別完全相同。
我想了解爲什麼他們建議將xsrfToken添加到 智威湯遜。不會將JWT存儲在cookie中,然後將其提取並將JWT放入HTTP標頭中,並基於HTTP標頭對 請求進行身份驗證,完成與 Angular的X-XSRF-TOKEN相同的功能?如果您根據標頭 中的JWT進行身份驗證,則其他域名無需代表用戶發出請求 ,因爲其他域無法從cookie中提取JWT。我沒有 瞭解JWT中xsrfToken的用途 - 也許它只是 一個額外的防禦層 - 這意味着攻擊者必須在您的站點和CSRF當時有一個受損腳本。所以他們不得不用兩種方法打你,以便能夠進行攻擊。
的職位是在this answer掛在那裏說:
的最後一件事是要確保你有每 HTTP請求的CSRF保護,確保外部域發起請求到 你的網站不能功能。然後,在對服務器的每次請求中,確保您自己的 JavaScript代碼讀取cookie值,並將其設置爲自定義 標題,例如, X-CSRF-Token並在服務器上驗證 中的每個請求的值。 除非外部客戶端通過HTTP選項請求獲得授權 ,否則外部域客戶端無法爲您的域設置 請求的自定義標頭,因此任何嘗試進行CSRF攻擊(例如在 IFrame中,無論如何)都會失敗。
即使他們可以設置自定義標頭,他們也無法訪問存儲JWT令牌的cookie,因爲只有在同一個域上運行的JavaScript才能讀取該cookie。
他們可能通過XSS的唯一方式是在JWT中有一個xsrfToken,如果存在XSS漏洞也會受到威脅,因爲在可信客戶端域中運行的惡意腳本可以訪問cookie中的JWT,請求與xsrfToken。
所以公式應爲:
- TLS + JWT存儲在請求頭+無XSS漏洞的安全cookie +智威湯遜。
如果客戶端和服務器在不同的域中運行,服務器應該發送JWT,客戶端應該使用JWT創建cookie。 我認爲該方程對這種情況仍然有效。
UPDATE:MvdD agree with me:
由於瀏覽器不會自動將頭添加到您的要求, 它不容易受到CSRF攻擊
感謝您的回答,您寫了一篇不錯的文章!但我仍不明白爲什麼需要XSRF令牌。也許如果你共享一個具體的案例,將JWT存儲在非httpOnly cookie中,並將其發送回服務器的頭部(帶有TLS和無XSS漏洞),用戶可能會發出惡意請求,恕不另行通知。 – gabrielgiussi
剛發佈了一個答案。請讓我知道你的想法。 – Chiedo
我是JMU畢業生,也是湯姆:) – Chiedo