某些
Web
页面只想让特定的人浏览,或者干脆仅本人可见。为达到这个目标,必不可少的就是认证功能。下面我们一起来学习一下认证机制。
一、何为认证
计算机本身无法判断坐在显示器前的使用者的身份。进一步说,也无法确认网络的那头究竟有谁。为了弄清究竟是谁在访问服务 器,就得让对方的客户端自报家门。核对的信息通常是指以下这些。
- 密码:只有本人才会知道的字符串信息。
- 动态令牌:仅限本人持有的设备内显示的一次性密码。
- 数字证书:仅限本人(终端)持有的信息。
- 生物认证:指纹和虹膜等本人的生理信息。
- IC 卡等:仅限本人持有的信息。
HTTP 使用的认证方式 HTTP/1.1 使用的认证方式如下所示。
- BASIC 认证(基本认证)
- DIGEST 认证(摘要认证)
- SSL 客户端认证
- FormBase 认证(基于表单认证)
1、BASIC 认证
2、DIGEST 认证(HTTP/1.1)
3、SSL 客户端认证
用户ID和密码只要两者内容正确,即可认证是本人的行为。但如果用户ID和密码被盗,就很可能被第三者冒充。SSL客户端认证可以避免该情况的发生。凭客户端认证,服务器可能确认访问是否来自己登录的客户端。
- SSL客户端认证的认证步骤:1. 服务器发送Certificate Request报文,要求客户端提供客户端证书——>2. 客户端将证书以Client Certificate报文方式发送给服务器——>3. 服务器验证客户端证书验证通过后方可领取客户端单公开密钥,开始HTTPS加密通信。
- SSL客户端认证采用双因素认证:
- SSL客户端证书用来认证客户端计算机
- 密码用来确认这是本人行为
- SSL客户端认证必要的费用:从认证机构购买客户端证书的费用,以及服务器运行者为保证自己搭建的认证机构安全运营所产生的费用。
4、基于表单认证
客户端会向服务器上的web应用程序发送登录信息,按登录信息的验证结果认证。多数情况下,输入已事先登录的用户 ID(通常是任意字符串或邮件 地址)和密码等登录信息后,发送给 Web 应用程序,基于认证结果 来决定认证是否成功。
- 认证多半基于表单认证:DIGEST和BASIC认证几乎不使用,SSL客户端认证代价太高,尚未普及。SSH和FTP协议合乎标准并且满足安全使用级别,因此这些协议的认证可以直接拿来使用。
二、Session 管理及 Cookie 应用
基于表单认证本身是通过服务器端的 Web 应用,将客户端发送过来 的用户 ID 和密码与之前登录过的信息做匹配来进行认证的。 但鉴于 HTTP 是无状态协议,之前已认证成功的用户状态无法通过协 议层面保存下来。即,无法实现状态管理,因此即使当该用户下一次 继续访问,也无法区分他与其他的用户。于是我们会使用 Cookie 来 管理 Session,以弥补 HTTP 协议中不存在的状态管理功能。
- 服务器会发放用以识别用户的session ID。通过验证从客户端发送过来的登录信息进行身份验证,然后把用户的认证状态与Session ID绑定后记录在服务器端。返回响应时,会在Set-Cookie内写入Session ID中。因此必须防止Session ID被盗。为了做到这点,Session ID应使用难以推测的字符串,服务器也要进行有效期管理,保证安全性,建议事先在Cookie内加上httponly属性。
- 客户端接收到从服务端发来的Session ID后,会将其作为Cookie保存在本地。下次向服务器发送请求时,会自动发送Cookie,所以Session ID也随之发送到服务器。服务器端可通过验证接收到的 Session ID 识别用户和其认证状态