2025년 12월 5일 Cloudflare 장애 사태 공식 사후 분석 (번역)

지난주 금요일인 2025년 12월 5일에 인블로그 서비스 일부에서 접속 오류가 발생했습니다. 이는 Cloudflare 서비스 장애로 인한 여파였는데요. Cloudflare의 공식 사후 분석 문서를 번역합니다.
Sangwon Im's avatar
Dec 08, 2025
2025년 12월 5일 Cloudflare 장애 사태 공식 사후 분석 (번역)

🔗

2025년 12월 5일 08:47 (UTC 기준, 한국 시간 17:47)에 Cloudflare 네트워크의 일부에서 심각한 장애가 발생하기 시작했습니다. 인시던트는 09:12 (UTC 기준, 한국 시간 18:12)에 해결되었으며(총 약 25분간 영향), 모든 서비스가 완전히 복구되었습니다.

일부 고객이 영향을 받았으며, 이는 Cloudflare가 처리하는 전체 HTTP 트래픽의 약 28%에 해당합니다. 아래 설명된 대로 개별 고객이 영향을 받으려면 여러 요소가 결합되어야 했습니다.

이 문제는 Cloudflare 시스템에 대한 사이버 공격이나 어떤 종류의 악의적인 활동에 의해 직접적으로든 간접적으로든 발생하지 않았습니다. 대신, 이번 주에 공개된 React Server Components의 업계 전반 취약점을 탐지하고 완화하려는 과정에서 본문 파싱 로직에 대한 변경으로 인해 촉발되었습니다.

우리 시스템의 어떤 장애도 용납될 수 없으며, 11월 18일 인시던트에 이어 다시 한번 인터넷을 실망시켰다는 것을 알고 있습니다. 이러한 유형의 인시던트가 발생하지 않도록 진행 중인 작업에 대한 세부 사항을 다음 주에 게시할 예정입니다.

무슨 일이 있었나

아래 그래프는 인시던트 기간 동안 네트워크에서 제공된 HTTP 500 오류(하단 빨간 선)와 영향받지 않은 전체 Cloudflare 트래픽(상단 녹색 선)을 비교합니다.

500 error codes served by Cloudflare’s network during the incident

Cloudflare의 웹 애플리케이션 방화벽(WAF)은 고객에게 악성 페이로드에 대한 보호를 제공하여 이를 탐지하고 차단할 수 있게 합니다. 이를 위해 Cloudflare의 프록시는 분석을 위해 HTTP 요청 본문 콘텐츠를 메모리에 버퍼링합니다. 오늘 이전까지 버퍼 크기는 128KB로 설정되어 있었습니다.

React를 사용하는 고객을 심각한 취약점인 CVE-2025-55182 로부터 보호하기 위한 지속적인 작업의 일환으로, 가능한 한 많은 고객이 보호받을 수 있도록 버퍼 크기를 Next.js 애플리케이션에서 허용하는 기본 한도인 1MB로 증가시키는 작업을 롤아웃하기 시작했습니다.

이 첫 번째 변경 사항은 점진적 배포 시스템을 사용하여 롤아웃되었습니다. 롤아웃 중에 내부 WAF 테스트 도구가 증가된 버퍼 크기를 지원하지 않는다는 것을 발견했습니다. 이 내부 테스트 도구는 당시 필요하지 않았고 고객 트래픽에 영향을 미치지 않았기 때문에, 이를 끄는 두 번째 변경을 수행했습니다.

WAF 테스트 도구를 끄는 이 두 번째 변경은 글로벌 구성 시스템을 사용하여 구현되었습니다. 이 시스템은 점진적 롤아웃을 수행하지 않고, 몇 초 내에 네트워크의 전체 서버 플릿에 변경 사항을 전파하며, 11월 18일에 발생한 장애 이후 검토 중에 있습니다.

안타깝게도, FL1 버전의 프록시에서 특정 상황에서 WAF 규칙 테스트 도구를 끄는 두 번째 변경이 오류 상태를 유발하여 네트워크에서 500 HTTP 오류 코드가 반환되는 결과를 초래했습니다.

