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
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 / "-" / "." / "_" / "~" / "+" / "/" ) *"="