APIセキュリティの重要性

APIは現代のアプリケーションの「裏口」です。適切なセキュリティ対策なしに公開されたAPIは、データ漏洩・不正アクセス・サービス妨害の主要な攻撃ベクトルになります。

認証(Authentication)の実装

JWT(JSON Web Token):ステートレスな認証に最もよく使われます。ユーザーがログインするとサーバーがJWTを発行し、以降のリクエストでそのトークンを添付します。

import jwt
from datetime import datetime, timedelta

def create_token(user_id: str) -> str:
    payload = {
        "sub": user_id,
        "exp": datetime.utcnow() + timedelta(hours=1),
        "iat": datetime.utcnow()
    }
    return jwt.encode(payload, SECRET_KEY, algorithm="HS256")

認可(Authorization)の設計

モデル 説明 適用場面
RBAC ロール(管理者/ユーザー)に基づく 一般的なWebアプリ
ABAC 属性(部署/年齢/場所)に基づく 複雑な権限設計
ACL リソースごとにアクセスリストを管理 ファイルシステム系

レートリミットの実装

APIの乱用・DDoS対策として必須です。

from functools import wraps
import time

# 簡易レートリミット(Redis実装が本番向き)
request_counts = {}

def rate_limit(max_requests=100, window=60):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            ip = request.remote_addr
            now = time.time()
            if ip not in request_counts:
                request_counts[ip] = []
            request_counts[ip] = [t for t in request_counts[ip] if now - t < window]
            if len(request_counts[ip]) >= max_requests:
                return {"error": "Rate limit exceeded"}, 429
            request_counts[ip].append(now)
            return f(*args, **kwargs)
        return wrapper
    return decorator

その他の重要な対策

  • HTTPS強制:すべてのAPIトラフィックを暗号化
  • 入力バリデーション:SQLインジェクション・XSSを防ぐ
  • APIキーのローテーション:定期的な鍵更新の仕組みを整備
  • CORS設定:許可するオリジンを明示的に制限