簡體   English   中英

如何使用Cordova保護SPA和移動應用程序的REST API

[英]How to secure REST API for SPA and Mobile App using Cordova

我已經對圍繞這個的“最佳實踐”進行了大量的研究,並在博客文章之后閱讀了博客文章,在SO問題之后閱讀了SO問題,在OWASP文章之后閱讀了OWASP文章。 我已經得到了一些明確的答案,但有些未知數。

首先,“做”:

  1. 使用JWT在我的REST API上授權用戶[1] [2]
  2. 將JWT存儲在HTTPOnly / Secure cookie中並構建CSRF保護。 不要存儲在HTML5本地存儲[3] [4] [5]中 (實際上,這一點值得商榷,是否更容易防范XSS或CSRF? [6]
  3. 驗證JWT的簽名方法[7]

現在我開始假設擁有一個SPA(使用Angular構建)並使用HTML5 sessionStorage對於短期令牌來說足夠安全,但有一點可以說XSS攻擊可能來自一個源自“壞角色”的“壞角色”從CDN加載的許多庫之一。

對於我的特定用例,我不計划使用長期令牌 - 在不使用10分鍾后過期但我仍然想知道我是否要通過會話跟蹤到期或使用刷新令牌 - StormPath推薦前者(不再是無國籍?)但我相信使用JWT的大玩家使用刷新令牌(谷歌使用它們但聲明你需要將它們存儲在安全的長期存儲中,這意味着HTML5 localStorage再次出現問題)。

我想這樣做,這樣我的用戶如果刷新頁面就不必重新登錄(因此需要在客戶端存儲令牌)。 我還希望在Cordova的幫助下將我的SPA用作“移動應用程序”。 這里顯而易見的缺陷是,如果我使用cookie,Cordova沒有帶烘焙的cookie支持/存儲,我應該轉而使用HTML5本地存儲。 因為在移動設備上我並不需要擔心刷新頁面,所以我可以讓我的令牌存在於內存中並使用我所確定的策略到期。

如果我采用這種方法,桌面上基於cookie的JWT,移動設備上的“Bearer”標頭,我現在需要一個認證端點,它將以兩種不同的方式給予令牌,當我在REST API端授權時,我需要支持基於cookie的JWT(帶有CSRF)和基於頭的JWT驗證。 這種復雜情況令我擔心,因為我不知道我是否能准確預見到這里的安全隱患。

總結一下上面的一系列想法:

  • 創建一個身份驗證處理程序,通過HttpOnly / Secure cookie將令牌分發到桌面,並通過移動有效負載分發。
  • 在我的REST API上,支持兩種驗證方法 - 基於頭和基於cookie - 包括基於cookie的方法的CSRF保護。

我有什么理由不想采取這種方法嗎? 我假設如果我在我的SPA上使用XSS是一個嚴重的風險,那么我需要一個經典的登錄頁面進行身份驗證以設置正確的cookie,因為如果我通過SPA進行身份驗證,那么任何XSS攻擊都可能會攔截它(兩者都有)在手機和桌面上)! 但是,在移動設備上,我需要將JWT注入到SPA中,可能通過一些自定義DOM元素(元標記?),但此時我可以讓SPA執行登錄,而不是將XSS視為移動設備上的威脅。 Cordova將所有資產打包到安裝包中,這樣有點好,但為什么不在桌面版上采用相同的方法呢?

我的應用程序只需很少的用戶輸入,它主要是一個儀表板/報告工具。 將有一個“消息中心”,但它的內容應始終由用戶創建(僅由該用戶創建)並進行消毒。 在我的用例中,是否可以偏離“最佳實踐”並依賴localStorage不計算XSS作為我的SPA的嚴重風險? 這將簡化整個過程(按原計划使用HTML5 sessionStorage)並降低復雜性,這將減少潛在安全性失誤的攻擊面。 我只想確保在繼續前進之前了解風險。

除了通過構建移動本機應用程序而不是使用Cordova將我的SPA轉換為移動應用程序之外,還有其他方法可以確保安全嗎? 我討厭這種情況,但它可能很好。

我很感激所有關於此事的想法!

在考慮設計基於javascript的跨平台應用程序來運行移動設備時,許多關於設計基於Web瀏覽器的常規應用程序的注意事項並不一定適用。

就安全性而言,無論您決定使用JWT還是簡單的OAuth令牌,都要確保所有通信都通過https進行。

請盡可能多地使用localStorage。 如果你考慮一個http請求的解剖,它真的是發送一些基於文本的消息分成多個部分到服務器。 請求的標頭不比包括cookie在內的任何其他部分更安全。 因此,從安全角度來看,興趣點是令牌的生成/驗證/無效,令牌在設備上的存儲以及請求的傳輸機制。

  1. 生成/驗證/失效:在服務器上生成令牌。 使用一些技術/策略確保不會發生碰撞或流血。 此外,請確保您的策略允許您使服務器上的令牌無效,然后在進一步使用令牌時拒絕訪問服務器請求的數據。 然后由您的應用程序決定在服務器拒絕訪問資源時處理用戶UI之旅。
  2. 如何將令牌存儲在設備上受限於設備操作系統為您提供的功能。 關於使用本機應用程序是否優於跨平台應用程序,我認為創建一個native-cordova插件來使用任何特定的本機策略來存儲您的令牌,如果對“開箱即用”(例如本地存儲)不滿意的話可能,雖然根據我的經驗,這通常是矯枉過正。 如果有人有不同的經歷,很高興在這一個糾正。

  3. 對於所有Web服務端點通信,請毫無例外地使用HTTPS ALWAYS。 HTTPS是萬無一失的,不,但是你不會因為專門的竊賊可以學會選擇鎖來建造一個沒有前門的房子。 這大大保證了運輸機制。

通常,無論如何,這都是本機應用程序必須使用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM