목차
- 변경 전과 변경 후 — 무엇이 달라졌나
- WebGL 핑거프린팅이 실제로 측정하는 것
- 후보 셋을 놓고 본 비교 기준
- 항목별 비교 — 4종을 같은 잣대로
- 실제 트래픽 기준 30일 측정
- 그래서 무엇을 골랐나
변경 전과 변경 후 — 무엇이 달라졌나
그래서, 작년 말까지 회원가입 페이지는 reCAPTCHA v2 체크박스를 썼다. 봇은 그럭저럭 막혔지만 가입 페이지 이탈률이 23% 근처에서 내려오지 않았다. "이미지 9개 중 신호등을 모두 고르세요" 화면을 본 사용자의 절반은 거기서 페이지를 닫는다.
그래서, 올해 1월에 Cloudflare Turnstile로 갈아탔다. 무료에 사용자 마찰이 거의 없는 게 매력적이었다. 3개월을 돌리고 본 결과는 명확했다. 가입 페이지 이탈률은 23%에서 11%로 절반 가까이 줄었고, 일평균 봇 가입은 200~400건에서 30~50건으로 떨어졌다. CAPTCHA 관련 사용자 문의도 주 2~3건에서 주 0~1건 수준으로 거의 사라졌다.
예를 들어, 수치만 보면 갈아탄 게 맞다. 그런데 4월 들어 새로운 문의가 늘었다. "체크박스가 계속 돌기만 하고 끝나지 않는다"는 내용이었다. 사용자 환경을 받아보니 공통점이 있었다. Tor Browser, Brave의 가장 엄격한 차단 모드, privacy.resistFingerprinting=true를 켠 Firefox, 일부 구형 안드로이드 WebView. 전부 WebGL 정보를 막거나 균일화하는 브라우저였다.
이상한 건 같은 사용자가 평소 Chrome에서는 멀쩡히 통과하던 도메인이었다는 점이다. 환경의 차이만으로 통과와 실패가 갈렸다. 비슷한 시점에 다른 CAPTCHA 운영자들도 Reddit r/webdev와 HackerNews에 동일한 보고를 올리기 시작했다.
추적해보니 Turnstile이 챌린지 점수 계산에 WebGL 데이터를 적극적으로 쓰고 있었다. Cloudflare는 공식적으로 "텔레메트리에 다양한 신호를 쓴다"고만 밝히지만, privacycg 워킹그룹과 Tor 개발자 측의 분석에서 WebGL 비활성 시 챌린지 통과율이 급격히 떨어지는 게 재현됐다 (출처: privacycg/proposals 트래커, 2026-03 기준).
WebGL 핑거프린팅이 실제로 측정하는 것
WebGL fingerprinting은 브라우저의 그래픽 컨텍스트를 통해 기기 고유 정보를 뽑아내는 기법이다. 단순히 "GPU가 있다·없다"가 아니라 훨씬 미세한 차이를 본다.
canvas.getContext('webgl')로 컨텍스트를 만든 뒤 getParameter를 호출하면 UNMASKED_RENDERER_WEBGL과 UNMASKED_VENDOR_WEBGL 값을 얻을 수 있다. "ANGLE (Intel, Intel(R) UHD Graphics 620 Direct3D11)" 같은 문자열이 그대로 노출된다. 여기에 셰이더를 컴파일해 작은 도형을 렌더링하면 GPU 드라이버, OS, 그래픽 라이브러리 버전에 따라 픽셀 단위로 다른 결과가 나온다. 이 조합은 사용자 1만 명 중 1명 이하 수준의 고유성을 가진다고 알려져 있다 (출처: EFF Cover Your Tracks 프로젝트).
반면, 좀 더 풀어 쓰면 흐름은 이렇다. 작은 메시(예: 회전하는 삼각형)를 화면 밖 캔버스에 렌더링하고, 픽셀 데이터를 readPixels로 뽑아 해시한다. 같은 운영체제·브라우저·GPU 조합이면 같은 해시가 나오지만, 드라이버 마이너 버전이 0.0.1만 달라져도 다른 해시가 나온다. 이게 봇 탐지에 강력한 이유다.
한편, 봇은 보통 헤드리스 브라우저에서 도는데, SwiftShader 같은 소프트웨어 렌더러를 쓰거나 GPU 정보를 비워둔다. WebGL을 들여다보면 봇과 사람이 비교적 잘 갈린다. 봇 차단 입장에서는 매력적인 신호다. 같은 이유로 프라이버시 브라우저 사용자가 봇으로 오인된다는 게 반작용이다.
후보 셋을 놓고 본 비교 기준
또한, WebGL 의존 이슈를 알고 나서 후보를 정리했다. Turnstile을 그대로 두는 안, hCaptcha로 옮기는 안, Friendly Captcha를 도입하는 안. reCAPTCHA v3는 사용자 마찰이 적은 대신 Google에 데이터를 너무 많이 넘기는 문제가 있어 후보군에서 일찍 빠졌다. 비교 맥락을 위해 reCAPTCHA v3 수치도 같이 측정만 했다.
물론, 비교 기준은 네 가지로 좁혔다.
- WebGL 의존도: 비활성 브라우저에서 통과율이 얼마나 떨어지는가
- 프라이버시 노출: 어떤 데이터를 어디로 보내는가
- 봇 차단 체감: 우리 트래픽 기준 실효성
- 운영 비용과 유지보수: 가격과 통합 난이도
항목별 비교 — 4종을 같은 잣대로
WebGL 의존도
Turnstile은 챌린지 토큰 계산에 WebGL 결과를 적극 활용한다. 비활성 브라우저에서는 invisible 모드가 사실상 동작하지 않고, managed 모드도 통과율이 떨어진다. 자체 측정에서 Tor Browser 통과율이 약 18%였다. 같은 기간 일반 Chrome 사용자 통과율은 98%였으니 격차가 크다.
hCaptcha는 Enterprise 플랜에서는 WebGL을 신호 중 하나로 쓰지만 Free와 Pro에서는 의존도가 낮은 편이다. Tor Browser 통과율은 약 62%. 대신 챌린지 이미지(고양이 찾기 등)가 나오는 빈도가 같이 높아진다. 사용자 입장에서는 클릭 한두 번이 추가된다는 의미다.
reCAPTCHA v3는 점수 기반인데, WebGL이 막힌 브라우저는 거의 모두 0.1점 이하로 떨어진다. 사실상 통과 불가에 가깝다 (출처: 자체 테스트, n=100, 2026-04). 일반 Chrome 사용자는 평균 0.7점 정도여서 두 그룹의 분리가 너무 극단적으로 보인다.
특히, Friendly Captcha는 Proof of Work 방식이라 WebGL을 보지 않는다. 비활성 브라우저에서도 정상 통과한다. 대신 사용자 기기의 CPU를 1~3초 정도 쓴다. 모바일에서는 체감이 약간 있다.
프라이버시 노출
Cloudflare는 Turnstile에 대해 "쿠키 없음, 광고 추적 없음"을 강조한다. third-party 쿠키를 심지 않고 광고 네트워크와 연결되지 않는 건 사실로 확인된다. 단, 트래픽이 Cloudflare를 통과한다는 점은 사용자가 Cloudflare를 신뢰해야 한다는 의미다. 자체 도메인 호스팅 옵션은 없다.
hCaptcha는 데이터를 자체 도메인으로 보내는데 Intuition Machines라는 별도 회사가 운영한다. Enterprise를 쓰지 않으면 광고 식별자와 부분적으로 통합된다는 보고가 있다.
특히, reCAPTCHA v3는 Google 광고 ID, 검색 쿠키, YouTube 세션 등과 묶인다. 프라이버시 측면에서는 가장 침습적이라는 평가가 많다.
Friendly Captcha는 독일 회사 운영이고 데이터를 거의 수집하지 않는다고 명시한다 (출처: Friendly Captcha Privacy Policy, 2026-02 업데이트). 트래픽 자체도 자기네 서버로만 간다.
봇 차단 체감
특히, 세 달 운영하면서 본 봇 차단율은 Turnstile이 가장 우수했다. 신용카드 무작위 등록 시도, 무한 가입 봇 등 우리 서비스에서 자주 나타나는 패턴을 거의 다 잡았다.
게다가, hCaptcha도 비슷한 수준이었는데, 가끔 헤드리스 Chrome에 puppeteer-extra-stealth를 쓴 봇을 통과시키는 사례가 발견됐다. 한 달 측정 기준 봇 가입이 70~110건/일로 Turnstile의 두 배 정도였다.
한편, Friendly Captcha는 단순 봇은 모두 잡지만, 시간을 들이는 정교한 봇에는 약하다. PoW가 비싸 봇이 포기할 거라는 가정인데, 클라우드 GPU나 멀티 IP를 쓰는 봇 앞에서는 한계가 있다는 게 체감이다.
운영 비용과 유지보수
이처럼, Turnstile은 호출량 무제한 무료다. SDK가 가볍고 React·Vue용 공식 래퍼가 있다. 5분이면 붙는다.
hCaptcha Free는 월 100만 호출까지. 그 이상은 Pro($99/월부터)로 가야 한다. Enterprise는 별도 견적이다.
이처럼, Friendly Captcha는 1,000회/월까지 무료. Production은 €9/월부터 시작하지만 우리 트래픽(월 60만 회) 기준 €39 플랜이 필요하다.
실제 트래픽 기준 30일 측정
예를 들어, 후보 셋을 한 달간 A/B/C로 분기해 가입 페이지에 노출했다. 트래픽은 무작위로 33%씩 나눴다. 분기 구간은 sticky cookie로 묶었다. 같은 사용자가 다른 CAPTCHA를 만나면 측정 노이즈가 커지기 때문이다. 측정은 GA4와 자체 이벤트 파이프라인 두 곳에서 교차 검증했다.
- 측정 기간: 2026-04-15 ~ 2026-05-14
- 가입 시도: 약 11.2만 건
- 평일·주말 트래픽 분포 유사
- 사용자 지역: 한국 78%, 미국 14%, 유럽 5%, 기타 3%
| 지표 | Turnstile | hCaptcha Pro | Friendly Captcha |
|---|---|---|---|
| 정상 가입 완료율 | 88.2% | 91.4% | 93.6% |
| Tor·프라이버시 통과율 | 18% | 62% | 99% |
| 일평균 봇 통과 | 35건 | 78건 | 142건 |
| CAPTCHA 관련 문의 | 9건 | 4건 | 1건 |
| 월 비용 | $0 | $99 | €39 |
흥미로운 건 정상 가입 완료율이다. Friendly Captcha가 가장 높았는데, 챌린지 화면이 거의 안 뜨고 백그라운드에서 PoW가 돌아가기 때문이다. 사용자 입장에서는 가장 매끄럽게 느껴진다. 반면 봇 차단율은 가장 낮다.
물론, Turnstile은 봇은 잘 막지만 정상 사용자 중 일부를 잘못 막는다. 우리 사용자 풀에서 프라이버시 브라우저 비율은 약 4%였는데, 이 그룹의 가입 포기율이 다른 그룹보다 6배 높았다. 봇 차단을 위해 잃은 정상 사용자가 적지 않다는 뜻이다.
그래서 무엇을 골랐나
즉, 표만 보면 한쪽 답이 안 나온다. 봇 차단을 우선하면 Turnstile, 사용자 마찰을 우선하면 Friendly Captcha다. hCaptcha Pro는 중간이지만 비용이 가장 비싸다.
팀이 내린 결정은 분기였다. 가입 페이지 진입 시 사용자 환경을 가볍게 체크해 두 갈래로 보낸다.
- WebGL 정상 + 일반 브라우저: Turnstile invisible 모드. 마찰 거의 0.
- WebGL 차단 또는 프라이버시 시그널 감지: Friendly Captcha로 폴백. PoW 1~3초.
분기 코드는 클라이언트에서 시그널만 체크하고 서버에서 최종 라우팅을 결정한다. 클라이언트에서만 결정하면 봇이 우회하기 너무 쉽다. 시그널 세 개를 본다. WebGL renderer가 빈 문자열인지, navigator의 일부 속성이 Tor 시그니처에 일치하는지, screen.colorDepth가 비정상 값인지. 셋 중 하나라도 걸리면 Friendly Captcha로 보낸다.
예를 들어, 이 분기를 적용한 5월 15일 이후 한 주 동안 가입 완료율이 90.4%로 올라왔고, CAPTCHA 관련 문의는 주 2건 미만으로 줄었다. 봇 가입은 일평균 48건 수준으로 유지된다. Turnstile 단독 대비 약간 늘었지만 운영 가능한 수준이다.
당장 적용해볼 만한 액션 셋이다.
- 사용자 환경에서
WEBGL_debug_renderer_info확장이 차단됐는지,getParameter가 빈 문자열을 반환하는지 한 번 측정해보자. 이 비율이 곧 Turnstile의 잠재 이탈률이다. - 프라이버시 사용자 비율이 3% 이상이라면 Turnstile + Friendly Captcha 폴백 구조를 검토하자. 추가 비용은 €39 수준에서 시작한다.
- Cloudflare가 Turnstile의 WebGL 의존도를 낮추는 옵션을 제공할지 GitHub 이슈 트래커(cloudflare/turnstile-docs)를 구독해두자.
실제로, 다만 이번 분기 구조는 아직 한 달 데이터다. 정교한 봇이 Friendly Captcha 쪽으로 몰리면 다시 손봐야 하고, Cloudflare가 WebGL 의존을 낮추는 패치를 내놓으면 분기 자체가 불필요해질 수 있다. 균형점은 더 지켜봐야 한다.
관련 글
- GPU 서버 $48K 직접 샀더니 클라우드보다 진짜 싸졌나 – $48,000짜리 온프렘 GPU 서버. AWS로 같은 워크로드 돌리면 월 $21,600이라 2.2개월이면 본전이라 생각했다. 실제로는 14…
- reCAPTCHA 다음 단계, Google Cloud Fraud Defense 실전 봇 방어 비교 – reCAPTCHA 다음 세대로 묶인 Google Cloud Fraud Defense는 단순 캡차가 아니라 계정 보호와 부정 결제 차단까지 …
- Redis 캐시 전략 비교 — LRU·LFU·allkeys로 maxmemory 다루기 – 프론트엔드에서 백엔드로 넘어온 지 2년. Redis OOM 에러를 만나고서야 maxmemory-policy를 제대로 본다. LRU와 LFU…