问题定义
我们都知道session是服务端的存储结构,存储用户的登录信息。
那问题是,如果Flask后端做了重启,这些session数据就会消失;
可是我发现,前端用户依然不用重新登录,而重启后的后端,也依然可以通过session.get("user_name")获取到session,这是为什么?
原因
Flask 中默认是直接将 服务器端的 session 存储在客户端浏览器的 cookie 中,当然是加密过的,意思就是说,后端在 session 里面写入什么数据,就会被加密存储到客户端 cookie 里面,浏览器中那条叫做 session 的 cookie 就是加密数据,只要你明白算法,知道密钥,理论上就可以把 session 的数据都算出来,所以在 flask 中如果想要使用 session 就必须要设一个 SECRET_KEY ,这就是 session 加密的密钥。
将 session 放在 cookie 中有好处,也有坏处。好处是不受服务器端影响,flask 重启仍然可以使用,如果放在内存中,后端重启,前端全部需要再次登录。
坏处是如果存很多数据在 session 里面,那么 cookie 就会非常大,而前端是不应该存储大量数据,而且容易被人破解,虽然即使是同样的 session 数据,每次加密生成 cookie 也不同,但是也还是不安全,怪不得 cookie 中的这条数据叫做 session,而不是session_id 或者 sid。
因此,可以多机器部署,不用改在成分布式Session存储
正因为session存储在客户端,那么服务端的重启不会影响用户的登录状态。
那么如果后端改成双机器部署,也不会影响用户的使用;
如果session不是存储在cookie而是服务的内存,那么就得保持多个机器的sessio数据同步,引入redis等第三方存储才可以解决。