Expressを用いたクッキーとセッション管理の実践

Expressフレームワークと関連パッケージを利用したWebアプリケーション開発において、クッキーとセッションの管理方法を解説します。事前に必要なパッケージは以下のコマンドでインストールしてください。

npm install express cookie-parser cookie-session

まずは基本的なサーバー構築方法です。3行で完結するシンプルな実装例:

import express from 'express';
const app = express();
app.listen(3000, () => console.log('Server running on port 3000'));

クッキーとセッションの特性を整理します。

  • クッキー:ブラウザ側に保存され、リクエストごとに送信される。セキュリティリスクあり(4KB制限)
  • セッション:サーバー側で管理され、クッキー経由で識別される。理論上無制限のストレージが可能

クッキー操作の実装例:

import { express, Request, Response } from 'express';
import cookieParser from 'cookie-parser';

const app = express();
app.use(cookieParser('secure_signing_key'));

// 認証トークンの発行
app.post('/auth/login', (req: Request, res: Response) => {
  const token = generateSecureToken(); // セキュアなトークン生成関数
  res.cookie('auth_token', token, {
    httpOnly: true,
    maxAge: 86400000, // 24時間有効
    signed: true
  });
  res.json({ status: 'authenticated' });
});

// クッキーの検証処理
app.get('/profile', (req: Request, res: Response) => {
  if (req.signedCookies.auth_token) {
    const userData = verifyToken(req.signedCookies.auth_token);
    res.json(userData);
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
});

// クッキーの削除
app.post('/auth/logout', (req: Request, res: Response) => {
  res.clearCookie('auth_token', { path: '/' });
  res.json({ status: 'logged out' });
});

セッション管理の実装方法:

import session from 'cookie-session';

// 暗号化キーの生成
const crypto = require('crypto');
const sessionKeys = Array.from({ length: 5 }, () => 
  crypto.randomBytes(32).toString('hex')
);

app.use(session({
  name: 'app_session',
  keys: sessionKeys,
  maxAge: 7 * 24 * 60 * 60 * 1000 // 7日間有効
}));

// セッションデータの保存
app.post('/cart/add', (req: Request, res: Response) => {
  req.session.cartItems = req.session.cartItems || [];
  req.session.cartItems.push(req.body.item);
  res.json({ items: req.session.cartItems.length });
});

// セッションの無効化
app.post('/session/destroy', (req: Request, res: Response) => {
  req.session = null;
  res.json({ status: 'session cleared' });
});

セッション管理では、複数の暗号化キーをローテーションさせることでセキュリティを強化できます。クッキーのhttpOnly属性を有効にし、XSS攻撃対策を施すことが重要です。

タグ: Express.js cookie-parser cookie-session

6月8日 20:45 投稿