2016-11-13 53 views
0

我正在使用基於JWT的身份驗證構建SPA應用程序並進行服務器端呈現。存儲在Cookie中的JWT - 安全問題

當前實現:

  • JWT令牌發放和成功的用戶名和密碼驗證
  • 令牌之後轉移到客戶端,然後存儲在cookie的(不HttpOnly) - 的這樣做的目的是爲了避免需要完全刷新或關閉頁面
  • 記錄與令牌
  • Authorization頭將已刪除的cookie後再次登錄連接到每個API請求,如果令牌存在
  • 完整的SSL流量

我不能在令牌的localStorage存儲,因爲服務器端渲染,也沒有HttpOnly因爲我需要爲了構建Authorization頭訪問的cookie。

在這樣的架構中竊取令牌有什麼可能性?

回答

0

一個主要的風險是應用程序中的任何單個跨站點腳本漏洞都可能用於從cookie中竊取令牌,因爲它不是httpOnly(雖然我理解爲什麼會是這種情況)。像JavaScript這樣的JavaScript重載應用程序中的XSS是非常常見和難以避免的。

另外你還說令牌保存在cookie中,以便在關閉瀏覽器之後,用戶仍然登錄。一方面,這是不好的做法,關閉瀏覽器的用戶可能期望被註銷。另一方面,這意味着cookie被持久保存到磁盤,因此攻擊者從客戶端竊取cookie更容易。另一件想到的事情是跨站點請求僞造(CSRF),但是如果我理解正確,身份驗證實際上是基於Authorize標頭,其中標記在每個請求中被複制。如果是這樣的話,CSRF對你來說不是問題(但是如果在cookie中發送令牌就足夠了)。

因此,在最起碼,我想你應該

  • 不使用持久的cookie的令牌

  • 嘗試通過自動掃描你的代碼,以儘量減少XSS(如的機會,但這絕不會是100%,也是通過仔細選擇安全的默認技術)

  • 請確保auhintication基於Authorize標題而不是cookie

仍然主要是因爲XSS風險,我可能不會推薦在安全關鍵型應用程序中這樣做。

+0

事實上(糾正我,如果我錯了)通過cookie發送令牌(因爲該cookie存在,並且瀏覽器自動發送)在初始的,而不是AJAX請求,所以CSRF也是如此。 –

+0

基於你的回答,我認爲很好的解決方案是將標記存儲在HttpOnly cookie中,然後在初始請求中讀取它,並將其保存在Redux JS存儲中(正在使用),然後在每一個下一個使用'Authorization'標頭REST請求。據我所知,在第一個問題中描述的架構的情況下,在這裏需要CSRF保護。你怎麼看待這件事? –

+0

在這種情況下,如果您也使用cookie中的令牌,則還必須關心CSRF。如果認證信息是由瀏覽器自動發送的,CSRF是一個問題。如果會話ID或令牌在Cookie中。如果只有一個請求頭用於身份驗證,那麼在沒有針對CSRF的進一步保護的情況下您會很好。我對Redux並不是很熟悉,但如果Cookie是httpOnly,那麼您將無法從JavaScript訪問它,因此您將無法使用Redux JS進行存儲。將JWT存儲在httpOnly cookie中使其更安全,但使用案例將受到限制。 –