reCAPTCHA v2 작동 원리와 풀이 방법 (출시 예정)
reCAPTCHA v2는 Google의 대표적인 captcha입니다. "I'm not a robot"이라고 적힌 체크박스를 보여 주고, 방문자가 사람인지 확신할 수 없으면 이미지 챌린지를 추가합니다. 이를 위한 솔버는 사이트가 Google을 통해 검증할 수 있는 유효한 응답 토큰을 만들어야 합니다. Scarnox의 reCAPTCHA v2 지원은 출시 예정입니다. 이 가이드는 위젯이 어떻게 작동하는지, 사람들이 오늘날 쓰는 일반적인 접근법, 그리고 토큰 기반 솔버에서 기대할 수 있는 것을 설명합니다.
Scarnox는 아직 reCAPTCHA v2를 실시간으로 풀지 않습니다. 현재 실시간으로 사용할 수 있는 작업 유형은 프록시리스 PopularCaptcha뿐입니다. 프로젝트에 지금 reCAPTCHA v2가 필요하다면, 아래의 접근법이 현실적인 선택지입니다.
위젯의 작동 방식
페이지에는 data-sitekey 속성을 가진 컨테이너 요소가 들어 있습니다. 이 sitekey가 Google에 사이트를 식별합니다. 위젯이 로드되면 브라우저에서 검사를 실행해 방문자의 행동, 쿠키, 기록을 살펴보고, 위험 평가를 Google에 보냅니다.
평가가 낮은 위험이면 체크박스가 스스로 체크되고, 위젯은 g-recaptcha-response라는 숨겨진 필드에 토큰을 기록합니다. 평가가 높은 위험이면 방문자는 특정 물체가 들어 있는 타일을 고르는 것과 같은 이미지 챌린지를 보게 됩니다. 챌린지를 통과해도 토큰이 기록됩니다.
그다음 사이트의 백엔드가 사이트 비밀 키와 함께 그 토큰을 Google의 검증 엔드포인트로 보냅니다. Google은 성공 또는 실패로 응답합니다. 검증은 서버에서 이루어지므로, Google에 확인하지 않고 토큰을 받아들이는 폼은 reCAPTCHA로 보호되지 않는 것입니다.
왜 플래그가 찍히는가
체크박스는 퍼즐이 아니라 위험 판단입니다. 흔한 트리거는 다음과 같습니다.
- 한 IP 주소에서 요청이 한꺼번에 몰리는 경우.
- 쿠키나 기록이 없는 새 브라우저 세션.
- 기본 헤드리스 설정처럼 자동화되어 보이는 브라우저 환경.
- 사람이 마우스를 움직이거나 타이핑하는 것 같지 않은 입력 패턴.
이런 트리거를 이해하는 것이 위젯 자체보다 중요합니다. 트래픽이 체크박스를 발동시키지 않는다면, 이미지 챌린지를 보게 되는 일도 없습니다.
오늘날 효과적인 일반 접근법
다음 접근법은 널리 쓰이며, 정직한 방법입니다. 정상적인 작업에서 챌린지가 나타나는 빈도를 줄여 줍니다.
- 실제 세션을 유지하세요. 페이지마다 새로 시작하지 말고, 세션 동안 쿠키와 일관된 브라우저 프로필을 재사용하세요.
- 요청 속도를 조절하세요. 일정하고 느린 속도는 폭주하는 요청보다 사람처럼 보입니다.
- 위젯에는 실제 브라우저를 사용하세요. 일반 설정의 완전한 브라우저는 기능을 덜어낸 헤드리스 설정보다 플래그가 찍힐 가능성이 낮습니다. 헤드리스 브라우저 감지 가이드에 흔한 신호가 정리되어 있습니다.
- 예외나 테스트 키를 요청하세요. 사이트를 직접 운영한다면, 스테이징에서 Google이 공개한 테스트 키를 사용하세요. 그렇지 않다면 소유자에게 허용 목록을 요청하세요.
- 사람을 개입시키세요. 처리량이 적은 작업이라면, 사람이 체크박스를 완료하고 토큰을 넘길 수 있습니다. 느리지만 확실합니다.
이런 접근법이 챌린지가 전혀 나타나지 않는다고 보장하지는 않습니다. 빈도를 줄여 줄 뿐이며, 그것이 정상적인 작업을 안정적으로 유지하는 방법입니다.
토큰 기반 솔버가 하는 일
reCAPTCHA v2용 토큰 기반 솔버는 오늘날의 PopularCaptcha와 같은 일을 합니다. sitekey와 페이지 URL을 받아 유효한 g-recaptcha-response 토큰을 만들고, 그것을 여러분의 코드에 돌려줍니다. 그러면 여러분의 코드가 토큰이 만료되기 전에 폼에 넣고 제출합니다.
Scarnox는 reCAPTCHA v2 지원이 출시되면 작업 유형과 추가 필드를 API 레퍼런스에 문서화할 예정입니다. 그때까지는 가정한 인터페이스로 개발하지 마세요. 요청 형태는 PopularCaptcha 예시와 비슷할 것이지만, 정확한 값은 문서에서 확인하세요.
reCAPTCHA v2 작업 체크리스트
reCAPTCHA v2 폼을 다루는 작업을 계획할 때는 다음 항목을 확인하세요.
- 사이트가 본인 소유인가요? 그렇다면 스테이징에서 테스트 키를 쓰고, 운영 환경 테스트는 최소화하세요.
- 작업이 정당한가요? 공개 데이터 수집과 본인의 워크플로는 정당하지만, 계정 남용과 스팸은 그렇지 않습니다.
- 체크박스가 조용히 있을 만큼 요청 속도가 충분히 낮은가요?
- 이미지 챌린지에 대한 계획이 있나요? 사람이 풀거나, 솔버가 출시되었다면 솔버를 쓸 수 있습니다.
- 토큰이 있는지만 확인하지 말고, 서버 측 검증 결과를 확인하나요?
흔한 실수
reCAPTCHA v2 연동에서 가장 흔한 문제는 올바르게 보이는데도 사이트가 거부하는 토큰입니다. 대부분은 세 가지 원인에서 비롯됩니다. 첫째는 sitekey와 페이지 URL의 불일치입니다. 토큰은 위젯이 표시된 페이지에 묶여 있으므로, 한 페이지에서 가져온 sitekey를 다른 페이지에 제출하면 실패합니다. 둘째는 오래된 토큰입니다. 토큰은 수명이 짧으므로, 먼저 풀고 느린 다른 단계들을 거치는 스크립트는 만료된 값을 제출하게 됩니다. 셋째는 여러분 쪽의 서버 측 검사가 빠진 경우입니다. 테스트가 토큰의 존재만 확인한다면, 검증 단계가 실패하고 있다는 것을 알아채지 못합니다.
두 번째 그룹의 실수는 위젯 주변의 워크플로에서 비롯됩니다. 한 세션에서 로그인하고 다른 세션에서 폼을 제출하는 것이 흔한 예입니다. 검증이 위젯을 로드한 세션에 의존할 수 있기 때문입니다. 거부된 폼을 연달아 여러 번 재시도하는 것도 세션을 의심스럽게 보이게 만들어, 한 번의 챌린지를 여러 번의 챌린지로 바꿀 수 있습니다. 무언가 실패하면 잠시 멈추고, 페이지 상태를 확인하고, 새 값으로 한 번만 다시 시도하세요.
책임 있게 스크래핑하기
폼이 스크래핑 작업의 일부라면, 시작하기 전에 robots.txt와 사이트 이용 약관을 확인하세요. 요청 빈도를 낮게 유지하고, 필요하지 않은 개인 데이터는 수집하지 마세요. 웹 스크래핑은 합법인가 가이드에 주요 고려 사항이 정리되어 있습니다.