Session和Cookie的原理,以及在分布式应用中出现的问题和解决方案
阅读原文时间:2022年04月14日阅读:1

产生原因

  由于http协议是无状态的,同一个浏览器对服务器的两次请求之间是没有关系的,服务器认为两次请求都是全新的请求,不会记住上次请求成功的数据。然而现有的业务常常需要服务器能记住用户的访问情况,

  Cookie和Session都是为了解决http协议无状态而产生的。

原理

  客户端请求服务器,服务器会通过Response将Cookie发送到浏览器,并保存在浏览器端,下次浏览器再向服务器发送请求时,会把Cookie放到Request里发给服务器。

缺点

  由于Cookie是将信息存储在客户端本地,而客户端本地存储并无任何安全机制,容易造成泄漏、窃取,所以一般Cookie存储的信息如用户基础姓名、年龄等,而不存储隐私性较强的信息,如密码、身份证等

Session

原理

  Session机制与Cookie相似,不过是将数据保存在服务器上,能避免数据泄漏的问题。Session底层利用了Cookie来存储SessionId,下次浏览器请求服务器时,会将SessionId带上发给服务器,那么服务器就能将请求和Session对应起来。

分布式出现的问题

  多台服务器如何解决同一个用户唯一标识存储的问题,现大部分架构使用分布式,有可能用户A第一次请求被代理转发到Server1服务器上(在Server1完成登录),此时用户在此请求获取服务器资源被代理转发到Server2服务器上,那么传统的会话以服务器文件存储,则此时在Server2上并没有存储用户A的会话文件,所以用户A在第二次访问的时候仍然是未登录状态。

服务器代理转发是由Nginx算法配置,通常有Hash算法、随机访问、最小连接数、权重分配法等

解决方案

  1. 将用户会话存储在同一存储层中,使得会话在分布式架构中共享会话。常用的是数据库层,如Mysql、Redis。不建议使用Mysql存储层,Mysql通常是应用的最后一道关卡,在高并发请求的情况下,容易造成服务器崩溃。一般使用的是Redis分布式缓存存储Session,Redis是纯内存,访问速度快
  2. JWT(Json Web Token)。是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。