はじめに
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の組み合わせ」