关于 session-management
面向实现会话管理的开发者,提供基于令牌的会话、Redis 存储与 Cookie 配置示例,并强调令牌验证和密钥安全。
主要功能
- 01基于 JWT 的访问与刷新令牌
- 02Redis 会话存储示例
- 03安全 Cookie 配置
- 04令牌刷新流程
- 05会话安全要求与禁用做法
适用场景
- 01为 Web 应用实现令牌会话
- 02将会话数据保存在 Redis
- 03配置安全属性并管理令牌有效期
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill session-management安装后在 Claude Code 中输入/session-management确认已加载。
详细介绍
会话管理
实现安全的会话管理,妥善处理和存储令牌。
基于令牌的会话
const jwt = require('jsonwebtoken');
function generateTokens(user) {
const accessToken = jwt.sign(
{ userId: user.id, role: user.role, type: 'access' },
process.env.JWT_SECRET,
{ expiresIn: '1h' }
);
const refreshToken = jwt.sign(
{ userId: user.id, type: 'refresh' },
process.env.REFRESH_SECRET,
{ expiresIn: '7d' }
);
return { accessToken, refreshToken };
}
Redis 会话存储
const redis = require('redis');
const client = redis.createClient();
class SessionStore {
async create(userId, sessionData) {
const sessionId = crypto.randomUUID();
await client.hSet(`sessions:${userId}`, sessionId, JSON.stringify({
...sessionData,
createdAt: Date.now()
}));
await client.expire(`sessions:${userId}`, 86400 * 7);
return sessionId;
}
async invalidateAll(userId) {
await client.del(`sessions:${userId}`);
}
}
Cookie 配置
app.use(session({
name: 'session',
secret: process.env.SESSION_SECRET,
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'strict',
maxAge: 3600000, // 1 hour
domain: '.example.com'
},
resave: false,
saveUninitialized: false
}));
令牌刷新流程
app.post('/auth/refresh', async (req, res) => {
const { refreshToken } = req.cookies;
try {
const payload = jwt.verify(refreshToken, process.env.REFRESH_SECRET);
if (payload.type !== 'refresh') throw new Error('Invalid token type');
const user = await User.findById(payload.userId);
const tokens = generateTokens(user);
res.cookie('accessToken', tokens.accessToken, cookieOptions);
res.json({ success: true });
} catch (err) {
res.status(401).json({ error: 'Invalid refresh token' });
}
});
安全要求
- 仅使用 HTTPS
- 在 Cookie 上设置 httpOnly 和 sameSite
- 正确设置令牌过期时间
- 为每个环境使用强且唯一的密钥
- 在每次请求时验证签名
切勿
- 在令牌中存储敏感数据
- 通过 URL 参数传输令牌
- 使用弱密钥或共享密钥
- 跳过签名验证
评论
支持 Markdown