前言
認證功能能讓Web頁面只被有權限的人訪問。而認證機制究竟是怎樣一個原理呢?通過今天的學習能對這個有個大致的了解。
正文
什么是認證
計算機無法判斷對方的身份,需要客戶端自報家門。
服務端為確認客戶端是否真的具有訪問系統的權限,需要核對
“登錄者本人才知道的信息”、“登錄者本人才會有的信息”
HTTP使用的認證方式
HTTP/1.1使用的認證方式如下所示。
-
BASIC認證(基本認證)
-
DIGEST認證(摘要認證)
-
SSL客戶端認證
-
FormBase認證(基於表單認證)
Basic認證
Web服務器與通信客戶端之間進行的認證方式。
Basic認證的認證步驟
- 客戶端請求的資源需要BASIC認證,服務器隨401狀態碼(需要認證),返回帶WWW-Authenticate首部字段的響應。
- 接收到401狀態碼的客戶端為了通過BASIC認證,需要將用戶ID和密碼發送到服務器(冒號連接,再經過Base64編碼處理)。
- 接收到包含首部字段Authorization請求的服務器,會對信息的正確性進行驗證。(若通過,則返回一個包含Request-URI資源的響應)
PS:Basic認證所采用的Base64編碼並不是加密處理。
DIGEST認證
采用和Basic認證一樣的質詢/響應(challenge/response)的方式。
Digest認證的認證步驟:
- 客戶端請求需認證的資源時,服務器會隨401狀態碼返回帶WWW-Authenticate首部字段的響應,該字段包含質問響應方式認證所需的臨時質詢碼(隨機數,nonce)。
- 客戶端接收到401狀態碼,返回的響應中包含DIgest認證必須得首部字段Authenticate信息。(Authenticate中包含username,realm,nonce,uri和response的字段信息,realm和nonce是從服務器接收到的響應中的字段)
- 服務器接收到包含首部字段Authorization請求的服務器,確認認證信息的正確性。通過后返回包含Request-URI資源的響應。
SSL客戶端認證
借由HTTPS的客戶端證書完成認證的方式。
憑借客戶端證書認證,服務器可確認訪問是否來自已登錄的客戶端。
SSL客戶端認證的步驟:
需事先將客戶端證書分發給客戶端,且客戶端必須安裝此證書。
- 服務器接收到需要認證資源的請求時,服務器會發送Certificate Request報文,要求客戶端提供客戶端證書。
- 客戶端將客戶端證書信息以Client Certificate報文方式發送給服務器。
- 服務器驗證客戶端證書驗證通過后才能領取證書內客戶端的公開密鑰,然后開始HTTPS加密通信。
SSL客戶端認證采用雙因素認證
證書認證(SSL客戶端證書認證客戶端計算機)+表單認證(密碼用來確定是用戶本人的行為)
基於表單認證
並不是HTTP協議中定義的。客戶端向服務器上的Web應用程序發送登錄信息(Credential),按登錄信息的驗證結果認證。
認證多半為基於表單認證
BASIC和DIGEST幾乎不怎么使用(便利性和安全性考慮),SSL客戶端認證未普及(導入和維持費用等問題)
Session管理和Cookie應用
HTTP是無狀態協議,之前已認證成功的用戶狀態無法通過協議層面保存下來。即無法實現狀態管理,我們使用Cookie來管理Session(會話),以彌補HTTP協議中不存在的狀態管理功能。
步驟:
- 客戶端把用戶ID和密碼等登錄信息放入報文的實體部分,通常以POST請求的方式發送給服務器。
- 服務器會發放用以識別用戶的Session ID。通過驗證從客戶端發送過來的登錄信息進行身份認證,將用戶的認證狀態和Session ID綁定后記錄在服務器端。
- 客戶端接收到Session ID后,會將其作為Cookie保存在本地。下次向服務器發送請求時,瀏覽器自動發送Cookie,Session ID會隨之發送到服務器。服務端通過驗證接收到的Session ID識別用戶和其認證狀態。