GeeTest 캡차 설명: 작동 방식과 풀이 방법
GeeTest는 방문자에게 시각적 작업을 요구하는 위젯을 제공하는 캡차 공급업체입니다. 퍼즐 조각을 틈에 끌어다 놓거나, 아이콘 여러 개를 정해진 순서대로 클릭하거나, 짧은 슬라이더를 움직이는 식입니다. 전자상거래 사이트, 로그인 페이지, 여러 지역의 앱 백엔드에서 흔히 쓰입니다. Scarnox가 아직 풀지 못하는 캡차 계열 중 하나이기도 합니다. 이 가이드는 GeeTest가 어떻게 작동하는지, 왜 토큰 위젯보다 자동화하기 어려운지, 사람들이 일반적으로 쓰는 접근법, 그리고 Scarnox의 현재 지원 상황을 설명합니다.
페이지에서 GeeTest가 하는 일
GeeTest 캡차는 보통 세 단계로 로드됩니다.
- 페이지가 GeeTest 스크립트를 포함하고 캡차 ID로 위젯을 만듭니다. 많은 연동에서 이 ID는
gt라는 파라미터로 전달됩니다. - 위젯이 GeeTest 서버에 새 챌린지를 요청합니다. 챌린지에는
challenge값과, 퍼즐에 필요한 이미지나 타일 위치가 들어 있습니다. - 방문자가 작업을 마치면 위젯이 결과를 사이트에 돌려줍니다. 그러면 사이트의 백엔드가 폼을 받아들이기 전에 캡차 공급업체를 통해 결과를 검증합니다.
세 번째 단계가 중요합니다. 그럴듯해 보이는 값만으로는 충분하지 않습니다. 서버는 하나의 챌린지에 묶여 있고 만료되는 결과를 확인하기 때문입니다. 그래서 다른 세션에서 복사한 값은 실패하고, 이전 결과를 다시 재생하는 것도 동작하지 않습니다.
GeeTest가 토큰 위젯보다 어려운 이유
PopularCaptcha에서는 페이지가 토큰 문자열 하나만 필요로 하고, 요청 한 번으로 그 문자열을 받습니다. GeeTest는 세 가지 면에서 다릅니다.
- 출력은 작업의 결과이지 문자열 하나가 아닙니다. 사이트는 함께 속해야 하는 여러 값을 기대하며, 그 값들은 모두 같은 챌린지에서 나와야 합니다.
- 챌린지는 시각적이고 위치 기반입니다. 풀이 도구는 퍼즐 조각이 어디에 맞는지, 어떤 아이콘이 일치하는지 찾은 뒤, 사람처럼 보이는 움직임을 만들어야 합니다.
- 검사는 답뿐 아니라 행동도 봅니다. 속도, 경로, 타이밍을 검사할 수 있습니다. 올바른 위치라도 로봇처럼 전달되면 거부될 수 있습니다.
그래서 GeeTest 풀이는 여러 단계로 이루어진 작업입니다. 챌린지를 가져오고, 이미지에서 목표를 찾고, 움직임을 만들고, 제출한 뒤 판정을 읽습니다. 각 단계는 실패할 수 있으며, 단계 사이에서 너무 오래 기다리면 챌린지가 만료됩니다.
일반적인 접근법
GeeTest 페이지를 자동화하는 사람들은 보통 다음 세 가지 접근법 중 하나를 씁니다. 어떤 것도 지름길은 아니며, 각각 비용이 있습니다.
- 실제 브라우저 구동. Playwright나 Selenium이 페이지를 로드하고, 스크립트가 슬라이더를 움직입니다. 내가 운영하는 사이트나 사용이 허용된 테스트 환경에서 가장 잘 동작합니다. 브라우저는 실제이지만, 움직임은 여전히 자연스러워 보여야 합니다.
- 이미지 매칭. 코드가 퍼즐 배경을 내려받고, 템플릿 매칭(예: OpenCV)으로 틈을 찾고, 드래그 거리를 계산합니다. 직접 만든 설정에서 가장 믿을 만한 부분인 경우가 많으며, 공급업체가 이미지 레이아웃을 바꾸면 깨집니다.
- 사람 개입 또는 풀이 서비스. 사람이나 관리형 서비스가 챌린지를 풀고 결과를 돌려줍니다. Scarnox는 GeeTest에 대해 이 옵션을 제공할 계획이지만, 아직 운영 중이 아닙니다.
어떤 방법을 고르든, 범위를 정직하게 유지하세요. 내가 소유한 흐름, 사용이 허용된 테스트 환경, 또는 수집이 허용된 공개 데이터만 자동화하세요.
캡차 ID 찾기
시작하는 데 코드는 필요 없습니다. DevTools를 열고 페이지를 새로고침한 뒤 Network 탭에서 geetest 또는 gt를 검색하세요. 위젯을 불러오는 첫 요청에 보통 캡차 ID가 나타납니다. 페이지가 위젯을 바꿨는지 알아차리고 싶을 때 유용하도록, 작은 스크립트로 ID를 기록할 수도 있습니다.
import re
import requests
html = requests.get("https://example.com/login", timeout=30).text
match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", html)
print("captcha id:", match.group(1) if match else "not found")
위 패턴은 gt 옆에 있는 32자리 16진수 값을 찾습니다. 공급업체는 마크업을 바꾸므로, 이것을 출발점으로 여기고 테스트하는 페이지에서 출력을 확인하세요.
Scarnox 지원 현황
프로젝트를 계획할 때 이 점을 분명히 하세요.
- 현재 운영 중: PopularCaptcha, 프록시 없음, 그리고 자체 프록시 사용.
- 준비 중: GeeTest, reCAPTCHA v2와 v3, Cloudflare Turnstile, AWS WAF, Arkose. 목록에 실시간으로 나오기 전까지는 GeeTest 풀이에 의존하는 운영 흐름을 만들지 마세요.
지금 GeeTest가 필요한 프로젝트라면 현실적인 경로는 테스트를 허용받은 페이지에서 브라우저와 이미지 단계를 직접 만드는 것입니다. 그리고 API가 출시되면 전환할 수 있도록 코드를 준비해 두세요. 그사이에는 계정을 만들고 무료 체험 크레딧으로 시작할 수 있습니다. 카드 등록은 필요 없습니다. 그러면 테스트할 수 있는 동작하는 PopularCaptcha 흐름이 생기고, 나중에 GeeTest를 연결할 자리도 생깁니다. 현재 요금은 현재 요금 페이지를 참고하세요.
합법적인 용도
- 자동화된 회귀 테스트가 캡차에 막히는 내 로그인이나 결제 흐름 테스트.
- 시각적 퍼즐을 풀 수 없는 방문자가 여전히 폼을 완료할 다른 경로가 있는지 확인하는 접근성 점검.
- 내가 감시할 권한이 있는 사이트 모니터링. 예를 들어 배포 후에도 위젯이 여전히 로드되는지 확인하는 작업.
캡차 자동화를 사용해 가짜 계정을 만들거나, 로그인 폼을 공격하거나, 한정 재고를 낚아채지 마세요. 이런 용도는 대부분의 사이트 규칙을 어기며, Scarnox가 지원하지 않습니다.