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 重新被定義。
優點
編輯HTTP基本認證 是一種十分簡單的技術,使用的是 HTTP頭部字段 強制用戶訪問網絡資源,而不是通過必要的cookie、會話ID、登錄頁面等(非獲取訪問控制的)手段。
基本上所有流行的網頁瀏覽器都支持基本認證[2]。基本認證很少在可公開訪問的互聯網網站上使用,有時候會在小型私有系統中使用(如路由器網頁管理接口)。之後誕生的 HTTP摘要認證 用於替代基本認證,允許密鑰以相對安全的方式在不安全的通道上傳輸。
程序員和系統管理員有時會在可信網絡環境中使用基本認證。由於,基本認證使用的是Base64,可解碼成明文,因此使用Telnet等網絡協議工具進行監視時,可以直接獲取內容,並用於診斷。
缺點
編輯基本認證 並沒有為傳送憑證(英語:transmitted credentials)提供任何機密性的保護。僅僅使用 Base64 編碼並傳輸,而沒有使用任何 加密 或 散列算法。因此,基本認證常常和 HTTPS 一起使用,以提供機密性。
現存的瀏覽器保存認證信息直到標籤頁或瀏覽器被關閉,或者用戶清除歷史記錄。[3]HTTP沒有為服務器提供一種方法指示客戶端丟棄這些被緩存的密鑰。這意味着服務器端在用戶不關閉瀏覽器的情況下,並沒有一種有效的方法來讓用戶登出。
同時 HTTP 並沒有提供登出機制。但是,在一些瀏覽器上,存在清除憑證(credentials )緩存的方法。
原理
編輯文字過程
編輯這一個典型的HTTP客戶端和HTTP服務器的對話,服務器安裝在同一台計算機上(localhost),包含以下步驟:
- 客戶端請求一個需要身份認證的頁面,但是沒有提供用戶名和口令。這通常是用戶在地址欄輸入一個URL,或是打開了一個指向該頁面的鏈接。
- 服務端響應一個401應答碼[4],並提供一個認證域(英語:Access Authentication)[5],頭部字段為:
WWW-Authenticate
,該字段為要求客戶端提供適配的資源。[6]WWW-Authenticate: Basic realm="Secure Area"
該例子,Basic
為驗證的模式,realm="Secure Area"
為保護域,用於與其他請求URI作區別。 - 接到應答後,客戶端顯示該認證域給用戶並提示輸入用戶名和口令。此時用戶可以選擇確定或取消。
- 用戶輸入了用戶名和口令後,客戶端軟件將對其進行處理,並在原先的請求上增加認證消息頭(英語:Authorization)然後重新發送再次嘗試。過程如下:
- 將用戶名和口令拼接為
用户:密码
形式的字符串。 - 如果服務器
WWW-Authenticate
字段有指定編碼,則將字符串編譯成對應的編碼(如:UTF-8)。 - 將字符串編碼為base64。
- 拼接
Basic
,放入Authorization
頭字段,就像這樣:Authorization Basic 字符串
。 示例:用戶名:Aladdin
,密碼:OpenSesame
,拼接後為Aladdin:OpenSesame
,編碼後QWxhZGRpbjpPcGVuU2VzYW1l
,在HTTP頭部里會是這樣:Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
。 Base64編碼並非加密算法,其無法保證安全與隱私,僅用於將用戶名和口令中的不兼容的字符轉換為均與HTTP協議兼容的字符集。
- 將用戶名和口令拼接為
- 在本例中,服務器接受了該認證屏幕並返回了頁面。如果用戶憑據非法或無效,服務器可能再次返回401應答碼,客戶端可以再次提示用戶輸入口令。
注意:客戶端有可能不需要用戶交互,在第一次請求中就發送認證消息頭。
電文過程
編輯1.客戶端請求(沒有認證信息)
編輯GET /private/index.html HTTP/1.0
Host: localhost
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文本)。
參考文獻和注釋
編輯- ^ HTTP 身份验证. MDN Web 文檔. [2020-01-29]. (原始內容存檔於2020-04-14) (中文).
- ^ 這裡的「所有的流行網頁瀏覽器」包括任何目前市場份額超過0.2%的網頁瀏覽器,參見網頁瀏覽器比較了解網頁瀏覽器對HTTP的支持
- ^ 存档副本. [2010-07-10]. (原始內容存檔於2010-05-26).
- ^ RFC 1945 Section 11. Access Authentication. IETF: 46. May 1996 [3 February 2017]. (原始內容存檔於2010-11-30).
- ^ T., Fielding, Roy; Tim, Berners-Lee; Henrik, Frystyk. Hypertext Transfer Protocol -- HTTP/1.0. tools.ietf.org. [2020-01-28]. (原始內容存檔於2020-01-25).
- ^ Frystyk, Henrik. Hypertext Transfer Protocol -- HTTP/1.0. tools.ietf.org. [2020-01-28]. (原始內容存檔於2020-04-15) (英語).