前言
认证功能能让Web页面只被有权限的人访问。而认证机制究竟是怎样一个原理呢?通过今天的学习能对这个有个大致的了解。
正文
什么是认证
计算机无法判断对方的身份,需要客户端自报家门。
服务端为确认客户端是否真的具有访问系统的权限,需要核对
“登录者本人才知道的信息”、“登录者本人才会有的信息”
HTTP使用的认证方式
HTTP/1.1使用的认证方式如下所示。
-
BASIC认证(基本认证)
-
DIGEST认证(摘要认证)
-
SSL客户端认证
-
FormBase认证(基于表单认证)
Basic认证
Web服务器与通信客户端之间进行的认证方式。
Basic认证的认证步骤
- 客户端请求的资源需要BASIC认证,服务器随401状态码(需要认证),返回带WWW-Authenticate首部字段的响应。
- 接收到401状态码的客户端为了通过BASIC认证,需要将用户ID和密码发送到服务器(冒号连接,再经过Base64编码处理)。
- 接收到包含首部字段Authorization请求的服务器,会对信息的正确性进行验证。(若通过,则返回一个包含Request-URI资源的响应)
PS:Basic认证所采用的Base64编码并不是加密处理。
DIGEST认证
采用和Basic认证一样的质询/响应(challenge/response)的方式。
Digest认证的认证步骤:
- 客户端请求需认证的资源时,服务器会随401状态码返回带WWW-Authenticate首部字段的响应,该字段包含质问响应方式认证所需的临时质询码(随机数,nonce)。
- 客户端接收到401状态码,返回的响应中包含DIgest认证必须得首部字段Authenticate信息。(Authenticate中包含username,realm,nonce,uri和response的字段信息,realm和nonce是从服务器接收到的响应中的字段)
- 服务器接收到包含首部字段Authorization请求的服务器,确认认证信息的正确性。通过后返回包含Request-URI资源的响应。
SSL客户端认证
借由HTTPS的客户端证书完成认证的方式。
凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
SSL客户端认证的步骤:
需事先将客户端证书分发给客户端,且客户端必须安装此证书。
- 服务器接收到需要认证资源的请求时,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
- 客户端将客户端证书信息以Client Certificate报文方式发送给服务器。
- 服务器验证客户端证书验证通过后才能领取证书内客户端的公开密钥,然后开始HTTPS加密通信。
SSL客户端认证采用双因素认证
证书认证(SSL客户端证书认证客户端计算机)+表单认证(密码用来确定是用户本人的行为)
基于表单认证
并不是HTTP协议中定义的。客户端向服务器上的Web应用程序发送登录信息(Credential),按登录信息的验证结果认证。
认证多半为基于表单认证
BASIC和DIGEST几乎不怎么使用(便利性和安全性考虑),SSL客户端认证未普及(导入和维持费用等问题)
Session管理和Cookie应用
HTTP是无状态协议,之前已认证成功的用户状态无法通过协议层面保存下来。即无法实现状态管理,我们使用Cookie来管理Session(会话),以弥补HTTP协议中不存在的状态管理功能。
步骤:
- 客户端把用户ID和密码等登录信息放入报文的实体部分,通常以POST请求的方式发送给服务器。
- 服务器会发放用以识别用户的Session ID。通过验证从客户端发送过来的登录信息进行身份认证,将用户的认证状态和Session ID绑定后记录在服务器端。
- 客户端接收到Session ID后,会将其作为Cookie保存在本地。下次向服务器发送请求时,浏览器自动发送Cookie,Session ID会随之发送到服务器。服务端通过验证接收到的Session ID识别用户和其认证状态。