确认访问用户身份的认证
核对的信息通常是指以下这些:
- 密码:只有本人才会知道的字符串信息
- 动态令牌:仅限本人持有的设备内显示的一次性密码
- 数字证书:仅限本人(终端)持有的信息
- 生物认证:指纹和虹膜等本人的生理信息
- IC卡等:仅限本人持有的信息
HTTP/1.1 使用的认证方式如下所示:
BASIC
认证(基本认证)DIGEST
认证(摘要认证)SSL
客户端认证FormBase
认证(基于表单认证)
BASIC认证
BASIC认证是从HTTP/1.0就定义的认证方式。
当一个客户端向一个需要认证的HTTP服务器进行数据请求时,如果之前没有认证过,HTTP
服务器会返回401
状态码,要求客户端输入用户名和密码。
用户输入用户名和密码后,用户名和密码会经过BASE64
加密附加到请求信息中再次请求HTTP
服务器,HTTP
服务器会根据请求头携带的认证信息,决定是否认证成功及做出相应的响应。
用户名和密码用:
合并,将合并后的字符串使用BASE64
加密为密文,每次请求时,将密文附于请求头中,服务器接收此密文,进行解析,判断是否认证。
缺点
HTTP
基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎都采取了这种方式。其缺点是没有灵活可靠的认证策略,另外,BASE64
的加密强度非常低,直接能在请求头中看到,几乎相当于明文了。
另外,除此之外想再进行一个BASIC认证时,一般的浏览器却无法实现注销认证操作。
DIGEST认证
摘要认证是另一种HTTP
认证协议,它试图修复基本认证协议的严重缺陷。具体来说,摘要认证进行了如下改进:永远不会以明文方式在网络上发送密码;
可以防止恶意用户捕获并重放认证的握手过程;可以有选择地防止对报文内容的篡改;防范其他几种常见的攻击方式。
通过下图可以了解摘要认证的工作原理:
在图a中,客户端请求了某个受保护文档
在图b中,在客户端能够证明其知道密码从而确认其身份之前,服务器拒绝提供文档。服务器向客户端发起质询,询问用户名和摘要形式的密码
在图c中,客户端传递了密码的摘要,证明它是知道密码的。服务器知道所有用户的密码,因此可以将客户提供的摘要与服务器自己计算得到的摘要进行比较,以验证用户是否知道密码。另一方在不知道密码的情况下,很难伪造出正确的摘要
在图d中,服务器将客户端提供的摘要与服务器内部计算出的摘要进行对比。如果匹配,就说明客户端知道密码。可以设置摘要函数,使其产生很多数字,让人不可能幸运地猜中摘要。服务器进行了匹配验证之后,会将文档提供给客户端——整个过程都没有在网络上发送密码。
SSL客户端认证
从使用用户ID和密码认证方式来讲,只要二者的内容正确,即可认证是本人的行为。但如果用户ID和密码被盗,就很有可能第三方冒充。利用SSL
客户端认证则可以避免该情况发生。
SSL/TLS
包括单向和双向认证,单向认证即是客户端认证服务端的,双向认证即是客户端和服务端互相认证。
SSL客户端采用双因素认证
多数情况下,SSL
客户端认证不仅会依靠证书完成认证,一般会基于表单认证组合形成一种双因素认证来使用。
Session管理及Cookie应用
由于HTTP
协议是无状态协议,所以会使用Cokkie
来管理Session
,用来区分不同的用户。
具体的实现过程如下:
- 客户端首次访问服务器时发送登录信息;
- 服务器接收到用户的登录信息后,返回的报文中包含
Session ID
的Cookie
. - 客户端下次访问服务器时会带上这个
Session ID
的Cookie
,服务器就可以区分不同的客户端了
但是为了保证数据的有效性,Cookie
一般具有有效期,由服务器端决定,超过有效期,客户端需要重新提交登录信息。