
Cloudflare의 Managed Challenge는 흔히 CAPTCHA처럼 이해되지만, 핵심은 “방문자를 무조건 막는 기능”이 아니다. 요청이 의심스러울 때 사람 또는 정상 브라우저인지 확인하도록 중간 검증을 거는 보안 절차에 가깝다. Cloudflare는 브라우저 신호를 평가해 대부분의 정상 방문자가 별도 조작 없이 통과하도록 설계했다고 설명한다.1
이 차이를 이해하면 Managed Challenge를 더 실용적으로 쓸 수 있다. 중요한 질문은 “CAPTCHA를 켤 것인가?”가 아니라 “어떤 요청에만 검증을 요구할 것인가?”다.
전체가 아니라 조건에 건다
흥미로운 사례가 있다. simonwillison.net/search/에는 Cloudflare CAPTCHA, 즉 Managed Challenge가 적용되어 있는데, 모든 검색 요청에 걸리는 것은 아니다.2
설정의 핵심은 검색 URL에 앰퍼샌드(&)가 포함될 때만 Challenge를 실행하는 것이다. 규칙은 /search/* 경로이면서 쿼리 문자열에 &가 들어간 요청을 조건으로 삼는다.2 그래서 단순한 검색 URL인 /search/?q=lemur는 CAPTCHA 없이 정상 동작한다.2
이 접근이 좋은 이유는 마찰을 좁게 만들기 때문이다. 검색 페이지는 자동화 요청이 몰리기 쉬운 표면이지만, 모든 검색 사용자에게 검증을 요구하면 정상 방문자 경험까지 나빠진다. 반대로 특정 경로와 특정 쿼리 패턴을 함께 조건으로 잡으면, 필요한 요청에만 추가 확인을 요구할 수 있다.
Cloudflare의 WAF 커스텀 규칙은 URL 경로, 쿼리 문자열, 헤더 같은 요청 속성을 기준으로 Challenge를 발동할 수 있다.3 Managed Challenge의 실용성은 바로 이 지점에 있다. 사이트 전체에 일괄 적용하는 기능이 아니라, 위험 신호가 있는 요청에만 질문을 던지는 정책 도구로 볼 수 있다.
Challenge 응답은 원본 응답이 아니다
운영 관점에서 중요한 부분은 응답 처리다. Cloudflare가 원본 서버 응답 대신 Challenge 페이지를 제공하면 응답에 Cf-Mitigated: challenge 헤더가 붙는다.4
Cf-Mitigated는 Cloudflare 전용 비공식 HTTP 헤더이며, 보안 규칙이 트리거됐음을 나타낸다.4 값은 challenge 하나뿐이고, Cloudflare는 Managed Challenge, Interactive Challenge, JS Challenge 페이지를 제공할 때 이 헤더를 설정한다.4
또 하나 주의할 점은 콘텐츠 타입이다. 원래 요청한 리소스가 JSON이든 이미지든, Challenge가 발생한 응답의 콘텐츠 타입은 항상 text/html이다.4 즉 프런트엔드에서 fetch나 XHR로 API를 호출할 때, 원래 JSON을 기대했더라도 HTML Challenge 페이지가 돌아올 수 있다.
따라서 클라이언트 코드는 상태 코드나 Content-Type만으로 판단하기보다 Cf-Mitigated 헤더를 함께 확인하는 편이 안전하다. 이 헤더가 challenge라면 원본 API 응답이 아니라 Cloudflare의 검증 페이지가 반환된 상황으로 처리해야 한다.
좋은 규칙은 좁고 설명 가능해야 한다
Managed Challenge를 잘 쓰려면 넓게 의심하기보다 좁게 검증해야 한다. 정상 사용자가 실제로 밟는 경로는 최대한 열어두고, 의심할 만한 조건이 겹칠 때만 마찰을 추가하는 방식이 실용적이다.
앰퍼샌드 하나를 조건으로 삼은 사례가 흥미로운 이유도 여기에 있다. 이 규칙은 검색 페이지 전체를 막지 않는다. /search/*라는 경로와 쿼리 문자열의 & 포함 여부를 함께 보고, 단순 검색은 통과시키며 특정 형태의 요청만 Challenge로 보낸다.
결국 Managed Challenge의 가치는 CAPTCHA 자체가 아니라 정책 설계에 있다. 사용자 경험을 해치지 않으면서 자동화 요청에 대응하려면, “어디에 검증을 걸 것인가”를 최대한 구체적으로 정해야 한다.
참고
1Challenges · Cloudflare challenges docs
2Cloudflare CAPTCHA on at least one ampersand
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
