Node アプリケーションのセキュリティ確保とは、一般的な Web の脆弱性(OWASP Top 10)に対して複数のレイヤー — 入力処理、認証、依存関係、設定 — で防御することを意味します。セキュリティは単一の対策ではなく、レイヤー化された防御(defense in depth)です。
1. すべての入力を検証・サニタイズする
js
{ z } ;
schema = z.({ : z.().(), : z.().() });
data = schema.(req.);
Node アプリケーションのセキュリティ確保とは、一般的な Web の脆弱性(OWASP Top 10)に対して複数のレイヤー — 入力処理、認証、依存関係、設定 — で防御することを意味します。セキュリティは単一の対策ではなく、レイヤー化された防御(defense in depth)です。
{ z } ;
schema = z.({ : z.().(), : z.().() });
data = schema.(req.);
// ❌ 文字列連結 → SQL injection
db.query(`SELECT * FROM users WHERE id = ${req.params.id}`);
// ✅ パラメータ化クエリ — 入力はデータであり、実行可能な SQL ではない
db.query("SELECT * FROM users WHERE id = $1", [req.params.id]);
常にパラメータ化クエリ/ORM を使用し、ユーザー入力からコマンドを組み立てないこと(child_process のコマンドインジェクションを参照)。
✓ パスワードは bcrypt/argon2/scrypt(遅い + ソルト付き)でハッシュ化 — 平文/SHA は不可
✓ シークレットは環境変数に保存し、コード/git には決して入れない
✓ セッションには httpOnly, secure, sameSite な cookie を使う(XSS 耐性)
✓ JWT を適切に署名/検証し、トークンは短命に保つ
import helmet from "helmet";
import rateLimit from "express-rate-limit";
app.use(helmet()); // セキュアな HTTP ヘッダーを設定(CSP, HSTS, X-Frame-Options など)
app.use(rateLimit({ windowMs: 60_000, max: 100 })); // 不正利用/ブルートフォースを抑制
helmet は保護用のヘッダーを追加し、レート制限はブルートフォースや DoS を防ぎます。
npm audit # インストール済みパッケージの既知の脆弱性を確認
npm audit fix
# + 依存関係を最新に保つ;postinstall スクリプトをレビュー;lockfile でバージョンを固定
Node のコードの大半はサードパーティのパッケージです。脆弱な依存関係は主要な攻撃経路となります。定期的に監査・更新しましょう。
✓ すべてに HTTPS(TLS)を使う;HTTP → HTTPS にリダイレクト
✓ 本番でエラーの詳細/スタックトレースをクライアントに漏らさない
✓ XSS を防ぐため出力をエスケープする(フレームワークが通常行う)
✓ 適切な認可(認証だけでなく)を実装する — アクションごとに権限を確認
✓ CORS は "*" ではなく許可リストに設定(認証情報を伴う API では特に)
✓ ペイロードベースの DoS を防ぐためリクエストボディサイズを制限
Web アプリは常に攻撃の標的であり、Node アプリは Web の脆弱性全般 — インジェクション、認証の破綻、XSS、脆弱な依存関係、設定ミス — にさらされています。
単一の対策では不十分で、セキュリティはレイヤー化されます。入力を検証し、クエリをパラメータ化し、パスワードを正しくハッシュ化し、シークレットを安全に管理し、保護ヘッダーを設定し、レート制限をかけ、依存関係を監査し、HTTPS を使う。
これらのプラクティス(およびその背後にある OWASP のリスク)を理解することは、本番の Node サービスを構築する誰もが負う必須の責任です。見落とされた一つのレイヤー(インジェクション、漏れたシークレット、未修正の依存関係)がシステム全体を危険にさらしうるのです。