변경 사항이 네트워크에 전파되자마자, FL1 프록시의 코드 실행이 규칙 모듈의 버그에 도달하여 다음과 같은 Lua 예외가 발생했습니다:

[lua] Failed to run module rulesets callback late_routing: /usr/local/nginx-fl/lua/modules/init.lua:314: attempt to index field 'execute' (a nil value)

그 결과로 HTTP 500 오류가 발생했습니다.

문제는 변경 적용 직후 확인되었고, 09:12(UTC 기준, 한국 시간 18:12)에 롤백되어 이후 모든 트래픽이 정상적으로 처리되었습니다.

구버전 FL1 프록시로 웹 자산이 제공되고 있으면서(AND) Cloudflare Managed Ruleset이 배포된 고객이 영향을 받았습니다. 이 상태의 웹사이트에 대한 모든 요청이 HTTP 500 오류를 반환했으며, /cdn-cgi/trace와 같은 일부 테스트 엔드포인트는 예외였습니다.

위 구성이 적용되지 않은 고객은 영향을 받지 않았습니다. 중국 네트워크를 통해 제공되는 고객 트래픽도 영향을 받지 않았습니다.

런타임 오류

Cloudflare의 규칙 세트 시스템은 시스템에 들어오는 각 요청에 대해 평가되는 규칙 집합으로 구성됩니다. 규칙은 특정 트래픽을 선택하는 필터와 해당 트래픽에 효과를 적용하는 액션으로 구성됩니다. 일반적인 액션은 "block", "log", "skip"입니다. 또 다른 유형의 액션은 "execute"로, 다른 규칙 세트의 평가를 트리거하는 데 사용됩니다.

내부 로깅 시스템은 이 기능을 사용하여 새 규칙을 공개하기 전에 평가합니다. 최상위 규칙 세트가 테스트 규칙을 포함한 다른 규칙 세트를 실행합니다. 우리가 비활성화하려던 것이 바로 이 테스트 규칙이었습니다.

규칙 세트 시스템의 일부로 킬스위치 서브시스템이 있어 오작동하는 규칙을 빠르게 비활성화할 수 있습니다. 이 킬스위치 시스템은 앞서 언급한 글로벌 구성 시스템에서 정보를 받습니다. 과거에 여러 차례 이 킬스위치 시스템을 사용하여 인시던트를 완화했으며, 이번 인시던트에서도 잘 정의된 표준 운영 절차를 따랐습니다.

그러나 "execute" 액션을 가진 규칙에 킬스위치를 적용한 적은 없었습니다. 킬스위치가 적용되었을 때, 코드는 execute 액션 평가를 올바르게 건너뛰었고 해당 하위 규칙 세트를 평가하지 않았습니다. 하지만 규칙 세트 평가의 전체 결과를 처리하는 중에 오류가 발생했습니다:

if rule_result.action == "execute" then
  rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)]
end

이 코드는 규칙 세트의 action이 "execute"이면 "rule_result.execute" 객체가 존재할 것으로 예상합니다. 하지만 규칙이 건너뛰어졌기 때문에 rule_result.execute 객체가 존재하지 않았고, Lua는 nil 값에서 값을 조회하려는 시도로 인해 오류를 반환했습니다.

이것은 수년간 감지되지 않은 채 존재해 온 코드의 단순한 오류입니다. 이런 유형의 코드 오류는 강력한 타입 시스템을 가진 언어에서는 방지됩니다. Rust로 작성된 새로운 FL2 프록시의 대체 코드에서는 이 오류가 발생하지 않았습니다.

2025년 11월 18일 인시던트 이후 진행 중인 변경 사항은?

2주 전인 2025년 11월 18일에 유사하지만 더 긴 가용성 인시던트를 일으킨 관련 없는 변경을 수행했습니다. 두 경우 모두 고객의 보안 문제를 완화하기 위한 배포가 전체 네트워크에 전파되어 거의 모든 고객 기반에 오류를 일으켰습니다.

