Vol.11

セキュリティを最初から考慮する開発

はじめに

AI開発だからといって、セキュリティを軽視することはできません。むしろ、AIに明確なセキュリティ要件を伝えることで、最初から安全なシステムを構築できます。

基本的なセキュリティ対策

1. 認証と認可

【認証(Authentication)】
「誰であるか」を確認
→ ログイン機能、JWTトークン

【認可(Authorization)】
「何ができるか」を確認
→ ロール管理、権限チェック

実装例:
- 管理者のみがユーザー一覧を閲覧可能
- 自分のデータのみ編集可能

2. 入力値のバリデーション

【サーバーサイドで必ず検証】
✗ フロントエンドのみでチェック
◯ サーバーサイドでも必ずチェック

検証項目:
- 型(文字列、数値、日付)
- 長さ(最小、最大)
- 形式(メールアドレス、電話番号)
- 範囲(許可された値のみ)

3. SQLインジェクション対策

【プリペアドステートメント使用】
✗ 危険:
"SELECT * FROM users WHERE id = " + user_id

◯ 安全:
db.get("SELECT * FROM users WHERE id = ?", [user_id])

4. XSS対策

【出力時のエスケープ】
ユーザー入力を画面に表示する際は
必ずHTMLエスケープする

✗ 危険:innerHTML = user_input
◯ 安全:textContent = user_input

セキュリティ仕様の書き方

## セキュリティ要件

### 認証
- JWTトークンによる認証
- トークン有効期限:24時間
- リフレッシュトークン:7日

### 認可
| ロール | 権限 |
|--------|------|
| admin | 全機能 |
| user | 自分のデータのみ |

### パスワード
- 最小8文字
- bcryptでハッシュ化
- ソルト付き

### 通信
- HTTPS必須
- CORSを適切に設定

AIへの指示例

【セキュリティを意識した指示】

「ユーザー登録APIを実装してください。
セキュリティ要件:
- パスワードはbcryptでハッシュ化
- SQLインジェクション対策としてプリペアドステートメント使用
- 入力値は必ずサーバーサイドでバリデーション
- エラーメッセージに内部情報を含めない」

セキュリティチェックリスト

  • □ 認証が必要なAPIは保護されているか
  • □ 権限チェックは実装されているか
  • □ 入力値はサーバーサイドで検証しているか
  • □ SQLはプリペアドステートメントか
  • □ パスワードはハッシュ化されているか
  • □ エラーメッセージは安全か
  • □ HTTPSは設定されているか

まとめ

セキュリティは後付けではなく、最初から組み込むべきものです。仕様書にセキュリティ要件を明記し、AIに正しく伝えることで、安全なシステムを構築できます。


次回:「テスト駆動開発とAIの組み合わせ」