目前的用戶認證多半是基于表單的認證,基于表單的認證方法并不是在HTTP協(xié)議中定義的。通過讓客戶端向服務器上的Web應用程序發(fā)送登錄信息來實現(xiàn)用戶認證。
鑒于HTTP是無狀態(tài)協(xié)議,之前認證成功的用戶狀態(tài)無法通過協(xié)議層面保存下來(無法實現(xiàn)狀態(tài)管理)。即使該用戶下一次繼續(xù)訪問,也無法將他與其他用戶區(qū)分開來。因此基于表單的認證一般會使用Cookie來管理Session會話。來解決HTTP協(xié)議的狀態(tài)管理問題。

客戶端把用戶ID和密碼等登錄信息放入報文的實體部分,把請求發(fā)送給服務器(通常以POST方法)。這時會使用HTTPS通信進行登錄信息的發(fā)送。
服務器生成用以識別用戶的
Session ID。對客戶端發(fā)送過來的登錄信息進行身份認證,然后將用戶的認證狀態(tài)與Session ID綁定,記錄在服務器端。然后服務器會在響應報文的首部字段Set-cookie內(nèi)寫入Session ID并返回響應報文。
如果
Session ID被第三方盜走,對方就可以偽裝成被盜者的身份進行而已操作。因此必須防止Session ID被盜或被猜出。Session ID通常使用難以推測的字符串,且服務端也要進行會話有效期的管理,保證安全性。
- 客戶端接收到服務端發(fā)來的
Session ID后,會將其作為Cookie保存在本地。下次向服務器發(fā)送請求時,客戶端會自動在請求報文中加入Cookie。服務端便可以通過驗證接收到的Session ID識別用戶和其認證狀態(tài)。
關(guān)于服務端保存用戶密碼的保存方式,一種方法時先利用給密碼加鹽(salt)的方式增加額外信息,再使用散列(hash)函數(shù)計算出散列值后保存。
鹽(salt):服務器隨機生成的一個字符串(長度足夠長,并且是真正隨機生成的)。又可分別固定鹽和隨機鹽,隨機鹽是根據(jù)一定條件(比如密賬號的創(chuàng)建時間,用戶的賬戶名)隨機生成的,然后將它和密碼字符串連接起來生成散列值。即使兩個用戶使用同一個密碼,由于隨機生成的salt值不同,對應的散列值也是不同的。