1. 程式人生 > 其它 >HTTP 使用者身份認證

HTTP 使用者身份認證

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)值,再存入伺服器。然而目前做三級專案之類的都直接明文儲存了......

所謂加鹽,就是伺服器隨機生成一個足夠長的字串,拼接在明文密碼尾部,之後通過雜湊函式生成雜湊值。