一文带你了解 HTTP 黑科技( 三 )


一文带你了解 HTTP 黑科技

文章插图
 
首先客户端发起一个 HTTP 请求 , 不带有任何认证标头 , 服务器对此 HTTP 请求作出响应 , 发现此 HTTP 信息未带有认证凭据 , 服务器通过 www-Authenticate标头返回 401 告诉客户端此请求未通过认证 。然后客户端进行用户认证 , 认证完毕后重新发起 HTTP 请求 , 这次 HTTP 请求带有用户认证凭据(注意 , 整个身份认证的过程必须通过 HTTPS 连接保证安全) , 到达服务器后服务器会检查认证信息 , 如果不符合服务器认证信息 , 会返回 403 Forbidden 表示用户认证失败 , 如果满足认证信息 , 则返回 200 OK 。
我们知道 , 客户端和服务器之间的 HTTP 连接可以被代理缓存重新发送 , 所以认证信息也适用于代理服务器 。
代理认证由于资源认证和代理认证可以共存 , 因此需要不同的头和状态码 , 在代理的情况下 , 会返回状态码 407(需要代理认证) ,  Proxy-Authenticate 响应头包含至少一个适用于代理的情况 , Proxy-Authorization请求头用于将证书提供给代理服务器 。下面分别来认识一下这两个标头
Proxy-AuthenticateHTTP Proxy-Authenticate 响应标头定义了身份验证方法 , 应使用该身份验证方法来访问代理服务器后面的资源 。它将请求认证到代理服务器 , 从而允许它进一步发送请求 。例如
Proxy-Authenticate: BasicProxy-Authenticate: Basic realm="Access to the internal site"Proxy-Authorization这个 HTTP 请求标头和上面的 Proxy-Authenticate 拼接很相似 , 但是概念不同 , 这个标头用于向代理服务器提供凭据 , 例如
Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l下面是代理服务器的请求/响应认证过程
一文带你了解 HTTP 黑科技

文章插图
 
这个过程和通用的过程类似 , 我们就不再详细展开描述了 。
禁止访问如果代理服务器收到的有效凭据不足以获取对给定资源的访问权限 , 则服务器应使用403 Forbidden状态代码进行响应 。与 401 Unauthorized 和 407 Proxy Authorization Required 不同 , 该用户无法进行身份验证 。
WWW-Authenticate 和 Proxy-Authenticate 头WWW-Authenticate 和 Proxy-Authenticate 响应头定义了获得对资源访问权限的身份验证方法 。他们需要指定使用哪种身份验证方案 , 以便希望授权的客户端知道如何提供凭据 。它们的一般表示形式如下
WWW-Authenticate: <type> realm=<realm>Proxy-Authenticate: <type> realm=<realm>我想你从上面看到这里一定会好奇 <type> 和 realm是什么东西 , 现在就来解释下 。
  • <type> 是认证协议 , Basic 是下面协议中最普遍使用的
RFC 7617 中定义了Basic HTT P身份验证方案 , 该方案将凭据作为用户ID /密码对传输 , 并使用 base64 进行编码 。(感兴趣的同学可以看看 https://tools.ietf.org/html/rfc7617)
其他的认证协议主要有
认证协议参考来源Basic查阅 RFC 7617 , base64编码的凭据Bearer查阅 RFC 6750 , 承载令牌来访问受 OAuth 2.0保护的资源Digest查阅 RFC 7616 , Firefox仅支持md5哈希 , 请参见错误bug 472823以获得SHA加密支持HOBA查阅 RFC 7486Mutual查阅 RFC 8120AWS4-Hmac-SHA256查阅 AWS docs
  • realm 用于描述保护区或指示保护范围 , 这可能是诸如 Access to the staging site(访问登陆站点) 或者类似的 , 这样用户就可以知道他们要访问哪个区域 。
Authorization 和 Proxy-Authorization 标头Authorization 和 Proxy-Authorization 请求标头包含用于通过代理服务器对用户代理进行身份验证的凭据 。在此 , 再次需要类型 , 其后是凭据 , 取决于使用哪种身份验证方案 , 可以对凭据进行编码或加密 。一般表示如下
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1lProxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1lHTTP 缓存通过把请求/响应缓存起来有助于提升系统的性能 , Web 缓存减少了延迟和网络传输量 , 因此减少资源获取锁需要的时间 。由于链路漫长 , 网络时延不可控 , 浏览器使用 HTTP 获取资源的成本较高 。所以 , 非常有必要把数据缓存起来 , 下次再请求的时候尽可能地复用 。当 Web 缓存在其存储中具有请求的资源时 , 它将拦截该请求并直接返回资源 , 而不是到达源服务器重新下载并获取 。这样做可以实现两个小目标


推荐阅读