Published on

cookie 和 session 登录鉴权

会话机制主要是为了解决 http 无状态的问题,目的是为了标识客户以及跟踪状态。如果要保证会话成立,那么就意味着用户的标识需要在客户端和服务端都存在。故下面情况会导致会话失效:

  • cookie 失效
  • session 失效或对应标识不存在

cookie 通俗理解可以理解为身份凭证,当你持有 cookie 访问服务器时,服务器会得知你的身份,如果身份验证有效,则代表此次请求成功。如图:

cookie 连接示意图

cookie 分为 2 种类型:

  • 会话 cookie
  • 持久性 cookie

上图中客户端拿到的是会话 cookie,会话 cookie 存储在浏览器内存中,当浏览器关闭时,cookie 就会跟随内存释放而消失,这时如果重新访问服务器则需要重新请求 cookie。

持久化 cookie 会存储在电脑硬盘上,不会随着浏览器关闭而消失。

cookie 返回的信息最大大小为 4kb。

session

session 保存在服务端,本质类似一个 Map,键值对方式来存储。

cookie 连接示意图

可以将用户信息存储在 session 中。

序列化

当服务器需要重启时,会将内存中的 session 序列化到磁盘上,等重启,会将其取回内存。

还有一种场景,如果用户过多,会导致 session 猛增,加大服务器的内存开销。为了减少内存开销,可以将不怎么活跃的用户的 session 序列化到磁盘上,并且将其从内存中释放,等用户重新活跃时,读取磁盘上的序列化文件,将其取回内存,并将磁盘上的文件删除。此过程称为 Session 的钝化和活化。

该鉴权方式优势

  • 简单
  • 用户信息在服务端,可以马上封禁用户。

鉴权方式缺点

  • 占用服务端内存,增加硬件成本
  • 多进程,多服务器下数据不好同步 - 需要第三方存储(例如:redis),成本高
  • 跨域传递 cookie 需要特殊配置