客户端和服务端登录状态的保存cookie、session、redis ——nodejs

用户登录的状态如何保存?如何方便的保存?如何安全的保存?

背景

项目中的登录功能必不可少,登录之后状态是怎么保存的呢,客户端是如何知道我们登录了没有呢?

由于本人是前端开发,所以对这块不太了解,学习时记录一下,加深理解...

客户端保存登录状态

客户端保存登录状态一般是用cookie,cookie是客户端和服务端都能操作的,在用户登录成功之后,可以在服务端写入cookie,在nodejs中如下:

javascript 复制代码
 //nodejs  
 // 获取 cookie 的过期时间
    const getCookieExpires = () => {
      const d = new Date()
      d.setTime(d.getTime() + (24 * 60 * 60 * 1000))
      console.log('d.toGMTString() is ', d.toGMTString())
      return d.toGMTString()
    }
    

// 限制前台修改cookies httpOnly
// 限制过期时间 expires=${getCookieExpires()
    res.setHeader("Set-Cookie",`userId=${req.userId};path=/;httpOnly; expires=${getCookieExpires()}`)
 

因为浏览器是可以直接修改cookie的,所以要加上httpOnly限制。

客户端用cookie保存的缺点:

  • cookie暴露很危险,任何人都能看到
  • 没加httpOnly限制的话可以随意更改

所以,为了解决这个问题,我们用服务端来存储关键信息

服务端保存登录状态

那么服务端存储我们自然想到可以使用session来存储。怎么把客户端和用户信息对应起来呢?

我们不是就完全放弃cookie了,我们还是要用cookie和seesion配合起来:

既然cookie不能存储关键隐私信息,那么我们就存一个无关紧要的唯一标识就行了,然后拿这个标识与用户信息的session建立映射关系,当用户请求携带了这个cookie,我们去session中找到对应的用户信息就可以了

在nodejs中:

然后再登录成功的逻辑中,把用户信息存进去就行了。

这样我们就可以安全的保存我们的用户信息了。

但是...

凡事都有但是...这样做还不行,安全是安全了,但是用起来不方便,怎么不方便呢?

session的问题 session是js 变量,放在nodejs进程内存中。

  • 第一,进程内存有限,访问量过大,内存暴增怎么办?

  • 第二,正式上线是多进程,进程之间无法共享。现在企业都是在一台机器上跑多个node进程来提升效率和使用率,但是每个进程的内存是相互隔离的,所以登录状态没法共享

  • 第三 , session会在服务端关闭时释放存储空间,但服务端每次更新都要重启,或者运维同学运维也要重启,导致频繁的需要用户登录体验不好

怎么解决这个问题?方案:redis

  • 第一: redis集群可以突破内存限制
  • 第二: 只要redis不重启数据就不会消失
  • 第三: 存在redis的数据每个node进程都可以访问
  • 第四: redis性能好速度快

我们在登录完成之后,把用户的信息放在redis里面,获取的时候也从里面获取。

这样就可以放心的使用用户信息了。

具体逻辑感兴趣的可以看看源码

相关推荐
一只爱撸猫的程序猿7 小时前
我看着一个 AI 引擎在 14 天里,从"记忆"走进了"搜索"
人工智能·后端·架构
Dawson Zhu12 小时前
从空间 Scaling 到时间 Scaling
人工智能·语言模型·架构·aigc·agi
say_fall18 小时前
【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工
服务器·人工智能·架构
Decay__19 小时前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
猿人谷19 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
Kari1120 小时前
企业级智能体平台怎么选:腾讯云ADP与其他主流技术路线的架构对比
架构·云计算·腾讯云
泯泷20 小时前
AI时代,中层还要替公司传多少次话?
人工智能·架构
Dawson Zhu20 小时前
【LLM推理与Serving⑧】多机多卡Serving:TP/PP/负载均衡与弹性扩缩容全攻略
人工智能·语言模型·架构·aigc·agi
Bode_20021 天前
大语言模型与运筹规划双闭环共生(LLM-OR):体系架构、理论机理与落地实践
人工智能·语言模型·架构
空奈qwq1 天前
【Kafka 从入门到实战】从手写一个队列到生产级消息中间件:架构、分区、消费组、零拷贝全解析
分布式·架构·kafka