Cookie 和 Session
会话控制
HTTP 协议是一个无状态的协议,它无法区分多次请求是否发送自同一客户端。
而我们在实际的使用中,却有大量的这种需求,我们需要通过会话的控制来解决该问题。
Cookie
是什么?
本质就是一个【字符串】,里面包含着浏览器和服务器沟通的信息(交互时产生的信息)。
存储的形式以:【key-value】的形式存储。
浏览器会自动携带该网站的 cookie,只要是该网站下的 cookie,全部携带。
分类:
会话 cookie
关闭浏览器后,会话 cookie 会自动消失,会话 cookie 存储在浏览器运行的那块【内存】上。
持久化 cookie
看过期时间,一旦到了过期时间,自动销毁,存储在用户的硬盘上。
备注:如果没有到过期时间,同时用户清理了浏览器的缓存,持久化 cookie 也会消失。
工作原理:
- 当浏览器第一次请求服务器的时候,服务器可能返回一个或多个 cookie 给浏览器
- 浏览器判断 cookie 种类
- 会话 cookie:存储在浏览器运行的那块内存上
- 持久化 cookie:存储在用户的硬盘上
- 以后请求该网站的时候,自动携带上该网站的所有 cookie(无法进行干预)
- 服务器拿到之前设置的 cookie,分析里面的内容,校验 cookie 的合法性,根据 cookie 里保存的内容,进行具体的业务逻辑。
应用:
解决 http 无状态的问题(例子:7 天免登录,一般来说不会单独使用 cookie,一般配合后台的 session 存储使用)
不同的语言、不同的后端架构 cookie 的具体语法是不一样的,但是 cookie 原理和工作过程是不变的。
备注:cookie 不一定只由服务器生成,前端同样可以生成 cookie,但是前端生成的 cookie 几乎没有意义。
对比浏览器的本地存储:
- localStorage:
- 保存的数据,只要用户不清除,一直存在
- 作为一个中转人,实现跨页签通信。
- 保存数据的大小:5MB - 10MB
- sessionStorage:
- 保存的数据,关闭浏览器就消失
- 保存数据的大小:5MB - 10MB
- cookie:
- 分类:会话 cookie----关浏览器消失; 持久化 cookie----到过期时间消失
- 保存数据的大小:4K --- 8K
- 主要用于解决 http 无状态(一般配合后端的 session 会话存储使用)
- 浏览器请求服务器时,会自动携带该网站的所有 cookie
- localStorage:
Session
是什么?
标准来说,session 这个单词指的是会话。
前端通过浏览器去查看 cookie 的时候,会发现有些 cookie 的过期时间是:session,意味着该 cookie 是会话 cookie。 2. 后端人员常常把【session 会话存储】简称为:session 存储,或者更简单的称为:session
特点:
- 存在于服务端
- 存储的是浏览器和服务器之间沟通产生的一些信息
默认 session 的存储在服务器的内存中,每当一个新客户端发来请求,服务器都会新开辟出一块空间,供 session 会话存储使用。
工作流程:
- 第一次浏览器请求服务器的时候,服务器会开辟出一块内存空间,供 session 会话存储使用。
- 返回响应的时候,会自动返回一个 cookie(有时候会返回多个,为了安全),cookie 里包含着,上一步产生会话存储“容器”的编号 (id)
- 以后请求的时候,会自动携带这个 cookie,给服务器。
- 服务器从该 cookie 中拿到对应的 session 的 id,去服务器中匹配。
- 服务器会根据匹配信息,决定下一步逻辑
备注:
- 一般来说 cookie 一定会配合 session 使用。
- 服务端一般会做 session 的持久化,将 session 保存在数据库中,防止由于服务器重启,造成 session 的丢失。
- session 什么时候销毁?
- 服务器没有做 session 的持久化的同时,服务器重启了。
- 给客户端种下的那个用于保存 session 编号的 cookie 销毁了,随之服务器保存的 session 销毁(不管是否做了 session 的持久化)。
- 用户主动在网页上点击了“注销” “退出登录”等等按钮。
cookie 和 session 的区别
存在的位置:
cookie 存在于客户端,临时文件夹中;
session 存在于服务器的内存中,一个 session 域对象为一个用户浏览器服务
安全性:
cookie 是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放;
session 存放于服务器的内存中,所以安全性好
网络传输量:
cookie 会传递消息给服务器;
session 本身存放于服务器,但是通过 cookie 传递 id,会有少量的传送流量
生命周期(以 20 分钟为例):
cookie 的生命周期是累计的,从创建时,就开始计时,20 分钟后,cookie 生命周期结束;
session 的生命周期是间隔的,从创建时,开始计时,如在 20 分钟,没有访问 session,那么 session 生命周期被销毁;
但是,如果在 20 分钟内(如在第 19 分钟时)访问过 session,那么,将重新计算 session 的生命周期;
关机会造成 session 生命周期的结束,但是对 cookie 没有影响。
访问范围:
session 为一个用户浏览器独享;
cookie 为多个用户浏览器共享
大小:
cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 50 个 cookie;
session 保存数据理论上没有任何限制(内存有多大就能有多大)
数据加密的方法
MD5、sha1
使用:
- 下载对应的包
npm i md5
- 引入
const md5 = require('md5')
- 使用
md5(value)