mcpField
S
session-management

session-management

github.com/secondskyセキュリティ240416 回インストール5 週間前に更新
リポジトリ

session-management について

安全なセッション管理を実装する開発者向けのスキルです。JWT、Redis による保存、Cookie 設定に加え、トークン検証やシークレット管理の要点を扱います。

主な機能

  1. 01JWT アクセストークンと更新トークン
  2. 02Redis セッション保存例
  3. 03セキュアな Cookie 設定
  4. 04トークン更新フロー
  5. 05セキュリティ要件と禁止事項

活用シーン

  1. 01Web アプリでトークンベースのセッションを実装
  2. 02Redis にセッションデータを保存
  3. 03Cookie の安全設定とトークン有効期限の管理

インストール

コマンドをコピーしてターミナルで実行します。

$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 パラメーターを介してトークンを送信する
  • 脆弱なシークレットや共有シークレットを使用する
  • 署名の検証を省略する

コメント