[英]Does custom security HTTP headers violate separation of concerns
自定義應用程序特定的,與安全性相關的HTTP標頭是否違反關注點分離,是否被認為是不好的做法? 我意識到使用自定義標頭控制服務將使客戶端與服務實現 緊密耦合 。 或者在這種情況下,要控制安全框架的行為。 我計划使用自定義標頭的上下文如下:
我們使用的是基於令牌的身份驗證,其中令牌具有固定的生存期,並且每次經過身份驗證的客戶端調用Web API都會發出新的令牌。 SPA客戶端可以在兩種情況下使用AJAX調用服務器
現在,如果用戶使頁面保持打開狀態,則會話將永不過期,因為將為每個自動提取生成新令牌。 某種程度上,我們需要將用戶操作與服務器端的自動刷新區分開來,並僅針對用戶操作發出新令牌 。
我意識到基於Websocket的刷新將是一種解決方案,但是由於特定的原因,我們決定堅持使用定時AJAX調用。 另一個解決方案是提供令牌刷新作為單獨的端點,但是從客戶端的角度來看這將違反DRY原則,並且使用Spring Security進行設置會更加麻煩。
剩下的唯一選擇是將用戶/自動信息嵌入請求本身,在這里使用標頭似乎是一個可行的選擇。 某些標頭的存在將阻止令牌刷新。 只需幾行代碼即可輕松實現。
我只擔心,如果這會使客戶端與服務實現之間的耦合過多。 從技術上講,它不將客戶端與服務耦合,而是將前面的安全過濾器耦合,從而泄漏用戶界面中的安全問題。 理想情況下,安全性對用戶界面應該是透明的,因此可以在不了解任何安全性的情況下對新客戶端進行編碼(尤其是在使用cookie時)。
另一方面,此解決方案不是破壞性的或突變的。 這是一項可選功能。 通過客戶端利用它,安全性得到了增強,但是在任何一種情況下都不會降低安全性(從服務器的角度看,就是這樣)。 現在的問題是,違反了使用可選標頭來增強安全性的原則,這在這種情況下是否有效?
在我的選擇中,應該透明地最大化安全性,但是在這種情況下,我看不出如何在客戶端中不泄漏安全性問題。
聽起來您好像在這里使用自己的自定義自定義令牌身份驗證解決方案。 這不是一個好主意。
我將花一點時間解釋為什么您不想做您打算提出的事情,然后再說什么是更好的選擇。
首先-您要在此處解決的問題是,您不希望用戶在打開標簽頁后永遠保持登錄狀態。 您需要解決此問題的原因是因為現在,您正在根據用戶的“每個請求”分配一個新的訪問令牌。
解決上述問題的正確方法是使用兩種令牌。
具有很短壽命(例如:1小時)的訪問令牌和具有更長壽命(例如:24小時)的刷新令牌。
它應該工作的方式是:
這種流程有很多好處:
上面的流程的好處是,它是一個Web授權標准: OAuth2 。
OAuth2密碼授予流程完全符合您的描述。 它生成兩種類型的令牌,處理“刷新”令牌,以安全,符合標准的方式從頭到尾處理整個事情。
我強烈建議您做的是在服務器和客戶端上都實現OAuth2庫,它將為您解決這些需求。
現在-關於令牌,當今大多數OAuth2實現都會將令牌生成為JSON Web令牌 。 這些是經過加密簽名的令牌,可提供許多安全優勢。
無論如何:我希望這會有所幫助! 我用Python,Node和Go編寫了幾種流行的身份驗證庫-因此,這來自於我在過去幾年中使用這些協議的直接經驗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.