HTTP中,基本認證(英語:Basic access authentication)是允許http用戶代理(如:網頁瀏覽器)在請求時,提供 用戶名口令 的一種方式。

在進行基本認證的過程里,請求的HTTP頭字段會包含Authorization字段,形式如下: Authorization: Basic <凭证>,該憑證是用戶和密碼的組和的base64編碼

最初,基本認證是定義在HTTP 1.0規範(RFC 1945)中,後續的有關安全的信息可以在HTTP 1.1規範(RFC 2616)和HTTP認證規範(RFC 2617)中找到。於1999年 RFC 2617 過期,於2015年的 RFC 7617 重新被定義。

MDN網站,已經有對應的維基文章[1]

優點

編輯

HTTP基本認證 是一種十分簡單的技術,使用的是 HTTP頭部字段 強制用戶訪問網絡資源,而不是通過必要的cookie、會話ID、登錄頁面等(非獲取訪問控制的)手段。

基本上所有流行的網頁瀏覽器都支持基本認證[2]。基本認證很少在可公開訪問的互聯網網站上使用,有時候會在小型私有系統中使用(如路由器網頁管理接口)。之後誕生的 HTTP摘要認證 用於替代基本認證,允許密鑰以相對安全的方式在不安全的通道上傳輸。

程序員和系統管理員有時會在可信網絡環境中使用基本認證。由於,基本認證使用的是Base64,可解碼成明文,因此使用Telnet等網絡協議工具進行監視時,可以直接獲取內容,並用於診斷。

缺點

編輯

基本認證 並沒有為傳送憑證(英語:transmitted credentials)提供任何機密性的保護。僅僅使用 Base64 編碼並傳輸,而沒有使用任何 加密散列算法。因此,基本認證常常和 HTTPS 一起使用,以提供機密性。

現存的瀏覽器保存認證信息直到標籤頁或瀏覽器被關閉,或者用戶清除歷史記錄。[3]HTTP沒有為服務器提供一種方法指示客戶端丟棄這些被緩存的密鑰。這意味着服務器端在用戶不關閉瀏覽器的情況下,並沒有一種有效的方法來讓用戶登出。

同時 HTTP 並沒有提供登出機制。但是,在一些瀏覽器上,存在清除憑證(credentials )緩存的方法。

原理

編輯

文字過程

編輯

這一個典型的HTTP客戶端和HTTP服務器的對話,服務器安裝在同一台計算機上(localhost),包含以下步驟:

  1. 客戶端請求一個需要身份認證的頁面,但是沒有提供用戶名和口令。這通常是用戶在地址欄輸入一個URL,或是打開了一個指向該頁面的鏈接
  2. 服務端響應一個401應答碼[4],並提供一個認證域(英語:Access Authentication[5],頭部字段為:WWW-Authenticate,該字段為要求客戶端提供適配的資源。[6] WWW-Authenticate: Basic realm="Secure Area" 該例子,Basic 為驗證的模式,realm="Secure Area"為保護域,用於與其他請求URI作區別。
  3. 接到應答後,客戶端顯示該認證域給用戶並提示輸入用戶名和口令。此時用戶可以選擇確定或取消。
  4. 用戶輸入了用戶名和口令後,客戶端軟件將對其進行處理,並在原先的請求上增加認證消息頭(英語:Authorization)然後重新發送再次嘗試。過程如下:
    1. 將用戶名和口令拼接為用户:密码形式的字符串。
    2. 如果服務器WWW-Authenticate字段有指定編碼,則將字符串編譯成對應的編碼(如:UTF-8)。
    3. 將字符串編碼為base64。
    4. 拼接Basic ,放入Authorization頭字段,就像這樣:Authorization Basic 字符串。 示例:用戶名:Aladdin ,密碼:OpenSesame ,拼接後為Aladdin:OpenSesame,編碼後QWxhZGRpbjpPcGVuU2VzYW1l,在HTTP頭部里會是這樣:Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l。 Base64編碼並非加密算法,其無法保證安全與隱私,僅用於將用戶名和口令中的不兼容的字符轉換為均與HTTP協議兼容的字符集。
  5. 在本例中,服務器接受了該認證屏幕並返回了頁面。如果用戶憑據非法或無效,服務器可能再次返回401應答碼,客戶端可以再次提示用戶輸入口令。

注意:客戶端有可能不需要用戶交互,在第一次請求中就發送認證消息頭。

電文過程

編輯

1.客戶端請求(沒有認證信息)

編輯
GET /private/index.html HTTP/1.0
Host: localhost

(跟隨一個換行,以回車(CR)換行(LF)的形式)

2.服務端應答

編輯
HTTP/1.0 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
  <HEAD>
    <TITLE>Error</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
  </HEAD>
  <BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>

3.客戶端請求(有認證信息)

編輯

用戶名「Aladdin」,口令 「open sesame」

GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

(跟隨一個空行,如上所述)

Authorization消息頭的用戶名和口令的值可以容易地編碼和解碼。

4.服務端的應答

編輯
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

(跟隨一個空行,隨後是需憑據頁的HTML文本)。

參考文獻和注釋

編輯
  1. ^ HTTP 身份验证. MDN Web 文檔. [2020-01-29]. (原始內容存檔於2020-04-14) (中文). 
  2. ^ 這裡的「所有的流行網頁瀏覽器」包括任何目前市場份額超過0.2%的網頁瀏覽器,參見網頁瀏覽器比較了解網頁瀏覽器對HTTP的支持
  3. ^ 存档副本. [2010-07-10]. (原始內容存檔於2010-05-26). 
  4. ^ RFC 1945 Section 11. Access Authentication. IETF: 46. May 1996 [3 February 2017]. (原始內容存檔於2010-11-30). 
  5. ^ T., Fielding, Roy; Tim, Berners-Lee; Henrik, Frystyk. Hypertext Transfer Protocol -- HTTP/1.0. tools.ietf.org. [2020-01-28]. (原始內容存檔於2020-01-25). 
  6. ^ Frystyk, Henrik. Hypertext Transfer Protocol -- HTTP/1.0. tools.ietf.org. [2020-01-28]. (原始內容存檔於2020-04-15) (英語). 

參見

編輯

外部連結

編輯