HTTP 用户身份认证


1. 有时,服务器端可能只希望特定的用户访问,那这个时候就需要服务器端确认客户端用户的身份。

2. HTTP 1.1 有四种对用户身份验证的方式:

(1)BASIC 认证

(2)DIGEST 认证

(3)SSL 客户端认证

(4)Web 表单认证

3. (1)BASIC 认证:HTTP 1.0 推出,通过用户输入信息来验证。

  (1) 服务器端返回 401 UnAuthorized 响应,携带 WWW-Authenticate 响应首部字段,指明认证方式为 BASIC。

  (2) 客户端需要填写用户名和密码,其将被经过 base64 编码后添加到 请求头 Authorization 字段,发送回服务器端。

  (3) 服务器端核对用户名和密码信息,进行身份认证。

BASIC 认证采用 base64 方式对用户信息编码,但这并不是加密,因此有安全隐患,同时 BASIC 认证无法注销,重新认证,所以一般不采用这种方式。

(2)DIGEST 认证:HTTP 1.1 推出,通过质询码和计算得到的响应码来验证。

  (1) 服务器端返回 401 状态码,携带 WWW-Authenticate 响应首部字段,指明认证方式为 DIGEST,同时此字段的值还包括 临时质询码 nonce【随机字符串】。

  (2) 客户端收到响应需要再次请求进行身份验证,请求首部字段 Authorization 中重要的字段值是 response,它是经过 MD5 算法运算后得到的密码字符串,也是回答质询码的响应码。

  (3) 服务器端接收请求,对身份验证。

DIGEST 认证虽然保证防止密码被窃听,但是不存在防止用户伪装的保护机制。

(3)SSL 客户端认证:借由 HTTPS 客户端证书验证身份。

  (1) 认证机构将客户端证书颁发给用户。

  (2) 服务器端要求用户提供客户端证书,用户将证书发送给服务器端。

  (3) 服务器端验证证书通过后,获取客户端的公开密钥,进行 HTTPS 加密通信。

SSL 客户端认证一般不仅会依靠证书认证,而是采用双因素认证,一方面验证证书,另一方面还需要表单验证【第四种方式】,两者组合。

SSL 客户端证书需要用户自己缴纳费用。

(4)表单验证:Web 应用程序提供验证页面,用户输入信息提交给服务器进行验证。

 

表单验证会使用到 Cookie 和 Session,HTTP 是无状态协议,HTTP 两次请求之间没有任何关系,之前的请求信息都不会被保留下来,因此需要借助 Cookie 管理 Session 实现状态管理。

 一般来说:(1)客户端将用户名和密码等数据放入报文实体主体,以 POST 请求方式提交到服务器端,使用 HTTPS 进行通信。

(2)服务器端验证身份后,将用户信息保存到服务器端,并给客户端发放 SessionID,也就是通过响应首部字段 Set-Cookie 设置 SessionID 值,它一般是随机的字符串,用以唯一标识一个用户。

(3)客户端收到响应后,将 Cookie 保存到本地,下次请求时,会携带上这个 SessionID 的 Cookie 一并发送给服务器端,之后服务器端可通过 SessionID 认证用户。

注:为了防止 XSS 跨站脚本攻击,建议事先在 Cookie 内加上 http-only 属性【这样服务器端和客户端都可以设置 Cookie,服务器端可以读取 Cookie,但客户端无法读取 Cookie】,此时 XSS 在客户端无法通过document.cookie 获取 Cookie,从而防止了 XSS 窃取 Cookie 中的信息。

对于服务器如何保存密码:一般是给密码加盐,之后计算散列(hash)值,再存入服务器。然而目前做三级项目之类的都直接明文保存了......

所谓加盐,就是服务器随机生成一个足够长的字符串,拼接在明文密码尾部,之后通过散列函数生成散列值。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM