koa session 的思考
session 是什么?
自己google.
cookie 是什么?
自己google.
cookie 和session 的关系是 ?
自己google.
如何识别是那个用户登录的 ?
用户登录系统, 系统生成cookie,浏览器获取到http 的响应, 则会在客户端保存cookie 的值. 用户的每次请求都会带着cookie的信息到服务器, 服务器获取到这个cookie的值, 则会得到session里面的信息(不同的语音会有不同的解析方法, 原理是一样的), 从而知道了是哪一个用户. cookie和session是关联的, 那么cookie丢了后是不是就不安全了? 这里不做讨论. 可以google.
session的存储
- 文件的保存
- 数据库保存
session文件存储
一般情况session的信息保存在操作系统的文件中, 不同语言保存的形式不一, 结构有差异.
- 优点:
使用简单
适合小型的网站
读取速度快
- 缺点:
不安全(相对)
时间长了后session文件会很多
不适合大型的网站使用.
session数据库保存
现在的服务器一般都要做负载均衡, 业务也要做水平和垂直的拆分. 那么session的持久化就是需要考虑的问题了. session的持久化其实就是将session保存在网络的某些地方.PS: 网络世界, 很大, O(∩_∩)O哈哈~
所以用户在登录某系统的时候能正确的识别是哪一个用户很是考究技术的地方. 所以出现了session的持久化的解决方案.
session 持久化的解决方案就是session保存在数据库中:
memcache, redis, mysql, mongodb ...
由于memcache 其实也不能持久化, 服务器出问题后session就会丢失.所以一般都不会考虑这个方案.
那么上面的这几个究竟是保存在哪里好呢, 也需要更自己的业务来考虑. 具体可以Google.
koa session 的思考
扯了太多, 现在回归正题, koa 的session的解决方案也挺多,
持久化的方案挺多, 但是似乎都存在一个同样的问题就是用户退出后需要清除保存在session的标示信息.
你也许会想到将 session = {}
可以销毁session即可, 其实不是这样的, 用户的再次访问可用的路由的也是同样可以登录的, 为什么? 原因就是cookie的原因, 服务器在拿到cookie信息后会到数据库中查找session的信息, 结果是拿到了, 那么你先前设置的session信息有回来了. 所以session中还是拿到了原来的信息.
你也许想到了既然cookie在作怪, 那么可以设置cookie的信息过期, 这个方案可行, 但是也存在一定的问题: 用户可以把cookie的过期时间修改. 这样也是存在问题的.
ps: 以上是koa session 的思考, 如有不对的地方可以在留言中补存.
解决方案
基于上面的问题我的解决方案就是用户退出后同时把数据库中的session信息也删除. 可惜 上图中的session 持久化解决方案并没有提供. 那么就自己实现吧.(其实这样的情况不可怕, 可怕的是没有思路和解决方案)
koa session的持久化一般是使用的 koa-session 中间件实现的. 里面提供了 store 的参数, 我们只需要实现这个方法就可以了.
可以参考我的博客 :
http://fm126.xyz/2017/12/12/koa-session-mongodb-store/
在 实现store的方法里面需要有一个 destory 的方法, 这个方法是提供给 koa-session 用的. 那么我们也可以用这个方法. 所以你可以在销毁session的时候调用此方法.
ps: 感觉 express 中的session中间件还是挺好的.