Session 是网页后端用于管理用户登录状态的一种机制,但它会占用一定的服务器内存资源。为减少服务器负担,Enki 登录系统已改为使用 next-iron-session 进行会话管理。
该机制将用户的登录信息通过加密后存储在客户端的 Cookie 中,不再依赖服务端内存维持 session 状态。只要用户不关闭网页,登录状态将持续有效;一旦网页关闭,对应的 session 即失效。
服务端在处理请求时,可从请求头中提取加密的 Cookie,利用预设密钥进行解密,从而还原出明文的用户登录信息,并用于身份验证判断是否已登录
好处:不占用后台资源,无需后台管理。
弊端:登录信息保存在网页的cookie中,容易被冒防登录。
安全处理:
在非 HTTPS 下能监听并窃取 cookie。
处理:强制使用 HTTPS,设置 secure: true。
若攻击者在页面中注入 JavaScript,就能读取 Cookie。
处理:设置 httpOnly: true,这样 JavaScript 无法访问 Cookie。
如果 session 设置了超长过期时间,攻击者即使拿到旧的 Cookie 也可能有效。
处理:设置合理的过期时间 + 支持登出时清除 Cookie。
如果攻击者获取了 Cookie(如从其他地方拷贝),就能直接模拟登录。这个没法防。
安全处理:
session 信息加入IP地址,浏览器信息,攻击者获取了 Cookie信息后,由于是加密,无法改变其中的 IP地址和浏览器信息,只能整体上传cookie, 后台比对真实请求的IP 地址和解密后session中的ip地址和浏览器信息就可以防此类攻击。
这样处理有一个小bug: 如果使用VPN,当IP更换时,会提示未登录。因此前端在提交申请之前先检测是否登录,如果登录失效,则弹出钱包登录签名窗口。增加了前端的业务逻辑。