静态
网站很容易
扩展,您只需要所有的缓存,不必考虑从不同
服务器组合到
用户的内容。
不幸的是,大多数Web
应用程序使用状态内容来提供个性化体验。如果应用程序可以
登录,则需要记住用户会话。最典型的
方法是在客户端
设置一个具有随机唯一会话身份的cookie,并将标识的会话数据
保存到服务器。
扩展状态服务
当您扩展服务时,您有三个选择:
来自不同服务器端的
同步会话数据
不同的服务器端
连接单点中心(get会话)
确保用户访问同一服务器
但
都是有缺陷的:
同步数据增加
性能开销
单点中心缩减
系统可扩展性
如果用户最后访问,服务器需要
维护什么
但是,如果您以不同的方式考虑它,您会
发现第四个
选项:在客户端保存会话数据
客户端会话
在客户端保存会话有一些优点:
会话数据是否有效并不重要。
不需要维护服务器端状态。
不需要服务器端同步。
随时添加新服务器
但是客户端会话中存在一个严重的问题:不能保证用户不篡改会话数据。
例如,您将用户ID保存在cookie中,用户很容易
修改它以访问其他人的帐户。
这似乎否定了客户端会话的可能性,但是有一种方法可以巧妙地
解决这个问题:会话数据的加密和
打包(或cookie),这不需要担心用户修改会话数据,服务器将验证数据。
实际应用程序是在cookie中保存加密服务器密钥。服务器密钥被验证有权读取和修改会话数据。这是客户端会话。
节点客户端会话
Node.js已经库实现了客户端会话:节点客户端会话,可代替会话和cookieparser中间件建立连接(节点中间件框架)。
在Express框架应用程序中的应用:
const clientsessions =需要(客户端);
app.use(clientsessions({秘密: / / '0gbljz9ekbt2zbi2flrpvztczcewbxxk设置一个长的随机字符串!})
然后,对req.session对象添加
属性:
app.get( /登录
功能(REQ,RES){ req.session.username = 'johndoe;});
读取属性:
app.get(/功能(REQ,RES){ res.send(欢迎你+请求会话。
用户名);});
使用重置方法终止会话:
app.get(/人,功能(REQ,RES){ req.session.reset();});
立即
取消角色会话
(注:人物角色是由Mozzilla发起的
网络身份认证系统)
与服务器端会话不同,客户端会话的问题是服务器不能
删除会话。
当服务器端的架构,你可以删除会话数据。任何客户端会话cookie身份可能不存在。但客户结构、会话数据不在服务器上,不能保证会话数据在每个客户端删除。换句话说,我们不能同步客户端的客户端状态(已经登录)和服务器状态(登录登录)。
为了弥补这个缺陷,客户端会话增加了过期时间。在扩展会话数据(加密包)之前验证到期时间。如果过期,放弃会话数据并更改用户的状态(例如登录登录)。
过期的机制在许多应用程序中
运行良好(特别是短时间内的需求)。在角色中,当用户发现
密码受到威胁或被
损坏时,我们需要提供一种方法让用户立即取消会话数据。
这意味着,一点点的状态信息需要保留在服务的后端。我们即时办理注销的方式是将用户的数据表的一个令牌和会话数据。
每个API调用与会话数据中的令牌和数据库中的令牌进行比较。如果不相同,返回
错误信息并
退出用户。
这将添加额外的数据库
操作来
查询令牌。幸运的是,大多数API调用需要读取用户数据表并将令牌放在一起。