1. 有時,服務器端可能只希望特定的用戶訪問,那這個時候就需要服務器端確認客戶端用戶的身份。
2. HTTP 1.1 有四種對用戶身份驗證的方式:
(1)BASIC 認證
(2)DIGEST 認證
(3)SSL 客戶端認證
(4)Web 表單認證
3. (1)BASIC 認證:HTTP 1.0 推出,通過用戶輸入信息來驗證。
(1) 服務器端返回 401 UnAuthorized 響應,攜帶 WWW-Authenticate 響應首部字段,指明認證方式為 BASIC。
(2) 客戶端需要填寫用戶名和密碼,其將被經過 base64 編碼后添加到 請求頭 Authorization 字段,發送回服務器端。
(3) 服務器端核對用戶名和密碼信息,進行身份認證。
BASIC 認證采用 base64 方式對用戶信息編碼,但這並不是加密,因此有安全隱患,同時 BASIC 認證無法注銷,重新認證,所以一般不采用這種方式。
(2)DIGEST 認證:HTTP 1.1 推出,通過質詢碼和計算得到的響應碼來驗證。
(1) 服務器端返回 401 狀態碼,攜帶 WWW-Authenticate 響應首部字段,指明認證方式為 DIGEST,同時此字段的值還包括 臨時質詢碼 nonce【隨機字符串】。
(2) 客戶端收到響應需要再次請求進行身份驗證,請求首部字段 Authorization 中重要的字段值是 response,它是經過 MD5 算法運算后得到的密碼字符串,也是回答質詢碼的響應碼。
(3) 服務器端接收請求,對身份驗證。
DIGEST 認證雖然保證防止密碼被竊聽,但是不存在防止用戶偽裝的保護機制。
(3)SSL 客戶端認證:借由 HTTPS 客戶端證書驗證身份。
(1) 認證機構將客戶端證書頒發給用戶。
(2) 服務器端要求用戶提供客戶端證書,用戶將證書發送給服務器端。
(3) 服務器端驗證證書通過后,獲取客戶端的公開密鑰,進行 HTTPS 加密通信。
SSL 客戶端認證一般不僅會依靠證書認證,而是采用雙因素認證,一方面驗證證書,另一方面還需要表單驗證【第四種方式】,兩者組合。
SSL 客戶端證書需要用戶自己繳納費用。
(4)表單驗證:Web 應用程序提供驗證頁面,用戶輸入信息提交給服務器進行驗證。
表單驗證會使用到 Cookie 和 Session,HTTP 是無狀態協議,HTTP 兩次請求之間沒有任何關系,之前的請求信息都不會被保留下來,因此需要借助 Cookie 管理 Session 實現狀態管理。
一般來說:(1)客戶端將用戶名和密碼等數據放入報文實體主體,以 POST 請求方式提交到服務器端,使用 HTTPS 進行通信。
(2)服務器端驗證身份后,將用戶信息保存到服務器端,並給客戶端發放 SessionID,也就是通過響應首部字段 Set-Cookie 設置 SessionID 值,它一般是隨機的字符串,用以唯一標識一個用戶。
(3)客戶端收到響應后,將 Cookie 保存到本地,下次請求時,會攜帶上這個 SessionID 的 Cookie 一並發送給服務器端,之后服務器端可通過 SessionID 認證用戶。
注:為了防止 XSS 跨站腳本攻擊,建議事先在 Cookie 內加上 http-only 屬性【這樣服務器端和客戶端都可以設置 Cookie,服務器端可以讀取 Cookie,但客戶端無法讀取 Cookie】,此時 XSS 在客戶端無法通過document.cookie 獲取 Cookie,從而防止了 XSS 竊取 Cookie 中的信息。
對於服務器如何保存密碼:一般是給密碼加鹽,之后計算散列(hash)值,再存入服務器。然而目前做三級項目之類的都直接明文保存了......
所謂加鹽,就是服務器隨機生成一個足夠長的字符串,拼接在明文密碼尾部,之后通過散列函數生成散列值。