2010-01-25 139 views
5

我希望幾個相關Web應用程序的客戶端保持自己的身份驗證狀態。這提高了可伸縮性,因爲不需要羣集節點之間的會話複製。它使得諸如Java Servlets和PHP等不同服務器技術的集成更加容易。客戶端會話

我的計劃如下:

  1. 設置與客戶端身份驗證後的用戶名和會話過期時間簽名和加密的cookie。
  2. 當客戶端發送請求時,服務器將解密並驗證Cookie,並根據Cookie值授予或拒絕訪問權限。
  3. 會話過期將通過重置cookie來更新。

想要使用會話的所有服務器只知道cookie機制和解密密鑰。另請參見:Session state in the client tier

是這種方法好不好?是否有可能將它集成到servlet容器/應用程序服務器中,以便它對應用程序是透明的?例如,servlet應該能夠使用HttpServletRequest#getRemoteUser()。這可能嗎?或者我需要像Spring Security這樣的容器級別以上的東西?是否有客戶端會話管理的現有庫?

回答

8

不是一個好主意。在客戶端存儲會話過期和用戶名等重要數據是非常危險的IMO,無論是否加密。即使這個概念本身在技術上是安全的(我不能深入回答這個問題,但我不是加密專家),只要獲得加密密鑰,就可以在不影響服務器的情況下簡化入侵。

有人誰得到關鍵的保持可以隨意生成會話cookie,冒充任何用戶對任何長的時間,一些經典的會話概念旨在防止。

這個問題有更好的和可擴展的解決方案。例如,爲什麼不建立一個所有相關服務器和服務都可以輪詢的中央會話驗證實例?環顧網絡,我100%肯定有現成的解決方案可滿足您的需求。

1

這不是真正如何實施會議。 cookie本身不需要攜帶會話本身的任何數據,只是對它的引用。

什麼餅乾持有通常是Session ID然後將其連接到服務器上的數據。

如果你沒有爲其他服務器訪問的中央數據會話服務器,我建議得到一個:)。這是深受簇中的所有節點已知並維護所有用戶的會話數據的服務器 -

+0

這是他不想做的,因爲他希望解決方案具有可擴展性。不過,我認爲這是唯一的出路。 – 2010-01-25 10:33:11

+0

我想擁有一個認證狀態的商店。我不想在服務器端存儲這個狀態。我有一些像http基本認證的想法,但想要更靈活(例如支持OpenID)。 – deamon 2010-01-25 10:43:30

1

您可以通過使用一個狀態服務器避免在集羣環境中的數據複製。每次用戶執行請求時,它都會將帶有會話ID的cookie發送到應用程序服務器;這個應該從狀態服務器檢索會話。這對asp.net開發是可能的,但我不確定Java支持這種方法有多容易。

+1

Java世界*必須爲此提供解決方案。這是最古老的高級Web平臺,並被無數企業應用程序所使用,這些應用程序在某些時候遇到同樣的問題。 – 2010-01-25 11:13:30

3

這提高了可擴展性,因爲需要羣集節點之間沒有會話複製。

首先,使用HTTP會話並沒有真正阻止你縮放,甚至使用HTTP會話狀態複製時(一些機制比其他的方式更聰明,例如WebLogic的in-memory replication沒有大的開銷) 。其次,你真的需要它嗎?大多數應用程序(大多數)不需要會話複製。第三,我的理解是否正確:你打算不使用HTTP Session嗎?

(...)在客戶端驗證後,使用用戶名和會話過期時間設置經過簽名和加密的cookie。

不要這樣做!不要將用戶名和服務器使用的其他敏感數據存儲在cookie中,這是一個非常糟糕的主意!您實際上需要承認,只有在某人弄清楚您的系統如何工作並將其破壞時(只要您的Cookie是crib攻擊的候選者),只是時間問題。 Sor,實際上,你應該在服務器端的Session中存儲數據,並且只有cookie中的一個ID,就像事情真的在起作用。這更安全。

這種方法好嗎?

號而你不需要這個可互操作的single-sign on(如果這是你正在試圖建立)。只需使用諸如 CAS Jasig這樣的集中式認證解決方案,其中包含各種技術的庫。

+0

我對此有疑問。如果我們將sessionID存儲在cookie中,並讓客戶端每次發送給服務器以識別cient,那麼有人可能會偷走這個sessionID並阻止他這個用戶?這讓我感到困惑,因爲如果壞人可以從cookie中竊取敏感的id數據,那麼sessionID實際上也是敏感的?我錯了嗎?謝謝! – Jaskey 2014-11-10 10:52:40

0

正如Pekka所說,不是一個好主意。你可以用敏感的會話數據攔截你的cookie。即使使用SSL,通過使用fiddler2一個人可以decrypt交通

+0

A並不意味着傳輸層安全性,而是對cookie數據本身進行加密 - 例如使用GnuPG。 – deamon 2010-01-25 16:27:21

+3

您對fiddler2解密SSL流量是錯誤的。這不是SSL/TLS設計中的漏洞,fiddler2只是充當代理,將自己而不是可信任的Web服務器與自動生成的(和不可信的!)證書進行對話,以便與客戶端發出的請求進行對話並將它們轉發給預期的目的地冒充HTTPS客戶端。這與說fiddler2可以解密SSL流量完全不同。如果情況確實如此,罪犯昨天將清空我們的銀行賬戶。 – amn 2010-02-06 18:46:11

+0

@amn:true;你只是攔截交通,得到它。奇怪的是,在給定的鏈接標題說「解密受HTTPS保護的流量」......這是誤導。它應該是「攔截」。正如在提琴手頁面所說的那樣,它允許「修改HTTPS保護的流量」,因此維護加密的cookie(如deamon所述)仍然不安全,因爲可以更改實際加密的cookie。 – lmsasu 2010-02-07 08:01:51

2

我不同意海報說這種方法是不安全的。它的各種變體被用於許多備受推崇的框架中,例如Rails和Play!,正是出於這些原因,並且它在正確實施時非常安全。