因为最近在搭博客,有涉及到登录这方面的功能。于是总结一下登录的实现原理。
HTTP 协议是无状态的,怎么能记录用户的登录状态呢?
鉴于 HTTP 是无状态协议,之前已认证成功的用户状态是无法通过协议层面保存下来的,即,无法实现状态管理,因此即使当该用户下一次继续访问,也无法区分他和其他的用户。但是HTTP请求每次都会带上cookie,所以,cookie是实现登录的基础。
当前端将用户名和密码发来之后,会将用户名和密码与数据库当中的用户信息进行比对,一致后,我们会在cookie中写入一些信息,标识此用户已经登录。(简单的原理,不涉及加密解密)
cookie的问题
由于考虑到安全性,用户的一些信息并不应该在cookie中传输,于是有了session
,即:在用户端储存userid,在服务器端对应usernname
session
session意思为会话,它只保存在当前浏览器的会话当中。当发生第一次http请求后,服务器端生成一个独一无二的标识A写在发送这次请求的客户端的cookie中,然后下一次客户端请求会带上这个标识A,那么服务器端拿着这个标识A去查找对应的数据,从而识别用户和其认证状态。
session解决了cookie保存用户状态,并且不会泄露用户信息的问题。
session的问题
session解决了cookie的问题,但是本身在实现session的方式上也存在问题。因为session本身可以理解为一个变量,它储存在进程内存当中,所以带来以下问题
1.进程内存有限,访问量过大的时候,内存暴增怎么办?
2.进程上线后,内存是多进程的,进程之间内存无法共享,并且进程之间通信很麻烦
为了解决这个问题,于是有了redis来解决这个问题,redis的解决方法以后再解析。