2017-08-28 172 views
16

以REST API作爲後端,由JWT授權來響應前端,但是如何處理會話?例如,登錄後,我從REST獲取JWT令牌,如果我將它保存到localStorage,我很容易受到XSS的影響,如果我將它保存到Cookies,只有在不設置HttpOnly時纔會出現同樣的問題,但反應無法讀取HttpOnly Cookie(我需要閱讀cookie以從中獲取jwt,並使用此jwt與其餘請求),我也沒有提到CSRF問題,如果您使用REST作爲後端,則無法使用CSRF標記。React前端和REST API,CSRF

因此,與REST的反應似乎是不好的解決方案,我需要重新思考我的架構,如何成爲?是否有可能爲您的用戶提供安全的反應應用程序?在REST API方面處理所有業務邏輯,而不用擔心丟失數據?

更新:

據我瞭解,有可能做到這一點:

  1. 陣營使得AJAX調用REST API
  2. 陣營從REST
  3. 得到JWT令牌React寫入httponly Cookie
  4. 因爲反應無法讀取httponly cookie,所以我們在我們需要證書的所有REST調用中按原樣使用它ication
  5. REST上的調用檢查XMLHttpRequest的頭,什麼是某種CSRF保護
  6. REST側支票餅乾,從中讀取JWT和做的東西

我有缺乏理論知識,在這裏,但看起來邏輯和相當安全,但我仍然需要回答我的問題並批准這個「工作流程」。

+1

首先..如果您正在使用JWT令牌進行身份驗證,那麼爲什麼您甚至想在前端讀取該令牌?它應該是僅限http和安全....第二..非常有可能在REST中使用CSRF令牌。作爲參考你可以檢查OWASP的指南。希望這將有助於https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet –

+0

@TasmineRout,但我怎麼可以在後端閱讀它?例如,我獲取休息api來獲得智威湯遜,我怎麼能讀取並保存它不在前端? – MyMomSaysIamSpecial

+0

此外,據我瞭解你對CSRF的回答,有可能通過檢查XMLHttpRequest頭來「確保」你的請求和響應?還有人說你可以添加自己的頭文件並在請求中檢查它,但爲什麼它是安全的?爲什麼黑客無法修改他的請求標題並通過我的支票? – MyMomSaysIamSpecial

回答

4
  1. 陣營使得AJAX調用REST API

放心,很多可用的RESTful資源客戶端的lib的

  • 陣營獲得JWT來自REST的代幣
  • 放心,這是智威湯遜應該做

  • 陣營寫的HttpOnly餅乾
  • 我不這麼認爲,它不應該工作,但會話並不是那麼重要,它很快就會過時,並且在關鍵操作上重新檢查密碼,即使黑客在非常短的時間內得到它,當用戶登錄並檢查它時,可以將會話令牌與IP綁定在一起在你的後端apis。如果你想要最安全的,只是不停地標記在內存中,並重新登錄時打開新的頁面或頁面刷新

  • 因爲反應無法讀取的HttpOnly的cookie,我們用它因爲,在我們所有的REST調用,我們需要驗證
  • 放心,通過登錄令牌檢查用戶和權限,就像CSRF你可以把你的登錄憑證到您的請求頭,並檢查它在你的後端的API 。 綁定登錄令牌自己寧靜的lib會爲你節省很多的代碼

  • REST上的調用檢查XMLHttpRequest的頭,什麼是某種CSRF保護 REST側檢查的cookie ,閱讀JWT從它做東西
  • 像大多數人一樣有保證。 此外,CSRF令牌綁定到自己寧靜的lib會爲你節省很多的代碼

    在頭部使用用戶令牌https://www.npmjs.com/package/express-jwt-token Authorization JWT < jwt token >

    使用CSRF令牌頭https://github.com/expressjs/csurf req.headers['csrf-token'] - the CSRF-Token HTTP request header.

    RESTful客戶端https://github.com/cujojs/rest

    與jwt反應https://github.com/joshgeller/react-redux-jwt-auth-example

    +0

    你能詳細說明「會話不是一件很重要的事情,它會很快就會過時「? – Stefan

    +0

    如何「當用戶登錄時將會話令牌與IP綁定在一起並在後端apis中檢查」,即使是一個理智的想法?各地的IP共享。 – Stefan

    +0

    「只是將令牌保存在內存中,並在打開新頁面或頁面時刷新重新登錄」,因此您建議忽略關於最近20多年發明的會話的所有內容,並將Web體驗設置爲石器時代? – Stefan

    1

    您的服務器可以直接設置JWT cookie作爲對登錄請求的響應。

    服務器響應POST /loginSet-Cookie: JWT=xxxxxx。該cookie僅爲http,因此不易受XSS影響,並且將自動包含在來自客戶端的所有提取請求中(只要您使用withCredentials: true)。

    正如您所提到的,CSRF已被緩解,請參閱OWASP的details