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)值,再存入服务器。然而目前做三级项目之类的都直接明文保存了......
所谓加盐,就是服务器随机生成一个足够长的字符串,拼接在明文密码尾部,之后通过散列函数生成散列值。