API セキュリティ
API は現代のアプリケーションの基盤です。REST および GraphQL endpoints を 不正アクセス、コードインジェクション、悪用から保護することは、アプリケーションセキュリティの根幹です。
OWASP API Security Top 10
1. Broken Object Level Authorization
リクエスト内の ID を操作することで他のユーザーのオブジェクトへのアクセスを許してしまう欠陥。
- ユーザーが要求されたリソースにアクセスする権限を持っているか常に検証する
- 連番の ID ではなくランダムな識別子(UUID)を使用する
- 自動化された認可テストを実装する
2. Broken Authentication
他のユーザーになりすますことを許してしまう認証メカニズムの脆弱性。
- MFA(Multi-Factor Authentication)を実装する
- 有効期限の短い tokens を使用する
- ログイン endpoints に rate limiting を実装する
- すべてのリクエストで tokens を検証する
3. Broken Object Property Level Authorization
制限されるべきプロパティの露出や変更(mass assignment)。
4. Unrestricted Resource Consumption
リクエストに制限がないことで DoS や過度なリソース消費を許してしまう状態。
5. Broken Function Level Authorization
ユーザーが endpoints を操作して管理機能にアクセスする状態。
認証と認可
OAuth 2.0
アクセス委譲のための業界標準の認可フレームワーク。
- Authorization Code Flow:サーバーサイドの web アプリケーション向け
- PKCE:SPAs およびモバイル向けの Proof Key for Code Exchange
- Client Credentials:machine-to-machine 通信向け
- Refresh Tokens:再認証なしでセッションを維持するため
JSON Web Tokens (JWT)
- 可能な場合は HS256 ではなく安全なアルゴリズム(RS256、ES256)を使用する
- issuer (iss)、audience (aud)、expiration (exp) を検証する
- payload に機密データを保存しない(JWT はデコード可能)
- logout のために token rotation と blacklisting を実装する
- short-lived access tokens(15 分)を refresh tokens と併用する
API Keys
- エンドユーザーではなくサービスの認証に使用する
- keys を定期的にローテーションする
- key ごとに異なる権限レベルを実装する
- 使用状況を監視し異常を検出する
Rate Limiting と Throttling
Rate Limiting 戦略
- Fixed Window:時間ウィンドウごとの固定上限(例:100 req/min)
- Sliding Window:より精密なスライディングウィンドウ
- Token Bucket:制御された bursts を許可
- Leaky Bucket:一定のレートでリクエストを処理
実装
- endpoint およびユーザー tier ごとに異なる上限
- 情報提供用 headers:X-RateLimit-Limit、X-RateLimit-Remaining
- Retry-After header 付きの 429 Too Many Requests レスポンス
- カウンターの分散保存に Redis を使用する
API Gateways
API を管理、監視、保護するための集中型レイヤー。
主な機能
- Authentication & Authorization:集中型の検証
- Rate Limiting:悪用に対する保護
- Request/Response Transformation:フォーマットの適応
- Logging & Monitoring:完全な可視性
- Caching:パフォーマンスの向上
- Load Balancing:負荷分散
主要なソリューション
- Kong:Nginx ベースの open-source gateway
- AWS API Gateway:AWS の managed ソリューション
- Apigee:Google の enterprise プラットフォーム
- Azure API Management:Microsoft の gateway
- Tyk:Go で書かれた open-source gateway
REST と GraphQL のセキュリティ比較
REST API Security
- backward compatibility のために versioning(/v1/、/v2/)を使用する
- リソース検出のために HATEOAS を実装する
- Content-Type および Accept headers を検証する
- HTTPS のみを使用する
- CORS を適切に実装する
GraphQL Security
- Query Depth Limiting:再帰的な queries を防止する
- Query Complexity Analysis:実行前にコストを計算する
- Disable Introspection:本番環境では schema introspection を無効化する
- Field-Level Authorization:フィールドごとにアクセスを制御する
- Persistent Queries:許可された queries のホワイトリスト
入力検証とサニタイズ
入力検証
- すべての入力の型、形式、長さ、範囲を検証する
- 自動検証のために schemas(JSON Schema、OpenAPI)を使用する
- 可能な場合は受け入れる値をホワイトリスト化する
- 無効なデータを含むリクエストを拒否する(fail securely)
Injection の防止
- SQL Injection:prepared statements と ORMs を使用する
- NoSQL Injection:queries を検証しサニタイズする
- Command Injection:システムコマンドの実行を避ける
- LDAP Injection:特殊文字をエスケープする
監視と Logging
必須のログ
- すべての認証試行(成功と失敗)
- 機密データの変更
- 認可の失敗
- Rate limiting violations
- エラーと例外
セキュリティメトリクス
- endpoint ごとのリクエストレート
- レイテンシと timeouts
- Status codes(特に 401、403、429)
- 異常なトラフィックパターン
ベストプラクティス
- HTTPS/TLS 1.3 のみを使用する
- security headers(HSTS、CSP、X-Frame-Options)を実装する
- 安全な updates を可能にするために API をバージョン管理する
- OpenAPI/Swagger で API を文書化する
- health checks と graceful degradation を実装する
- 連番の ID ではなく UUIDs を使用する
- stack traces や詳細なエラーメッセージを露出しない
- すべての操作に timeout を実装する
- 自動化されたセキュリティテスト(DAST)を実施する
テストツール
- Postman:手動および自動化された API テスト
- Burp Suite:Proxy および脆弱性スキャナー
- OWASP ZAP:open-source の自動スキャナー
- Insomnia:REST および GraphQL クライアント
- GraphQL Voyager:GraphQL schema の可視化
API セキュリティには、堅牢な認証、きめ細かな認可、厳格な入力検証、 rate limiting、継続的な監視、定期的なテストを組み合わせた多層的なアプローチが必要です。 API がますます攻撃の主要な標的となるなか、設計段階から セキュリティに投資することは、データを保護しユーザーの信頼を維持するうえで不可欠です。
