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 がますます攻撃の主要な標的となるなか、設計段階から セキュリティに投資することは、データを保護しユーザーの信頼を維持するうえで不可欠です。