开发带登录系统的Web应用应存储哪些类型的用户Cookie?
禁止存储的Cookie内容
- 绝对不能存储用户密码:不管是明文还是加密后的密码都不能放入Cookie,一旦Cookie被盗取会直接导致用户账号完全泄露
- 不建议直接存储用户邮箱、用户名这类可直接关联到用户隐私的明文信息,避免Cookie泄露后用户隐私被批量爬取
推荐存储的Cookie内容
仅存储不可直接反推出用户敏感信息的关联标识,以及非敏感的配置类内容即可:
- 优先存加密签名后的用户ID或会话ID:你提到的数据库用户ID本身可以使用,但必须经过签名加密处理,避免攻击者篡改Cookie内容伪造其他用户身份
- 可选存储主题、语言设置这类不涉及用户隐私的偏好配置
基于cookie-session模块的实现方案
你用到的cookie-session模块已经默认对存储的内容做了签名加密,存在session中的数据不会明文暴露给客户端,按照如下方式使用即可:
var cookieSession = require('cookie-session') var express = require('express') var app = express() app.use(cookieSession({ name: 'session', keys: [process.env.SESSION_SECRET], // 密钥建议从环境变量读取,不要硬编码在代码中 maxAge: 24 * 60 * 60 * 1000 // 24小时有效期 })) // 登录接口逻辑示例 app.post('/login', async (req, res) => { const { email, password } = req.body // 先校验账号密码正确性,校验通过后获取数据库对应用户数据 const user = await db.user.findOne({ where: { email } }) // 密码校验逻辑省略,校验通过后仅往session中写入用户ID即可 req.session.userId = user.id res.redirect('/user/home') }) // 登录态校验示例 app.get('/user/profile', async (req, res) => { if (!req.session.userId) { return res.status(401).send('未登录,请先登录') } // 用session中存储的userId去数据库查询对应用户信息返回即可 const userInfo = await db.user.findOne({ where: { id: req.session.userId }, attributes: ['id', 'username', 'email'] // 按需返回字段 }) res.send(userInfo) })
补充说明:如果站点用户量较大,也可以选择
express-session模块配合Redis、MySQL等服务端存储使用,此时Cookie中只会存储一个无意义的会话ID,所有用户会话数据都存在服务端,安全性更高。
内容的提问来源于stack exchange,提问作者abdulazeez
相关产品推荐
相关产品推荐

