なぜセキュリティを学ぶのか

セキュリティは「守り」の技術だと思われがちだが、本質は信頼の設計だ。ユーザーのデータを守り、サービスの継続性を確保することは、エンジニアの基本的な責任である。

OWASP Top 10 を起点にする

OWASP Top 10 は、Webアプリケーションで最も頻繁に見られる脆弱性のリストだ。まずこれを押さえることから始める。

現在の Top 10 の中で、特に実装時に意識すべき3つを挙げる。

1. インジェクション(SQLi / XSS)

ユーザー入力をそのまま処理することで発生する。

  • SQLインジェクション: プリペアドステートメントを必ず使う
  • XSS: 出力時にエスケープする、CSPヘッダーを設定する
// NG: 文字列結合でSQL生成
const query = `SELECT * FROM users WHERE id = ${userId}`

// OK: プリペアドステートメント
const query = db.prepare('SELECT * FROM users WHERE id = ?').get(userId)

2. 認証の不備

  • パスワードは必ずハッシュ化(bcrypt / argon2)
  • セッショントークンは推測不可能な十分な長さにする
  • ログイン試行回数を制限する(レート制限)

3. セキュリティの設定ミス

デフォルト設定のまま本番公開することで発生するケースが多い。

  • HTTPセキュリティヘッダーを設定する
  • 不要なエンドポイントを公開しない
  • 環境変数を .env に置き、.gitignore に含める

実装チェックリスト

コードレビューや本番デプロイ前に確認すべき項目:

  • [ ] ユーザー入力のバリデーション(サーバー側)
  • [ ] 依存パッケージの脆弱性チェック(npm audit
  • [ ] 機密情報のハードコードがないか
  • [ ] HTTPSの強制(HSTSヘッダー)
  • [ ] CORS設定の適切性

セキュリティは「後から追加するもの」ではない

最も重要な教訓は、セキュリティは設計段階から考えるということだ。後から追加しようとすると、コストが跳ね上がり、抜け漏れも増える。

小さなプロジェクトでも、最初から上記のチェックリストを習慣化することが、長期的なセキュリティの基盤になる。