HTTP基本認證

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

(跟隨一個換行,以Enter(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) (英語). 

參見

外部連結