session-management について
安全なセッション管理を実装する開発者向けのスキルです。JWT、Redis による保存、Cookie 設定に加え、トークン検証やシークレット管理の要点を扱います。
主な機能
- 01JWT アクセストークンと更新トークン
- 02Redis セッション保存例
- 03セキュアな Cookie 設定
- 04トークン更新フロー
- 05セキュリティ要件と禁止事項
活用シーン
- 01Web アプリでトークンベースのセッションを実装
- 02Redis にセッションデータを保存
- 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 パラメーターを介してトークンを送信する
- 脆弱なシークレットや共有シークレットを使用する
- 署名の検証を省略する
コメント
Markdown 対応