mcpField
S
session-management

session-management

github.com/secondsky安全240416 次安装5 周前更新
代码仓库

关于 session-management

面向实现会话管理的开发者,提供基于令牌的会话、Redis 存储与 Cookie 配置示例,并强调令牌验证和密钥安全。

主要功能

  1. 01基于 JWT 的访问与刷新令牌
  2. 02Redis 会话存储示例
  3. 03安全 Cookie 配置
  4. 04令牌刷新流程
  5. 05会话安全要求与禁用做法

适用场景

  1. 01为 Web 应用实现令牌会话
  2. 02将会话数据保存在 Redis
  3. 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