系统设计之session

系统设计之session

因为http协议无状态,通过session记录用户的状态,例如购物车,登录e't'c...

  • Session - Server端
  • Cookie - client端browser存储。
  • Cookie只能保存简单字符串,因此不适合保存大量数据,而session可以当成一个存储容器,支持多种类型。
  • Cookie存储在client端,客户端可见。不适于存储credentials信息。

Cooike

cookie是浏览器保存在用户电脑上的一小段文本,通俗的来讲就是当一个用户通过 http访问到服务器时,服务器会将一些 Key/Value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据通过请求头又被完整地给带回服务器,服务器根据这些信息来判断不同的用户。

Server端通过response header : Set-Cookie改过

Client 端再cookie 没有超过最大保存时间,会以request header (Cookie) 发送给服务端

Session

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

Session ID 可以通过cookie保存,是常见session实现的技术,但并未唯一实现办法。

Notes: 如果cookie被禁, 可采用URL传递sessionID,隐藏表单域等方法。


分布式 session问题

server端有多个节点,session如果存储在单个server,如果第一次用户访问server1并在server1上创建session,后续请求分派到别的server导致session丢失。。。

session Sticky

例如Niginx可通过用户IP将请求做hash,保证不同clientIP固定到同一台server。

问题: session 没有persist, server 重启丢失;如果不同client同一个ip出口,则无法实现session sticky

session replication

不同server 上session复制到别的server,网络风暴,影响性能。

集中式存储 (推荐)

通过使用会话管理工具,将session集中存储。

例如express-session middleware支持session store,mongo,redis etc...