CAPTCHA는 있는데 아무것도 보호하지 않습니다
reCAPTCHA, hCaptcha 또는 Turnstile 위젯이 보인다는 사실만으로는 양식의 보호 여부를 알기 어렵습니다. 흔한 설정 오류와 몇 분 만에 자신의 양식을 점검하는 방법을 알아봅니다.
많은 웹사이트 소유자는 문의 양식에 CAPTCHA를 추가하고 작은 배지나 확인란이 나타나면 스팸 문제가 해결되었다고 생각합니다. 그런데도 쓰레기 메시지는 계속 도착합니다. CAPTCHA 자체는 정상인 경우가 많습니다. 단지 봇을 막을 수 있는 장치와 연결되지 않은 것입니다. 이 글에서는 reCAPTCHA, hCaptcha 및 Cloudflare Turnstile이 장식으로 전락하는 흔한 원인과 자신의 양식을 확인하는 방법을 설명합니다.
실제 보호가 이루어지는 곳
세 서비스 모두 같은 원리로 작동합니다. 브라우저의 스크립트가 점검을 수행하고 “이 방문자는 통과했다”는 짧은 문자열인 토큰을 양식에 전달합니다. 토큰은 제출 내용과 함께 서버로 전송됩니다. 실제 결정은 그곳에서만 이루어집니다. 서버가 토큰과 비밀 키를 제공업체에 보내면 성공 또는 실패 응답을 받으며, reCAPTCHA v3의 경우 점수도 받습니다. 이 연결 과정 중 하나라도 빠지면 위젯은 여전히 완전히 정상으로 보이지만 양식 처리기로 직접 제출하는 봇은 그대로 통과합니다.
모든 것을 통과시키는 테스트 키
Google, hCaptcha 및 Cloudflare는 개발자가 퍼즐을 풀지 않고 자동 테스트를 실행할 수 있도록 특별한 테스트 키를 공개합니다. 대응하는 테스트 비밀 키를 사용하면 검증이 항상 성공합니다. 바로 그것이 목적입니다. 로컬 및 스테이징 환경을 위한 키이지만 운영 환경으로 옮길 때 그대로 남는 경우가 흔합니다. 개발자가 제작 중 붙여 넣고 사이트가 공개된 뒤 아무도 바꾸지 않는 것입니다. reCAPTCHA는 적어도 위젯에 테스트 전용이라는 안내를 표시하지만, 보이지 않는 설정에서는 거의 아무도 확인하지 않습니다. 테스트 사이트 키와 테스트 비밀 키를 모두 운영 환경에서 사용하면 사람이든 봇이든 모든 제출이 통과합니다. 사이트 키만 테스트 키라면 오히려 검증이 실패하여 실제 메시지가 거부될 수 있습니다.
아무도 확인하지 않는 토큰
두 번째 흔한 문제는 서버가 제공업체에 아예 확인하지 않는 것입니다. 위젯이 실행되고 토큰을 생성해 제출하지만 양식 처리기가 그냥 무시합니다. 직접 만든 양식, 브라우저 측만 다루는 복사한 코드 조각, 미완성 플러그인 설정이 흔한 원인입니다. 비슷한 경우로 서버가 검증 서비스를 호출하더라도 응답 내용이 아니라 요청의 전달 성공만 확인하기도 합니다. 또는 reCAPTCHA v3 점수 기준을 0으로 설정하여 서비스가 반환하는 모든 점수를 수락하기도 합니다. 일부 처리기는 실패해도 허용하는 “fail open” 방식으로 작동합니다. 토큰이 없거나 검증이 실패해도 메시지를 받아들이므로 봇은 토큰을 생략하면 그만입니다.
위젯이 실제로는 로드되지 않을 때
다른 설정 오류는 브라우저 측을 망가뜨립니다. 스테이징에서 운영으로 전환하거나 도메인을 바꾸거나 하위 도메인을 추가한 후처럼 사이트 키가 해당 도메인에 등록되지 않으면, 제공업체는 토큰 발급을 거부하고 위젯이나 브라우저 콘솔에 오류를 표시합니다. 테마 변경이나 플러그인 업데이트 후에는 위젯 마크업이 페이지에 남아 있어도 이를 작동시키는 스크립트가 사라질 수 있습니다. 쿠키 동의 도구가 방문자의 동의 전까지 CAPTCHA 스크립트를 차단해도 같은 일이 생깁니다. 이후 상황은 서버에 달려 있습니다. 유효한 토큰을 필수로 요구하면 실제 방문자가 메시지를 보내지 못하고 아무도 사라진 문의를 알아채지 못합니다. 요구하지 않으면 봇이 자유롭게 통과합니다.
놓치기 쉬운 두 가지 경우가 더 있습니다. reCAPTCHA v3에서 구석의 배지는 테마나 다른 플러그인이 페이지 어딘가에 스크립트를 로드했다는 사실만 보여줄 수 있습니다. 양식 플러그인 자체의 연동은 꺼져 있을 수 있습니다. 또한 캐싱 플러그인이 HTML에 포함된 토큰과 함께 페이지를 저장하기도 합니다. CAPTCHA 토큰은 몇 분만 유효하고 한 번만 검증할 수 있으므로 캐시된 토큰은 실제 방문자에게 실패합니다. 점검을 끄는 유혹적인 “해결책”은 보호를 조용히 없애버립니다.
- 위젯에 “테스트 목적으로만 사용” 안내가 표시됩니다
- 구석에 v3 배지가 있습니다
- 위젯이 표시되고 토큰을 반환합니다
- 스팸이 멈췄지만 실제 문의도 멈췄습니다
- 공개 테스트 키를 사용하여 모든 검증이 성공합니다
- 양식 플러그인의 reCAPTCHA 연동이 꺼져 있습니다
- 서버가 토큰 검증을 요청하지 않거나 결과를 무시합니다
- 사이트 키가 도메인에 등록되지 않았거나 캐시된 토큰이 만료되었습니다
간단한 자체 점검
- 1비공개 창에서 양식 페이지를 열고 브라우저 개발자 도구의 콘솔에서 CAPTCHA 스크립트 오류를 확인하십시오.
- 2쿠키 배너에 동의하기 전과 후에 각각 위젯이 실제로 표시되는지, 위젯이 없을 때는 양식을 보낼 수 없는지 확인하십시오.
- 3제공업체의 관리 콘솔에서 사이트 키에 운영 도메인(www 같은 변형 포함)이 등록되어 있는지, 양식 플러그인이나 코드의 키가 문서 또는 스테이징용 키가 아니라 해당 키와 일치하는지 확인하십시오.
- 4양식 플러그인 설정에서 해당 양식의 CAPTCHA 연동이 활성화되어 있는지 확인하십시오. reCAPTCHA v3라면 점수 기준이 0보다 높은지도 확인하십시오.
- 5코드에 접근할 수 있다면 서버 측 검증을 찾아 응답이 실패이거나 토큰이 없을 때 제출을 거부하는지 확인하십시오.
- 6전체 페이지 캐시에서 양식 페이지를 제외하거나 브라우저가 매번 새 토큰을 만들도록 하십시오.
- 7실제 테스트 메시지를 보내 도착하는지 확인하십시오. 테마, 플러그인 또는 동의 도구를 변경한 뒤에도 반복하십시오.
CAPTCHA는 하나의 계층이지 전체 보호가 아닙니다. 허니팟 필드, 시간 검사 및 서버 측 필터링과 결합하면 한 곳의 설정 오류가 양식을 완전히 노출시키지 않습니다. 양식의 상태를 빠르게 파악하려면 formexposed.com에 도메인을 입력하십시오. 보고서는 외부에서 보이는 CAPTCHA 설정 요소가 올바른지 보여줍니다.