Ledgerly アプリケーションに実装されているセキュリティ機能と、本番環境での推奨事項についてまとめています。
- NextAuth (Auth.js v4): JWT ベースのセッション管理
- パスワードハッシュ化: bcryptjs を使用(12 ラウンド)
- セッション有効期限: 30 日間
- 認証チェック: すべての API エンドポイントで
getUserId()またはgetServerSession()を使用
Next.js middleware により、未認証ユーザーは保護されたルートにアクセスできません:
- 公開パス:
/login,/signup,/api/auth/* - 保護パス: 上記以外のすべてのルート
- 最小長: 8 文字
- 大文字: 1 文字以上
- 小文字: 1 文字以上
- 数字: 1 文字以上
- 特殊文字: 1 文字以上
import { strongPasswordSchema } from "@/lib/security/password";
// Zod スキーマでバリデーション
const validatedData = z
.object({
password: strongPasswordSchema,
})
.parse(data);- 制限: 15 分間で 5 回まで
- 単位: メールアドレス
- 実装: メモリストア(本番環境では Redis 推奨)
- 制限: 15 分間で 5 回まで
- 単位: IP アドレス
- レスポンス: 429 Too Many Requests(
Retry-Afterヘッダー付き)
以下のセキュリティヘッダーがすべてのレスポンスに設定されます:
| ヘッダー | 値 | 目的 |
|---|---|---|
Strict-Transport-Security |
max-age=63072000; includeSubDomains; preload |
HTTPS 強制 |
X-Frame-Options |
SAMEORIGIN |
クリックジャッキング対策 |
X-Content-Type-Options |
nosniff |
MIME スニッフィング対策 |
X-XSS-Protection |
1; mode=block |
XSS 対策 |
Referrer-Policy |
strict-origin-when-cross-origin |
リファラー制御 |
Permissions-Policy |
camera=(), microphone=(), geolocation=() |
機能ポリシー |
起動時に以下の環境変数が検証されます(本番環境のみ):
DATABASE_URL: 有効な URL 形式NEXTAUTH_URL: 有効な URL 形式NEXTAUTH_SECRET:- 32 文字以上
- デフォルト値(
your-secret-key-here-change-in-production)からの変更必須
# セキュアなシークレットキーを生成
openssl rand -base64 32- すべてのクエリで
userIdによるフィルタリング - ユーザー間のデータ漏洩を防止
- Prisma の型安全性により実装ミスを防止
deletedAtフィールドによる論理削除- データの完全性を保持
- 誤削除からの復旧が可能
- ✅ Prisma ORM による型安全なクエリ
- ✅ パラメータ化クエリの自動使用
- ✅ 生 SQL の使用なし
- ✅ React のデフォルト保護(自動エスケープ)
- ✅
dangerouslySetInnerHTMLの使用なし - ✅ セキュリティヘッダー(
X-XSS-Protection)
- ✅ NextAuth の組み込み CSRF 保護
- ✅ SameSite Cookie の使用
- ✅ トークンベースの検証
メモリストアから Redis への移行を推奨:
// 例: Redis を使用したレートリミット
import { Redis } from "ioredis";
const redis = new Redis(process.env.REDIS_URL);
export async function checkRateLimit(
identifier: string,
config: RateLimitConfig
) {
const key = `ratelimit:${identifier}`;
const count = await redis.incr(key);
if (count === 1) {
await redis.expire(key, Math.ceil(config.interval / 1000));
}
return {
success: count <= config.maxRequests,
remaining: Math.max(0, config.maxRequests - count),
};
}重要なアクションのログ記録を推奨:
- ログイン / ログアウト
- データの作成 / 更新 / 削除
- 権限変更
- 設定変更
Content Security Policy の設定を推奨:
// next.config.js
{
key: "Content-Security-Policy",
value: "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;"
}- 本番環境では必ず HTTPS を使用
NEXTAUTH_URLをhttps://から始める- HTTP リクエストを HTTPS にリダイレクト
- セッションタイムアウトの実装
- ログアウト時のトークン無効化
- 複数デバイス管理
-
NEXTAUTH_SECRETがデフォルト値から変更されている -
NEXTAUTH_URLが本番環境の URL に設定されている - HTTPS が有効化されている
- 環境変数が適切に設定されている
- データベース接続が SSL/TLS を使用している
-
npm auditで脆弱性をチェック - 依存パッケージを最新版に更新
- セキュリティパッチの適用
- アクセスログの監視
- 異常なログイン試行の検出
セキュリティ上の問題を発見した場合は、以下の手順で報告してください:
- 公開リポジトリには投稿しない
- プロジェクト管理者に直接連絡
- 詳細な再現手順を提供
- 修正まで情報を非公開に保つ