1. 概念:
- 是一个数据对象,用来存储信息。
- 是一个抽象对象,指代多个有关联的http请求所构成的一个会话。多次请求之间能够共享一些信息。
2. 实现方案:
- 方案1:在每个请求的参数或者数据中带上相关的信息。不受 cookie 限制,但是受到 请求长度的限制。
- 方案2:用 cookie 存储,可以是整个session 的具体数据,也可以是 session的标识(sessin_id).
3. 特点:
- 只存在于 服务端。
- 并不是 服务器 原生支持的。是中间件自己创建并管理的。
- session 仅仅是一个对象信息,可以存到 cookie ,也可以存到任何地方(如内存,数据库)。
- 存到哪,可以开发者自己决定。
- session_id,是唯一的标识 session 的,以及其他一些必要信息会放在 cookie 中,一起返回到前端。
- 其他信息,可以保存在 session_id 命名的文件中。
4. session 的负面影响:
- 性能影响。如果用户很多,信息都保存在 sessin 文件中,查找耗时太多(可以分目录和哈希等)。
- 可以自己实现session,将session信息存放到 数据库当中,这样做最好对数据库进行一下缓存的设置了,不然对上千万的数据进行太频繁的检索,也是蛮耗资源的。
5. session 的清除:
- 定期清理 session(清除服务端的 session 文件,和 客户端的 cookie 信息)
- cookie, expires 设置为 过去的时间/max-age = 0,客户端的cookie 信息就会过期,浏览器就会自动删除。
6. koa-session 的 原理:【有空一定要看看源码,看源码要注意命名、特色、知识点的学习。也会学习 koa 插件的写法的过程】【看源码,要先有整体把控图,然后逐步去分析啊】
使用流程:
- app.use(session(CONFIG, app)); // 初始化koa-session中间件
- let n = ctx.session.views || 0; // 每次都可以取到当前用户的session
- 初始化的时候,把 session 对象挂载在 app.context上。所以后面可以 从 ctx.session 上获得 session
- 在接到 http 请求的时候,
- 默认把数据 json ,塞进了 cookie ,即 cookie 来存储加密后的 session 信息。
- 如果设置了外部 store ,会调用 store.set() 去保存 session 。具体的保存逻辑,保存到哪里,由 store 对象自己决定!
- 用 cookie 存储的时候,对session(包含过期时间)序列化后做一个简单的base64编码。
- 就算信息保存在文件中,还是必不可少的需要 cookie
- session_id 的默认实现是 一个时间戳加随机字符串。
- koa-session允许用户在config中配置自己的编码和解码函数,因此完全可以使用自定义的加密解密函数对session进行编解码
7. session 的鉴权过程:
- 用户登录的时候,服务端生成一个会话和一个id标识
- 会话id在客户端和服务端之间通过cookie进行传输
- 服务端通过会话id可以获取到会话相关的信息,然后对客户端的请求进行响应;如果找不到有效的会话,那么认为用户是未登陆状态
- 会话会有过期时间,也可以通过一些操作(比如登出)来主动删除
8. 分布式 session:
问题:分布式环境下,前后访问的服务器不同,所以导致 session 不能准确保存
- 解决方案:将 session 信息放在一个独立的机器上(可以是一个独立的数据库服务,也可以是一个缓存服务)
- 缺点:但是这个持久层一旦挂了,就会单点失败。
- 新方案:索性不保存session 数据,所有数据保存在客户端,每次请求都发回服务器(这就是 token)
9. cookie 和 session 的区别:
- 存储位置不同:cookie -> 客户端浏览器。session -> 服务器
- 隐私策略不同:cookie -> 不是很安全,cookie 劫持。session -> 相对安全
- 性能不同:session -> 访问量太大时,占用服务器性能
- 存储大小不同:cookie -> 有大小限制,一般不超过4K
10. 参考:
- https://www.cnblogs.com/woodk/p/10129836.html
- 看源码的时候,可以画一下 主要模块的脑图,更有助于理解。
- https://www.cnblogs.com/longhao/p/3558871.html
- https://www.jianshu.com/p/8f4cc45d712e
- https://segmentfault.com/a/1190000013039187
- https://juejin.im/post/59d1f59bf265da06700b0934#heading-9
- https://juejin.im/post/5d01f82cf265da1b67210869#heading-11