해당 인시던트 이후 수백 명의 고객과 직접 대화하고 단일 업데이트가 이런 광범위한 영향을 일으키는 것을 방지하기 위한 변경 계획을 공유했습니다. 이러한 변경이 오늘의 인시던트 영향을 방지하는 데 도움이 되었을 것으로 믿지만, 안타깝게도 아직 배포를 완료하지 못했습니다.

이 작업이 아직 완료되지 않아 실망스럽다는 것을 알고 있습니다. 이것은 조직 전체에서 최우선 과제로 남아 있습니다. 특히 아래에 설명된 프로젝트들이 이런 종류의 변경 영향을 억제하는 데 도움이 될 것입니다:

  • 향상된 롤아웃 및 버전 관리: 엄격한 상태 검증으로 소프트웨어를 천천히 배포하는 것과 유사하게, 신속한 위협 대응 및 일반 구성에 사용되는 데이터도 동일한 안전성과 폭발 반경 완화 기능을 갖춰야 합니다. 여기에는 상태 검증과 빠른 롤백 기능 등이 포함됩니다.

  • 간소화된 비상 조치 기능: 추가적인 유형의 장애 상황에서도 중요한 작업을 수행할 수 있도록 보장합니다. 이는 내부 서비스뿐만 아니라 모든 Cloudflare 고객이 사용하는 Cloudflare 컨트롤 플레인과의 모든 표준 상호작용 방법에 적용됩니다.

  • "Fail-Open" 오류 처리: 복원력 노력의 일환으로, 모든 중요한 Cloudflare 데이터 플레인 구성 요소에서 잘못 적용된 하드 페일 로직을 교체하고 있습니다. 구성 파일이 손상되었거나 범위를 벗어난 경우(예: 기능 제한 초과), 시스템은 오류를 기록하고 알려진 정상 상태로 기본 설정하거나 점수 매기기 없이 트래픽을 통과시킵니다. 일부 서비스는 특정 시나리오에서 고객에게 fail open 또는 closed 옵션을 제공할 것입니다. 이것이 지속적으로 시행되도록 드리프트 방지 기능도 포함될 것입니다.

다음 주 말까지 위에 나열된 것을 포함하여 진행 중인 모든 복원력 프로젝트에 대한 상세한 분석을 게시할 것입니다. 이 작업이 진행되는 동안, 더 나은 완화 및 롤백 시스템을 갖추기 전까지 네트워크에 대한 모든 변경을 동결하고 있습니다.

이런 종류의 인시던트와 이들이 얼마나 가깝게 연속으로 발생했는지는 우리 네트워크에 허용될 수 없습니다. Cloudflare 팀을 대표하여 고객과 인터넷 전체에 다시 한번 야기한 영향과 불편에 대해 사과드립니다.

타임라인

시간 (KST)

상태

설명

17:47

인시던트 시작

구성 변경 배포 및 네트워크 전파

17:48

전체 영향

변경 사항 완전 전파

17:50

인시던트 선언

자동 알림 발생

18:11

변경 롤백

구성 변경 롤백 및 전파 시작

18:12

인시던트 종료

롤백 완전 전파, 모든 트래픽 복구

인블로그 팀 의견

최근 AWS, Supabase, Cloudflare 등 저희가 사용 중인 인프라 오류로 인해 서비스 다운타임이 발생하여 매우 송구스럽게 생각합니다. 팀에서도 해당 이슈 발생 시 비상 대응 체계를 가동하여 빠르게 대응하고 있으니 양해 부탁드립니다.

저희도 인프라 다중화 및 장애 대응 체계를 지속적으로 강화하여, 더욱 안정적인 서비스를 제공할 수 있도록 노력하고 있습니다. 앞으로도 더 나은 서비스를 제공할 수 있도록 하겠습니다.

서비스 관련 피드백은 아래 채팅으로 남겨주시면 감사하겠습니다 :)

Share article