Skip to content

Hypertext Transfer Protocol (HTTP/1.1): Authentication

1. Introduction

HTTP 提供了一个通用的访问控制和认证框架,通过一组可扩展的质询 - 响应认证方案,服务器可以使用这些方案来质询客户端请求,而客户端则可以提供认证信息。本文件定义了 HTTP/1.1 认证框架。

2. Access Authentication Framework

2.1. Challenge and Response

HTTP 提供了一个简单的质询 - 响应认证框架,用于服务器质询客户端请求和客户端提供认证信息。它使用不区分大小写的 token 来标识认证方案,后跟实现该方案所需的附加信息。

  • 质询:服务器通过 401(未授权)响应消息质询客户端,包含至少一个适用于请求资源的质询。
  • 代理质询:代理服务器通过 407(需要代理认证)响应消息质询客户端,包含至少一个适用于代理的质询。
  • 认证信息:客户端通过 Authorization 头字段提供认证信息,代理认证则使用 Proxy-Authorization 头字段。

2.2. Protection Space (Realm)

"realm"认证参数用于指示保护范围。保护空间由服务器的根 URI 和 realm 值(如果有)组合定义。这些保护空间允许服务器上的受保护资源划分成不同的区域,每个区域有其自己的认证方案和/或授权数据库。

3. Status Code Definitions

3.1. 401 Unauthorized

401(未授权)状态码表示请求因缺少有效的认证凭据而无法执行。服务器必须发送一个包含至少一个质询的 WWW-Authenticate 头字段。

3.2. 407 Proxy Authentication Required

407(需要代理认证)状态码类似于 401,但表示客户端需要认证以使用代理。代理服务器必须发送一个包含至少一个质询的 Proxy-Authenticate 头字段。

4. Header Field Definitions

4.1. WWW-Authenticate

"WWW-Authenticate"头字段指示适用于目标资源的认证方案和参数。服务器在生成 401 响应时必须发送该头字段。

4.2. Authorization

"Authorization"头字段允许用户代理在收到 401 响应后进行自我认证。其值包含用户代理针对请求资源领域的认证信息。

4.3. Proxy-Authenticate

"Proxy-Authenticate"头字段包含至少一个质询,指示适用于代理的认证方案和参数。代理服务器在生成 407 响应时必须发送该头字段。

4.4. Proxy-Authorization

"Proxy-Authorization"头字段允许客户端向需要认证的代理进行自我认证。其值包含客户端针对代理和/或请求资源领域的认证信息。

5. IANA Considerations

5.1. Authentication Scheme Registry

"HTTP 认证方案注册表"定义了质询和凭据中的认证方案命名空间,包含注册的认证方案及其对应的规范。

5.2. Status Code Registration

更新了 HTTP 状态码注册表,包含 401(未授权)和 407(需要代理认证)状态码。

5.3. Header Field Registration

更新了 HTTP 头字段注册表,包含 Authorization、Proxy-Authenticate、Proxy-Authorization 和 WWW-Authenticate 头字段。

6. Security Considerations

6.1. Confidentiality of Credentials

HTTP 认证框架不定义单一的凭据保密机制,而是由每个认证方案定义其凭据编码方式。HTTP 依赖底层传输层或会话层连接的安全性来确保头字段的机密传输。

6.2. Authentication Credentials and Idle Clients

现有的 HTTP 客户端通常会无限期地保留认证信息。HTTP 没有机制让服务器指示客户端丢弃这些缓存的凭据,认证方案定义中可以指定凭据的过期或撤销机制。

6.3. Protection Spaces

仅依赖"realm"机制的认证方案会将凭据暴露给服务器上的所有资源。为了防止不同资源收集其他资源的认证凭据,可以将保护空间分离,例如使用不同的主机名或端口号。

ABNF

abnf
Authorization = credentials

BWS = <BWS, see [RFC7230], Section 3.2.3>

OWS = <OWS, see [RFC7230], Section 3.2.3>

Proxy-Authenticate = *( "," OWS ) challenge *( OWS "," [ OWS challenge ] )
Proxy-Authorization = credentials

WWW-Authenticate = *( "," OWS ) challenge *( OWS "," [ OWS challenge ] )

auth-param = token BWS "=" BWS ( token / quoted-string )
auth-scheme = token

challenge = auth-scheme [ 1*SP ( token68 / [ ( "," / auth-param ) *( OWS "," [ OWS auth-param ] ) ] ) ]
credentials = auth-scheme [ 1*SP ( token68 / [ ( "," / auth-param ) *( OWS "," [ OWS auth-param ] ) ] ) ]

quoted-string = <quoted-string, see [RFC7230], Section 3.2.6>

token = <token, see [RFC7230], Section 3.2.6>
token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"="