보안 개선: - API 키 하드코딩 제거 (NAMECHEAP_API_KEY_INTERNAL) - CORS 정책: * → hosting.anvil.it.com 제한 - /health 엔드포인트 DB 정보 노출 방지 - Rate Limiting 인메모리 Map → Cloudflare KV 전환 - 분산 환경 일관성 보장 - 재시작 후에도 유지 - 자동 만료 (TTL) 문서: - CLAUDE.md Security 섹션 추가 - KV Namespace 설정 가이드 추가 - 배포/마이그레이션 가이드 추가 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
78 lines
2.3 KiB
Bash
Executable File
78 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# Rate Limit 테스트 스크립트
|
|
# Usage: ./test-rate-limit.sh [local|production]
|
|
|
|
set -e
|
|
|
|
# 환경 설정
|
|
ENV="${1:-local}"
|
|
if [ "$ENV" = "local" ]; then
|
|
URL="http://localhost:8787/webhook"
|
|
else
|
|
URL="https://telegram-summary-bot.kappa-d8e.workers.dev/webhook"
|
|
fi
|
|
|
|
# Webhook Secret (환경변수 또는 기본값)
|
|
TOKEN="${WEBHOOK_SECRET:-test-secret}"
|
|
|
|
echo "========================================="
|
|
echo "Rate Limit 테스트"
|
|
echo "환경: $ENV"
|
|
echo "URL: $URL"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
# 카운터
|
|
SUCCESS=0
|
|
RATE_LIMITED=0
|
|
|
|
# 35번 요청 (Rate Limit: 30/60초)
|
|
for i in {1..35}; do
|
|
echo -n "Request $i: "
|
|
|
|
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$URL" \
|
|
-H "Content-Type: application/json" \
|
|
-H "X-Telegram-Bot-Api-Secret-Token: $TOKEN" \
|
|
-d "{\"update_id\":$i,\"message\":{\"message_id\":$i,\"from\":{\"id\":123,\"is_bot\":false,\"first_name\":\"Test\"},\"chat\":{\"id\":123,\"type\":\"private\"},\"date\":$(date +%s),\"text\":\"테스트 $i\"}}")
|
|
|
|
if [ "$RESPONSE" = "200" ]; then
|
|
echo "✅ OK (HTTP 200)"
|
|
SUCCESS=$((SUCCESS + 1))
|
|
else
|
|
echo "❌ FAILED (HTTP $RESPONSE)"
|
|
fi
|
|
|
|
# 응답 본문 확인 (Rate Limit 메시지 검증)
|
|
BODY=$(curl -s -X POST "$URL" \
|
|
-H "Content-Type: application/json" \
|
|
-H "X-Telegram-Bot-Api-Secret-Token: $TOKEN" \
|
|
-d "{\"update_id\":$i,\"message\":{\"message_id\":$i,\"from\":{\"id\":123,\"is_bot\":false,\"first_name\":\"Test\"},\"chat\":{\"id\":123,\"type\":\"private\"},\"date\":$(date +%s),\"text\":\"테스트 $i\"}}")
|
|
|
|
if echo "$BODY" | grep -q "너무 많은 요청"; then
|
|
echo " └─ Rate Limit 메시지 감지"
|
|
RATE_LIMITED=$((RATE_LIMITED + 1))
|
|
fi
|
|
|
|
# 요청 간격 (0.2초)
|
|
sleep 0.2
|
|
done
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo "결과 요약"
|
|
echo "========================================="
|
|
echo "총 요청: 35"
|
|
echo "성공: $SUCCESS"
|
|
echo "Rate Limited: $RATE_LIMITED"
|
|
echo ""
|
|
|
|
if [ $SUCCESS -ge 30 ] && [ $SUCCESS -le 32 ]; then
|
|
echo "✅ Rate Limiting이 정상적으로 동작합니다."
|
|
echo " (30-32개 요청 허용, 나머지 차단)"
|
|
exit 0
|
|
else
|
|
echo "❌ Rate Limiting이 예상과 다르게 동작합니다."
|
|
echo " (예상: 30-32개 허용, 실제: $SUCCESS개)"
|
|
exit 1
|
|
fi
|