session

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
    原文作者:默_hjh
    原文地址: https://segmentfault.com/a/1190000019938607
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