零、先从传统身份认证说起
HTTP是一种无状态的协议,也就是它并不知道谁是访问应用。把用户看成是客户端,客户端使用用户名还有密码通过了身份认证,不过下回这个客户端再发送请求的时候,服务端还得再验证一下,这就很麻烦。
对于这个情况的解决方法是:
当用户请求登录的时候,如果没有问题,我们在服务器端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在cookie里,下次这个用户再向服务器发送请求的时候,可以带着这个cookie,这样服务端会验证一个这个cookie里的信息,看看能不能在服务器端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
其实这个解决方法就是session,我们需要在服务端存储为登录的用户生成的session,这些session可能会存储在内存、磁盘或者数据库里。我们需要定期清理过期的session。
这种传统身份认证的问题是:
- Session:每次认证用户发起请求时,服务器需要去创建一个记录才存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。
- CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。
- CSRF(跨站请求伪造)攻击:用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。