HTTP/1.1认证方式:
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(表单认证)
BASIC认证
请求:
GET /private/http/1.1
Host: hack.jp
①服务器返回状态码401 Authorization Required,并带有WWW-Authenticate首部字段
HTTP/1.1 401 Authorization Required
其他字段...
WWW-Authenticate:Basic realm="Input your ID and password"
②用户ID和密码由冒号连接,经Base64编码后,写入首部字段Authorization,发送请求
GET /private/http/1.1
Host: hack.jp
Authorization: Z3Vlc3Q6Z3Vlc3Q=
③服务端接受到请求后,验证用户ID和密码,若通过则返回请求的资源,否则返回401响应
不足:用户ID和密码未加密处理,容易泄露
DIGEST认证
DIGEST认证规避了直接发送明文密码的缺点,采用质询码计算的方式来认证
请求:
GET /digest/http/1.1
Host: hack.jp
①服务器返回状态码401 Authorization Required,并带有WWW-Authenticate首部字段,并包含临时的质询码(随机数,nonce)
HTTP/1.1 401 Authorization Required
其他字段...
WWW-Authenticate:Digest realm="DIGEST",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/digest/", algorithm=MD5, qop="auth"
②客户端返回的响应中的首部字段Authorization必须包含username,realm,nonce,uri,response
其中username为realm限定范围内的用户名
realm和nonce为从服务器接受到的响应中的字段,uri是请求资源的地址
response是使用服务器回复报文中的nonce值,加上username,password, http method, http uri经过MD5运算后的密码字符串
GET /digest/http/1.1
Host: hack.jp
Authorization: Digest username="guest", realm="DIGEST",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/digest/", algorithm=MD5, qop=auth, response="6629fae49393a05397450978507c4ef1",cnonce="0a4f113b", nc=00000001
③服务端接受到请求后,根据username,查找出用户的password,用和客户端同样的方法计算出request-digest(response)。然后和收到的request-digest进行对比,如果一致,则验证成功,接受客户端的请求,成功返回结果。并带有Authentication-Info消息头。客户端根据该消息头中的参数进行服务器鉴权。
SSL客户端认证
使用SSL客户端认证,首先需要在客户端安装证书
①服务器接收到认证资源的请求后,会返回Certificate Request报文,要求客户端提供证书
②客户端选择要发送的证书后,以Client Certificate报文的方式发送给服务器
③服务器验证客户端证书通过后,获取证书内的公开密钥,开始HTTPS通信
多数情况下SSL客户端认证会和表单认证相结合,构成双因素认证(Two-factor authentication),SSL客户端证书认证计算机,表单密码认证用户本人
表单认证
WEB网站中的认证大多都是表单认证,即将用户名和密码以表单的方式,发送给服务器验证,一般会结合Cookie来管理会话(Session)
①客户端把用户ID和密码等登录信息放入报文的实体部分,通常以POST请求的方式发送给服务器
②服务器会发放用以识别用户的Session ID。通过验证从客户端发送过来的登录信息进行身份认证,将用户的认证状态和Session ID绑定后记录在服务器端。
向客户端发送响应时,会在首部字段Set-Cookie内写入Session ID(为防止XSS攻击,应事先在字段中加入httponly属性,避免Session ID被盗取)
③客户端收到服务端发送的Session ID后,将其保存在本地,下次请求时,浏览器会自动发送带有Session ID的Cookie,服务器通过验证Session ID识别用户和其认证状态