如何在CentOS服务器上设置Redis会话永久有效(直至用户主动注销)
Hey there! 我来帮你搞定基于CentOS上的Redis实现「用户永久登录直到主动注销」的需求,咱们一步步来:
核心思路
简单来说,就是用户登录后生成一个唯一的安全令牌,把令牌和用户信息绑定存在Redis里(不设过期或设超长过期),客户端把令牌存在Cookie中;每次请求时后端验证令牌有效性,用户点击注销时删除Redis中的令牌并清除客户端Cookie。
具体实现步骤
1. 生成安全的会话令牌
要确保令牌足够随机、难以被猜测,推荐用UUID v4或者加密级别的随机字符串生成。比如用Python生成的示例:
import uuid # 生成唯一令牌 session_token = str(uuid.uuid4())
或者用Linux命令生成(如果是Shell脚本场景):
session_token=$(openssl rand -hex 16)
2. 将令牌与用户信息存入Redis
把令牌作为键的一部分,用户信息存在Redis哈希结构里(方便后续查询单个字段),不设置过期时间(或者设一个极长的过期时间,比如10年,做双重保险):
# 存储用户会话信息,键格式为user_session:{令牌} HSET user_session:${session_token} user_id 1001 username "tomnyson" login_at "2024-05-20 15:00:00" # 可选:设置10年过期时间(315360000秒) EXPIRE user_session:${session_token} 315360000
3. 客户端存储令牌
把生成的令牌存在用户浏览器的Cookie中,一定要配置安全属性:
HttpOnly: 防止XSS攻击窃取令牌Secure: 仅在HTTPS连接下传输(如果你的服务用HTTPS的话)SameSite=Strict: 防止CSRF攻击Max-Age: 设置和Redis一致的超长过期时间(比如315360000秒)
4. 请求时验证令牌
用户每次访问需要登录权限的接口/页面时,后端做以下操作:
- 从请求Cookie中取出会话令牌
- 用Redis命令查询该令牌对应的用户信息:
HGETALL user_session:${session_token}
- 如果查询结果存在,说明用户已登录,正常返回内容;如果不存在,跳转至登录页面
5. 注销功能实现
当用户点击注销按钮时,后端执行:
- 从Cookie中取出会话令牌
- 删除Redis中对应的会话键:
DEL user_session:${session_token}
- 清除客户端的Cookie(设置Cookie的
Max-Age=0或Expires为过去的时间)
关键注意事项
- Redis持久化配置: 要确保Redis开启持久化(AOF或RDB),防止服务器重启后会话数据丢失。编辑
/etc/redis/redis.conf:- 开启AOF:
appendonly yes - 开启RDB定期保存:
save 3600 1(每3600秒至少有1个键变化时保存)
- 开启AOF:
- 令牌安全性: 绝对不要用简单的字符串做令牌,必须用加密级随机生成器;Cookie的安全属性一定要配置全,避免被窃取。
- 可选:令牌刷新机制: 如果担心令牌长期不变有风险,可以在用户每次活跃(比如访问页面、提交请求)时生成新令牌,替换旧令牌,同时更新Redis和Cookie中的值,进一步提升安全性。
内容的提问来源于stack exchange,提问作者tomnyson
相关产品推荐
相关产品推荐

