目前的用戶認(rèn)證多半是基于表單的認(rèn)證彬伦,基于表單的認(rèn)證方法并不是在HTTP協(xié)議中定義的滔悉。通過讓客戶端向服務(wù)器上的Web應(yīng)用程序發(fā)送登錄信息來實(shí)現(xiàn)用戶認(rèn)證。
鑒于HTTP是無狀態(tài)協(xié)議单绑,之前認(rèn)證成功的用戶狀態(tài)無法通過協(xié)議層面保存下來(無法實(shí)現(xiàn)狀態(tài)管理)回官。即使該用戶下一次繼續(xù)訪問,也無法將他與其他用戶區(qū)分開來搂橙。因此基于表單的認(rèn)證一般會(huì)使用Cookie來管理Session會(huì)話歉提。來解決HTTP協(xié)議的狀態(tài)管理問題。
客戶端把用戶ID和密碼等登錄信息放入報(bào)文的實(shí)體部分区转,把請(qǐng)求發(fā)送給服務(wù)器(通常以POST方法)苔巨。這時(shí)會(huì)使用HTTPS通信進(jìn)行登錄信息的發(fā)送。
服務(wù)器生成用以識(shí)別用戶的
Session ID
废离。對(duì)客戶端發(fā)送過來的登錄信息進(jìn)行身份認(rèn)證侄泽,然后將用戶的認(rèn)證狀態(tài)與Session ID
綁定,記錄在服務(wù)器端蜻韭。然后服務(wù)器會(huì)在響應(yīng)報(bào)文的首部字段Set-cookie
內(nèi)寫入Session ID
并返回響應(yīng)報(bào)文蔬顾。
如果
Session ID
被第三方盜走,對(duì)方就可以偽裝成被盜者的身份進(jìn)行而已操作湘捎。因此必須防止Session ID
被盜或被猜出。Session ID
通常使用難以推測(cè)的字符串窄刘,且服務(wù)端也要進(jìn)行會(huì)話有效期的管理窥妇,保證安全性。
- 客戶端接收到服務(wù)端發(fā)來的
Session ID
后娩践,會(huì)將其作為Cookie保存在本地活翩。下次向服務(wù)器發(fā)送請(qǐng)求時(shí),客戶端會(huì)自動(dòng)在請(qǐng)求報(bào)文中加入Cookie
翻伺。服務(wù)端便可以通過驗(yàn)證接收到的Session ID
識(shí)別用戶和其認(rèn)證狀態(tài)材泄。
關(guān)于服務(wù)端保存用戶密碼的保存方式,一種方法時(shí)先利用給密碼加鹽(salt)的方式增加額外信息吨岭,再使用散列(hash)函數(shù)計(jì)算出散列值后保存拉宗。
鹽(salt):服務(wù)器隨機(jī)生成的一個(gè)字符串(長(zhǎng)度足夠長(zhǎng),并且是真正隨機(jī)生成的)。又可分別固定鹽和隨機(jī)鹽旦事,隨機(jī)鹽是根據(jù)一定條件(比如密賬號(hào)的創(chuàng)建時(shí)間魁巩,用戶的賬戶名)隨機(jī)生成的,然后將它和密碼字符串連接起來生成散列值姐浮。即使兩個(gè)用戶使用同一個(gè)密碼谷遂,由于隨機(jī)生成的salt值不同,對(duì)應(yīng)的散列值也是不同的卖鲤。