개발 slecs

CDN 엣지 IP 회전 우회 막은 rate limit 개선

목차

블로그 서비스의 rate limit이 클라우드플레어 엣지 IP를 기준으로 작동하면서 공격자가 쉽게 우회할 수 있다는 걸 발견했다. CF-Connecting-IP 헤더를 기준으로 실제 클라이언트 IP를 감지하도록 변경해서 이 취약점을 막았다.

왜 문제였나

Rate limiting은 DDoS 방어, 리소스 남용 방지, API 공정성 보장 같은 중요한 보안 기제다. 그런데 우리 블로그는 클라우드플레어를 CDN으로 사용하고 있었다. 여기서 발생한 문제는 간단한데, 요청이 CF 엣지를 거치면서 원본 IP 정보가 사라지고 CF 엣지 IP만 서버에 전달되는 것이었다.

클라우드플레어 같은 대규모 CDN의 엣지 서버는 수십, 수백 개 수준으로 존재하고, 요청이 유입되는 지역/시간대에 따라 다른 엣지를 거친다. 이는 클라이언트 입장에서 IP가 "회전"하는 것처럼 보인다. 우리 rate limit 로직이 이 엣지 IP를 기준으로 동작하면, 공격자는 여러 엣지를 순회하면서 마치 다른 IP에서 요청하는 것처럼 위장할 수 있었다. 실제로는 한 명의 공격자인데 rate limit을 우회할 수 있다는 뜻이다.

# Before: 프록시 뒤의 IP를 신뢰하면 우회 가능
request_ip = request.remote_addr  # CF 엣지 IP만 전달됨
check_rate_limit(request_ip)

해결: CF-Connecting-IP로 실제 클라이언트 IP 감지

클라우드플레어는 자신들의 엣지를 통과한 모든 요청에 CF-Connecting-IP 헤더를 자동으로 추가한다. 이 헤더는 원래 클라이언트(최종 사용자)의 실제 IP를 담고 있다. CF가 신뢰할 수 있는 서드파티이고, 이 헤더는 검증 불가능한 클라이언트가 임의로 조작할 수 없으므로 안전하다.

app/main.py를 수정해서 요청의 CF-Connecting-IP 헤더를 우선 확인하고, 없으면 X-Forwarded-For(다른 프록시용), 마지막으로 remote_addr로 폴백하는 순서로 IP를 추출하도록 변경했다.

# After: CDN을 통한 실제 클라이언트 IP 감지
def get_client_ip(request):
    # CF 환경에서 가장 신뢰할 수 있는 헤더 우선
    if request.headers.get('CF-Connecting-IP'):
        return request.headers.get('CF-Connecting-IP')
    # 다른 프록시 환경용 폴백
    if request.headers.get('X-Forwarded-For'):
        return request.headers.get('X-Forwarded-For').split(',')[0]
    # 직접 연결
    return request.remote_addr

check_rate_limit(get_client_ip(request))
기준 문제점 해결 후
IP 소스 CF 엣지 IP (회전함) 실제 클라이언트 IP (고정)
우회 가능성 높음 (엣지 순회) 낮음 (원본 IP 기반)
신뢰성 낮음 (프록시만 전달) 높음 (CF가 보증)

회고: 프록시 환경의 일반론

이 경험에서 얻은 교훈은 프록시/로드밸런서/CDN 환경에서는 항상 "IP는 누가 제공하나"를 의심해야 한다는 것이다.

  • 프록시 뒤의 IP 감지: X-Forwarded-For, CF-Connecting-IP, True-Client-IP 같은 헤더들은 해당 서비스의 표준이다. 직접 구현하거나 일반 remote_addr을 믿으면 안 된다.
  • 헤더 검증: 신뢰하는 프록시(CF, AWS ALB, 자사 로드밸런서)에서만 이런 헤더를 읽어야 한다. 공개 인터넷에 노출된 서버라면 클라이언트가 임의로 헤더를 조작할 수 있으므로 위험하다.
  • Rate limit 외 영역: IP 기반 차단, 지역 제한, 감사 로그 같은 보안/규정 관련 기능도 같은 문제를 겪는다. IP 감지 로직을 한 곳에 집중하고 팀원들이 그걸 재사용하도록 문서화하는 게 좋다.

블로그 정도 규모라면 rate limit이 절대적 보안은 아니지만, 서비스 안정성과 공정성을 위해선 정확한 IP 감지가 기본이다. 이번 수정이 작은 패치처럼 보이지만, 실제로는 여러 취약점을 함께 방어하는 초석이 된다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.