HTTP基本認證
HTTP/HTTPS |
---|
版本 |
請求方法 |
報文主體 |
頭欄位 |
狀態碼 |
相關主題 |
在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) (英語).