なぜセキュリティを学ぶのか
セキュリティは「守り」の技術だと思われがちだが、本質は信頼の設計だ。ユーザーのデータを守り、サービスの継続性を確保することは、エンジニアの基本的な責任である。
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設定の適切性
セキュリティは「後から追加するもの」ではない
最も重要な教訓は、セキュリティは設計段階から考えるということだ。後から追加しようとすると、コストが跳ね上がり、抜け漏れも増える。
小さなプロジェクトでも、最初から上記のチェックリストを習慣化することが、長期的なセキュリティの基盤になる。