Advanced

How to Implement Rate Limiting: Claude Code 활용 가이드

implement rate limiting: Claude Code 활용. 실용적인 코드 예시와 단계별 가이드를 포함합니다.

なぜレート制限が必要か

APIを公開する際、レート制限はサービスの安定운영に필수적입니다。DDoS攻撃の防御、リソースの公平な配分、コスト관리など、多くの目的で使われます。Claude Code를 활용하면 要件に合ったレート制限の구현を短시간で생성할 수 있습니다。

토큰バケットアルゴリズム

もっとも일반적인レート制限アルゴリズムをTypeScriptで구현します。

> 토큰バケットアルゴリズムでレート制限를 구현해줘。
> Redis를 사용한스케일러블な구현にして。
import Redis from "ioredis";

const redis = new Redis();

interface RateLimitResult {
  allowed: boolean;
  remaining: number;
  resetAt: number;
}

export async function checkRateLimit(
  key: string,
  maxTokens: number,
  refillRate: number, // 토큰/秒
  windowSeconds: number
): Promise<RateLimitResult> {
  const now = Date.now();
  const luaScript = `
    local key = KEYS[1]
    local max_tokens = tonumber(ARGV[1])
    local refill_rate = tonumber(ARGV[2])
    local now = tonumber(ARGV[3])
    local window = tonumber(ARGV[4])

    local data = redis.call('HMGET', key, 'tokens', 'last_refill')
    local tokens = tonumber(data[1]) or max_tokens
    local last_refill = tonumber(data[2]) or now

    -- トークンの補充
    local elapsed = (now - last_refill) / 1000
    tokens = math.min(max_tokens, tokens + elapsed * refill_rate)

    local allowed = tokens >= 1
    if allowed then
      tokens = tokens - 1
    end

    redis.call('HMSET', key, 'tokens', tokens, 'last_refill', now)
    redis.call('EXPIRE', key, window)

    return {allowed and 1 or 0, math.floor(tokens), now + math.floor((1 - tokens) / refill_rate * 1000)}
  `;

  const result = await redis.eval(
    luaScript, 1, key,
    maxTokens, refillRate, now, windowSeconds
  ) as number[];

  return {
    allowed: result[0] === 1,
    remaining: result[1],
    resetAt: result[2],
  };
}

Express 미들웨어로서使う

上記のロジックをExpress미들웨어に組み込みます。

import { Request, Response, NextFunction } from "express";
import { checkRateLimit } from "./rate-limiter";

interface RateLimitOptions {
  maxRequests: number;
  windowSeconds: number;
  keyGenerator?: (req: Request) => string;
}

export function rateLimit(options: RateLimitOptions) {
  const {
    maxRequests,
    windowSeconds,
    keyGenerator = (req) => req.ip || "unknown",
  } = options;

  return async (req: Request, res: Response, next: NextFunction) => {
    const key = `rate_limit:${keyGenerator(req)}`;
    const result = await checkRateLimit(
      key, maxRequests, maxRequests / windowSeconds, windowSeconds
    );

    res.setHeader("X-RateLimit-Limit", maxRequests);
    res.setHeader("X-RateLimit-Remaining", result.remaining);
    res.setHeader("X-RateLimit-Reset", Math.ceil(result.resetAt / 1000));

    if (!result.allowed) {
      return res.status(429).json({
        error: "Too Many Requests",
        message: "リクエスト数が上限に達しました。しばらく待ってから再試行してください。",
        retryAfter: Math.ceil((result.resetAt - Date.now()) / 1000),
      });
    }

    next();
  };
}

// Usage example
import express from "express";
const app = express();

// API全体に適用:1分あたり60요청
app.use("/api", rateLimit({ maxRequests: 60, windowSeconds: 60 }));

// 인증엔드포인트はより厳しく:1分あたり5요청
app.use("/api/auth", rateLimit({
  maxRequests: 5,
  windowSeconds: 60,
  keyGenerator: (req) => `auth:${req.ip}`,
}));

Redisなしの簡易구현

小規模な프로젝트ではイン메모리での구현も유효です。

const requestCounts = new Map<string, { count: number; resetAt: number }>();

export function simpleRateLimit(maxRequests: number, windowMs: number) {
  // Periodic cleanup
  setInterval(() => {
    const now = Date.now();
    for (const [key, data] of requestCounts) {
      if (data.resetAt < now) requestCounts.delete(key);
    }
  }, windowMs);

  return (req: Request, res: Response, next: NextFunction) => {
    const key = req.ip || "unknown";
    const now = Date.now();
    const record = requestCounts.get(key);

    if (!record || record.resetAt < now) {
      requestCounts.set(key, { count: 1, resetAt: now + windowMs });
      return next();
    }

    if (record.count >= maxRequests) {
      return res.status(429).json({ error: "Too Many Requests" });
    }

    record.count++;
    next();
  };
}

レート制限と組み合わせて검색機能を구현する方法は검색機能の구현를 확인하세요.APIの설계全般에 대해서는Claude Codeの入門가이드도 참고가 됩니다.

정리

Claude Code를 활용하면 토큰バケットからRedis연동まで、프로젝트に合ったレート制限を빠르게구현할 수 있습니다。보안要件を自然言語で伝えれば、적절한アルゴリズムと설정値を提案してくれます。

자세한 내용은Claude Code공식 문서를 참고하세요.

#Claude Code #rate limiting #API #security #Node.js