cookie适合存储用户偏好,购物车ID,语言设置,跟踪ID的非敏感信息
session适合存储敏感信息,登录状态,权限信息
第一次没有cookie的工作流程

第二次携带cookie的工作流程

浏览器存储 Cookie 后,后续请求自动携带 Cookie 头中携带存储的Cookie数据
Cookie: name1=value1; name2=value2; name3=value3
node.js设置cookie的方法
res.cookie('session', 'abc123', {
expires: new Date(Date.now() + 3600000), // 1小时后过期
maxAge: 3600000, // 同样1小时
domain: '.example.com', // 子域名共享
path: '/api', // 只在/api路径有效
secure: process.env.NODE_ENV === 'production', // 生产环境HTTPS
httpOnly: true, // 防止XSS
sameSite: 'lax', // CSRF保护
partitioned: true, // 分区Cookie
priority: 'high' // Cookie优先级
});
后端返回session的过程
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
// Session中间件配置
app.use(session({
// 必需参数
secret: 'your-secret-key', // 签名密钥
resave: false, // 是否每次请求都重新保存session
saveUninitialized: false, // 是否保存未初始化的session
// Cookie相关设置
cookie: {
maxAge: 24 * 60 * 60 * 1000, // 1天
secure: process.env.NODE_ENV === 'production', // 生产环境HTTPS
httpOnly: true, // 防止XSS
sameSite: 'strict', // CSRF防护
domain: '.example.com', // 域名
path: '/' // 路径
},
// 存储设置
store: new RedisStore({
host: 'localhost',
port: 6379,
ttl: 86400 // Redis中的过期时间
}),
// 其他参数
name: 'app.sid', // Cookie名称,默认'connect.sid'
rolling: false, // 每次请求重置Cookie过期时间
unset: 'keep' // 请求结束时如何处理session
}));
session和cookie经常协同合作
session和cookie之间的关系就像储物柜和钥匙,用户登录,服务端验证通过后,会创建个储物柜(创建个session)用来存储用户信息,将钥匙(cooke)交给浏览器,浏览器将钥匙存储,在下次请求时携带钥匙交给服务器,服务器根据这个钥匙找到对应的储物柜,获取信息
// 典型登录流程
app.post('/login', async (req, res) => {
// 1. 验证用户凭证
const user = await User.authenticate(req.body);
// 2. 创建Session(服务器端)
req.session.userId = user.id;
req.session.role = user.role;
// 3. 设置Cookie(客户端)
res.cookie('user_session', req.sessionID, {
httpOnly: true,
secure: true,
maxAge: 24*60*60*1000
});
// 4. 返回成功响应
res.json({ success: true, user: { id: user.id, name: user.name } });
});
551



被折叠的 条评论
为什么被折叠?



