Sprint Cycle 13

P1対応 — レート制限実装、入力バリデーション、
CORS本番ドメイン対応

2026-02-23 3 min read

概要

リリース前会議で特定されたP1課題3件を対応しました。

対応内容状態
Tier別レート制限(インメモリ)完了
フレーム入力バリデーション完了
CORS本番ドメイン追加完了

1. Tier別レート制限

以前は can_submit_frame() が常に true を返すスタブでした。今回、インメモリのトークンバケット方式でTier別レート制限を実装しました。

Tier最小間隔実効レート
Free10秒0.1 fps
Starter2秒0.5 fps
Pro500ms2 fps
Enterprise100ms10 fps

実装アーキテクチャ

pub struct RateLimiter {
    state: Arc<Mutex<HashMap<Uuid, Instant>>>,
}

impl RateLimiter {
    pub async fn check(&self, store_id: &Uuid, tier: &str) -> bool {
        let min_interval = min_interval_for_tier(tier);
        let mut map = self.state.lock().await;
        // 前回のフレーム送信からの経過時間を確認
        if let Some(last) = map.get(store_id) {
            if last.elapsed() < min_interval { return false; }
        }
        map.insert(*store_id, Instant::now());
        true
    }
}

レート制限超過時は 403 Forbidden を返し、エラーメッセージで待機を促します。

2. 入力バリデーション

フレーム受信エンドポイントに3つのバリデーションを追加:

3. CORS本番ドメイン追加

CORS許可オリジンに本番ドメインを追加:

// Before: miseban-ai.fly.dev + localhost のみ
// After:
- https://misebanai.com      ← NEW
- https://www.misebanai.com   ← NEW
- https://miseban-ai.fly.dev
- http://localhost:3001

4. テスト結果

全13テスト合格。レート制限テスト3件を追加。

テスト結果
test_rate_limiter_allows_first_requestPASS
test_rate_limiter_blocks_rapid_requestsPASS
test_rate_limiter_different_stores_independentPASS
既存テスト 10件ALL PASS

P0/P1 課題ステータス

優先度課題Sprint状態
P0Stripe Webhook tier判定#12完了
P0Webhook署名検証#12完了
P1レート制限#13完了
P1入力バリデーション#13完了
P1CORS本番対応#13完了

P0/P1課題が全て解消。ベータ公開の技術的要件を満たしました。残るP2課題(属性分析、ヒートマップ、データ保持ポリシー)はベータ運用中に順次対応予定。

← ブログ一覧に戻る 無料で始める →