HTTP/1.1认证方式有如下几种:
1,BASIC认证(基本认证)
2,DIGEST认证(摘要认证)
3,SSL客户端认证
4,FORMBASE认证(基于表单认证)
BASIC认证:basic认证是在HTTP/1.0版本就定义的,目前由于它的不灵活性、达不到服务端所要求的安全等级、且如果再一次进行认证时它根本无法进行注销,因此该认证并不常用。下面看看它的实现过程:
1,客户端发起请求
get /private/ http/1.1
host:local.com
2,服务端收到请求后,返回一个响应:
http/1.1 401 authotization required
Date:Mon,19,Sep,2016 08:08:08 GMT
Server:Appache/2.2.3(unix)
www-authenticate:Basic realm="Input Your Name And Password"
此时服务器会随状态吗401及原因短语authotization required返回带首部字段的www-authenticate响应。该字段包含认证方式Basic以及request-URL的安全域字符串realm。
3,接受到服务器返回的要求认证响应报文后,服务端发送自己的ID及密码给服务器进行认证,该密码与ID是经过浏览器进行了BASE64编码:
get /private/ http/1.1
host:local.com
Authotization:Basic Z3VIc3Q6Z3VIc3Q=
4,服务器收到认证信息后,对认证信息的正确性进行确认,如正确则返回200状态码,否则返回401
http/1.1 200 OK
Date:Mon,19,Sep,2016 08:08:08 GMT
Server:Appache/2.2.3(unix)
DIGEST认证:该认证方式是在http/1.1时定义,它不同于BASIC认证的直接发送明文密码(BASE64只是一种编码方式,并不是加密),它是基于质询吗认证:
1,客户端发送请求
2,服务端返回一个响应,要求认证,认证方式为DIGEST。其中该报文必须包含realm与nonce两个字段的质询码
3,客户端根据返回响应报文里面的realm与nonce字段的质询码计算响应值,并发送给服务器进行认证
4,服务器收到响应值后,对其正确性进行确认,正确则返回200状态码,否则返回401
SSL客户端认证:SSL客户端认证是借由HTTPS客户端的证书完成认证,通常情况下与表单认证组合形成双因素认证:
1,客户端发起请求
2,服务器接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书
3,用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器
4,服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始 HTTPS 加密通信
SSL客户端认证需要客户端证书,该证书还是挺昂贵的。。
FORMBASE认证:基于表单的认证方法并不是在 HTTP 协议中定义的。客户端会向服务器上的 Web 应用程序发送登录信息(Credential),按登录信息的验证结果认证。
目前多半是基于表单认证,表单认证是采用cookie来管理session:
1,客户端把用户 ID 和密码等登录信息放入报文的实体部分,通常是以 POST 方法把请求发送给服务器。而这时,会使用 HTTPS 通信来进行 HTML 表单画面的显示和用户输入数据的发送
2,服务器会发放用以识别用户的 Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与 Session ID 绑定后记录在服务器端。向客户端返回响应时,会在首部字段 Set-Cookie 内写入 Session ID(如 PHPSESSID=028a8c…)。 你可以把 Session ID 想象成一种用以区分不同用户的等位号。然而,如果 Session ID 被第三方盗走,对方就可以伪装成你的身份进行恶意操作了。因此必须防止 Session ID 被盗,或被猜出。为了做到这点,Session ID 应使用难以推测的字符串,且服务器端也需要进行有效期的管理,保证其安全性。 另外,为减轻跨站脚本攻击(XSS)造成的损失,建议事先在 Cookie 内加上 httponly 属性。
3,客户端接收到从服务器端发来的 Session ID 后,会将其作为 Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送 Cookie,所以 Session ID 也随之发送到服务器。服务器端可通过验证接收到的 Session ID 识别用户和其认证状态