HTTP应该实现权限机制:即某些特定的内容只有特定用户才能访问;某些特定的事务只有特定的用户能够执行。此时,我们需要对用户进行认证。
认证
什么是认证
所谓认证, 就是用户给出身份证明,然后服务器加以验证。
HTTP认证模型:
HTTP提供了质询/响应认证框架用以简化认证过程。
- 1)Web应用程序收到HTTP请求
- 2)Web应用程序以一个“认证质询”作为响应
- 3)用户提供身份证明
- 4)服务器验证身份证明。
认证协议 和 首部
HTTP定义了两个官方的认证协议:基本认证和摘要认证。(开发人员也可以设计自己的认证协议)
不同的认证协议其对应的首部及实现机制会有所差别。 但认证一般包括以下步骤
步骤 | 首部 | 描述 | 方法/状态 |
---|---|---|---|
请求 | 第一条请求没有认证信息 | GET | |
质询 | WWW-Authenticate | 服务器拒绝第一条请求,并说明需要用户提供用户民个密码 | 401 Unauthorized |
授权 | Authorization | 客户端重新发出请求,请求中附加Authorization 用以说明认证算法、用户名、密码 | GET |
成功 | Authorization-Info | 如果授权成功,服务器会文档返回 | 200 OK |
安全域
为了让服务器上不同的资源有不同的认证权限,HTTP设计者提出了安全域的概念,其实现机制是:在WWW-Authenticate
质询中包含了一个realm
指令。 Web服务器会将受保护的文档组织成一个安全域,每个安全域有自己的授权用户集。
基本认证
基本认证是目前最流行的HTTP认证协议,几乎每个主要的HTTP客户端和服务器都实现了基本认证机制。
基本认证的流程
在基本认证中,Web服务器拒绝事务,质询客户端,请客户端提供用户名和密码。服务器返回401状态码来初始化质询,并用WWW-authenticate
响应首部指定要访问的安全域。 浏览器收到质询时,会打开客户端,请求用户输入这个域的用户名和密码。然后浏览器为用户名和密码添加扰码,再用Authorization
请求首部回复给服务器。
+ Base-64编码: 在基本认证中,用户名和密码被打包在一起,并用Base-64编码方式对其进行编码。
+ 代理认证: 中间的代理服务器也可以实现认证功能。 代理认证步骤域Web服务器身份认证步骤相同,但首部和状态码有一些区别。
基本认证的缺陷
基本认证很容易导致用户名和密码泄露。
在基本认证中,用户名和密码在网络中传输,尽管进行了(如Base-64编码方式)加密,这些密文也很容易被破解。就算没有被破解,恶意用户也可以直接使用密文的密码通过服务器的认证。
另外,一些恶意的用户也可以伪装成服务器骗取用户的用户名和密码。
摘要认证
尽管基本认证便捷灵活,但存在极大的安全性问题。针对认证的安全性,摘要认证做了一些改进,很大程度上避免了安全性问题。
以下是摘要认证做的一些改进错误:
- 永远不会以明文方式在网络上发送密码。(Base-64加密几乎相当于明文)
- 可以防止恶意用户捕获并重放认证的握手过程。
- 可以有选择低防止对报文内容的篡改。
- 防范一些其他的常见的攻击方式。
摘要认证涉及到的内容较多,且比较复杂,这里不太篇幅地介绍了。等到要使用时查阅一些相关的内容就可以了。