2010-10-06 92 views
4

我想使用HTTPS來保護我的客戶端和服務器之間的通信。第一次加密通信將用於認證用戶 - 即檢查他/她的用戶名和密碼。使用HTTPS進行客戶端 - 服務器通信

用戶憑證將成功由服務器檢查後,我想開始在後續請求中獲取一些數據。但是服務器將如何確定後續請求是由用戶發送的,而用戶的憑證已被檢查?

由於TCP連接可能在登錄和後續HTTPS請求之間關閉,(我認爲)這意味着SSL上下文必須由服務器釋放,所以通過新的GET請求,必須建立新的TCP連接並新的SSL(TLS)握手必須完成(即加密的新共享密碼必須由雙方交換等)

爲此,我認爲服務器需要發送回客戶端200 OK響應初始身份驗證請求會隨機生成一些隨機生成的隨機數(在某個時間內有效),我將在隨後的每個請求中包含該數據,以便服務器能夠基於此隨機生成的隨機數檢測哪個用戶名位於請求後面,檢查該用戶是否已經登錄我的理解是否正確?

非常感謝您的答覆 BR 斯登

回答

2

最簡單的方法是,要求所有通信通過HTTPS去(這樣的數據是保密的,不是客戶端的其他人,服務器可以看到它)和對該安全連接中的每個請求使用簡單的用戶名和密碼。這在實踐中很簡單(用戶名和密碼實際上是通過HTTP頭進行連接的,因爲我們使用的是HTTPS),並且服務器每次都可以檢查允許用戶被允許使用。您不必擔心SSL握手;這就是SSL/HTTPS層的責任(這就是爲什麼HTTPS/SSL是不錯)。

或者,登錄可以用任何方法完成,並生成存儲在會話cookie中的某種幻數(例如,UUID或隨機數和用戶名的密碼散列)。隨後的請求可以檢查幻數是否可以從會話開始時識別出來(並且自從發佈後沒有太多時間);註銷只是忘記了服務器端的神奇數字(並要求客戶忘記)。實現這一點還有一些工作要做,但仍然不難,服務器端有庫來處理驢工作。

第一個選項特別適合您寫程序的地方,因爲它很容易實現。如果客戶端是網頁瀏覽器,第二種選擇更好,因爲它允許用戶更好地控制瀏覽器授權的時間(程序API不需要這樣的事情)。無論客戶何時成爲瀏覽器,您都需要注意防範其他類型的攻擊(例如,各種類型的請求僞造),但這幾乎與其他任何事情無關。

+0

嗨,非常感謝您的評論!所有通信都會通過HTTPS進行 - 無一例外。我也是這樣想的 - 在每個請求中發送用戶名/密碼或者讓服務器用一些魔法回覆第一個請求,然後我將在每個請求中使用它,而不是重複用戶名/密碼(我的客戶端不是瀏覽器,但自定義應用程序)。我認爲這兩種方法都差不多,而第二種方法需要在服務器上完成更多的工作。我可以問你什麼是行業標準? HTTPS應用程序是否以重新發送每個請求中的用戶名/密碼的方式創建?謝謝,BR STeN – STeN 2010-10-06 12:22:06

+0

@STeN:有幾個「行業標準」,取決於您的要求是什麼。我列出了以上兩種非常常見的常見使用模式。還有其他的(例如,SSL級別的客戶端證書),但它們不太常見,並且更容易遇到獲取便攜式實施或良好部署的問題。 – 2010-10-06 23:41:23

+0

謝謝 - 你的建議非常好! – STeN 2010-10-07 04:15:13

0

在你的案例中發明自定義認證機制是非常危險的 - 很容易犯一個錯誤,會讓很多錯誤的做法。因此,正確的做法就像使用HTTPS並在每個請求中傳遞用戶憑證一樣。

+0

嗨,我將只使用HTTPS。但服務器仍然需要知道誰正在訪問它。通信必須安全,但用戶必須通過身份驗證才能訪問系統。正如Donal Fellows先生在下面的評論中所建議的 - 最簡單的方法是在每個請求中包含用戶名和密碼......感謝您的評論。 – STeN 2010-10-06 12:31:17