# 웹사이트 폼을 위한 reCAPTCHA 대안

> Turnstile과 hCaptcha부터 작업 증명, 캡차 없는 방식까지 폼용 reCAPTCHA 대안을 비교하고, 작고 안전한 변경으로 전환하세요.

2026-10-25 게시 · https://ikiform.com/ko/guides/spam-protection/recaptcha-alternatives

Cloudflare Turnstile은 reCAPTCHA를 가장 비슷하게 대체합니다. 대부분 보이지 않고, site key와 secret key를 쓰는 방식이 같으며, 서버 검사도 같은 매개변수를 받습니다. hCaptcha는 Google이 아닌 곳의 이미지 챌린지를 원하는 사이트에 맞고, ALTCHA 같은 작업 증명 도구는 서드파티 없이 실행됩니다. 많은 문의 폼은 허니팟, 콘텐츠 점수, 레이트 리밋만으로 캡차가 필요 없습니다.

## 사람들이 reCAPTCHA를 떠나는 이유

reCAPTCHA는 여전히 작동합니다. 대체하려는 이유는 대개 방문자와 여러분이 치르는 비용입니다. 버전 2는 일부 방문자에게 이미지 퍼즐을 보여 주는데, 휴대폰에서는 느리고 스크린 리더를 쓰는 사람에게는 어렵습니다. 버전 3은 보이지 않지만 기준값을 직접 정해야 하는 점수를 반환하며, 대신 띄울 챌린지가 없습니다. 그리고 reCAPTCHA는 이제 Google Cloud 제품입니다. Google의 결제 문서에는 월 10,000회 평가의 무료 한도와 그 이상의 유료 등급이 나와 있습니다.

페이지의 서드파티 스크립트를 줄이고 싶어 하는 팀도 있습니다. 그것이 여러분의 개인정보 보호 의무에 중요한지는 직접 법률 검토를 거쳐야 할 문제이며, 이 페이지는 도구의 작동 방식만 비교합니다.

## 대안 비교

| 선택지 | 방문자에게 보이는 것 | 검증 주체 | 알아 둘 점 |
| --- | --- | --- | --- |
| reCAPTCHA v2 | 체크박스, 가끔 이미지 퍼즐 | Google과 함께 여러분의 서버가 | 익숙함. 퍼즐이 가장 큰 불만 |
| reCAPTCHA v3 | 없음 | Google과 함께 여러분의 서버가 | 0.0에서 1.0 사이의 점수를 반환. 기준값을 정하고 애매한 구간을 직접 처리해야 함 |
| [Cloudflare Turnstile](https://ikiform.com/ko/guides/spam-protection/cloudflare-turnstile.md) | 보통 없음, 가끔 체크박스 | Cloudflare와 함께 여러분의 서버가 | 이미지 퍼즐 없음. 위젯 20개까지 무료 |
| hCaptcha | 체크박스, 가끔 이미지 퍼즐 | hCaptcha와 함께 여러분의 서버가 | 형태는 reCAPTCHA v2와 비슷하고 다른 회사의 제품. 무료 Basic 플랜과 유료 Pro, Enterprise 플랜 |
| Friendly Captcha | 백그라운드에서 퍼즐을 푸는 작은 위젯 | Friendly Captcha와 함께 여러분의 서버가 | 추적 신호 대신 작업 증명. 소규모 비상업 사이트는 무료, 그 외에는 유료 플랜 |
| ALTCHA | 백그라운드에서 퍼즐을 푸는 작은 위젯 | 여러분의 서버만 | 오픈 소스이자 자체 호스팅이라 서드파티 없음. 운영과 유지 보수는 직접 |
| [No captcha](https://ikiform.com/ko/guides/spam-protection/without-captcha.md) | 없음 | 여러분의 서버 | 허니팟, 서명된 시간 검사, 콘텐츠 점수, 레이트 리밋. 대부분의 봇을 막지만 전부는 아님 |

마지막을 제외한 모든 선택지는 여전히 서버 측 검사에 의존합니다. 봇은 페이지를 불러오지 않고도 엔드포인트로 POST할 수 있으므로, 위젯만으로는 아무것도 막지 못합니다.

## 각 선택지가 사람에게 요구하는 것

모든 선택지는 그것을 가장 힘들어하는 방문자를 기준으로 판단하세요. 이미지 퍼즐은 휴대폰에서 느리고, 잘 보지 못하는 사람에게는 어렵거나 불가능합니다. 음성 대체 수단은 어떤 사람에게는 도움이 되지만 어떤 사람은 답답하게 만듭니다. Turnstile의 일반 모드, reCAPTCHA v3, 작업 증명 위젯 같은 보이지 않는 검사는 대부분의 방문자에게 아무것도 요구하지 않지만, 개인정보 보호 중심 브라우저, 엄격한 네트워크, 오래된 기기를 쓰는 사람에게는 여전히 실패할 수 있습니다. 그럴 때 그 사람에게는 다음 방법이 필요합니다. 보이는 체크박스, 명확한 메시지, 또는 대신 연락할 이메일 주소입니다. 조용히 실패하는 폼은 여러분이 존재조차 모르는 메시지를 정확히 잃어버립니다.

## 두 가지 질문으로 고르기

다이어그램: 두 가지 질문으로 reCAPTCHA 대체 수단 고르기

1. 먼저 봇이 보이지 않는 검사를 통과하는지 물어보세요. 통과하지 않는다면 허니팟, 점수, 레이트 리밋으로 캡차 없이 유지하세요.
2. 통과한다면 서버 코드를 실행할 수 있는지 물어보세요. 가능하다면 Turnstile, hCaptcha, ALTCHA 같은 위젯을 고르고 서버에서 검증하세요.
3. 서버가 없다면 Turnstile 키를 대신 검증해 주는 백엔드로 폼을 POST하거나, 키가 필요 없는 관리형 검사를 쓰세요.

대부분의 문의 폼은 첫 번째 질문에서 끝납니다. 위젯을 추가하기 전에 스팸 양부터 측정하세요.

## reCAPTCHA에서 Turnstile로 전환하기

둘은 충분히 비슷해서 양쪽에서 몇 줄씩만 바꾸면 됩니다. Cloudflare 대시보드에서 같은 호스트 이름으로 Turnstile 위젯을 만든 뒤, 마크업과 서버 검사를 함께 바꾸세요.

| 항목 | reCAPTCHA v2 | Turnstile |
| --- | --- | --- |
| 스크립트 | `https://www.google.com/recaptcha/api.js` | `https://challenges.cloudflare.com/turnstile/v0/api.js` |
| 요소 | `<div class="g-recaptcha" data-sitekey>` | `<div class="cf-turnstile" data-sitekey>` |
| 토큰 필드 | `g-recaptcha-response` | `cf-turnstile-response` |
| 검증 URL | `https://www.google.com/recaptcha/api/siteverify` | `https://challenges.cloudflare.com/turnstile/v0/siteverify` |
| 검증 매개변수 | `secret`, `response`, `remoteip` | `secret`, `response`, `remoteip`, `idempotency_key` |

**변경 전** (`contact.html`)

```html
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="g-recaptcha" data-sitekey="RECAPTCHA_SITE_KEY"></div>
  <button>Send</button>
</form>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
```

**변경 후** (`contact.html`)

```html
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="cf-turnstile" data-sitekey="TURNSTILE_SITE_KEY" data-action="contact"></div>
  <button>Send</button>
</form>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
```

**변경 전** (`verify.ts`)

```ts
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.RECAPTCHA_SECRET_KEY!,
  response: String(form.get("g-recaptcha-response") ?? ""),
});
const check = await fetch("https://www.google.com/recaptcha/api/siteverify", { method: "POST", body });
const { success } = (await check.json()) as { success: boolean };
```

**변경 후** (`verify.ts`)

```ts
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.TURNSTILE_SECRET_KEY!,
  response: String(form.get("cf-turnstile-response") ?? ""),
});
const check = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", { method: "POST", body });
const { success, action } = (await check.json()) as { success: boolean; action?: string };
const human = success && action === "contact";
```

- 이 표는 `siteverify`에서 검증하는 기존 reCAPTCHA 키를 다룹니다. Google Cloud에서 만든 키는 대신 reCAPTCHA Enterprise 평가 API로 확인하며, Turnstile 쪽은 같습니다.
- v3를 썼다면 점수 기준값을 없애세요. Turnstile은 통과 또는 실패로 응답하므로, 대신 응답의 `action`을 확인하세요.
- Content Security Policy를 업데이트하세요. `script-src`와 `frame-src`에 `https://challenges.cloudflare.com`을 허용하고, 더 이상 쓰지 않는 Google 항목은 지우세요.
- 마크업과 서버 변경은 한 번에 배포하세요. 새 위젯이 있는 페이지가 아직 `g-recaptcha-response`를 기대하는 서버로 POST하면 모든 제출이 실패합니다.

## reCAPTCHA를 Ikiform으로 대체하기

폼이 Ikiform으로 POST한다면 reCAPTCHA 위젯을 완전히 제거하세요. Ikiform은 reCAPTCHA나 hCaptcha 토큰을 검증하지 않습니다. 남은 `g-recaptcha-response` 값은 추가 필드로 도착하거나, 폼의 필드를 정의했다면 알 수 없는 필드로 `422 validation_failed` 오류가 납니다. 그런 다음 대체할 방식을 고르세요.

- **추가 없음.** 허니팟, 콘텐츠 점수, 레이트 리밋은 모든 폼에서 실행됩니다. 많은 문의 폼은 이것으로 충분합니다.
- **Spam check를 Ikiform으로 설정.** Ikiform이 실행하는 Cloudflare Turnstile로, 계정이나 키가 필요 없습니다. 일반 HTML POST에는 짧은 확인 페이지가 표시되고, `fetch` 코드는 `@ikiform/sdk`의 `challenge()`를 호출합니다.
- **자체 Turnstile 키.** 페이지에 여러분의 위젯을 그대로 두고, 키를 폼 설정에 붙여 넣으면 Ikiform이 토큰을 검증합니다.

**HTML** (`contact.html`)

```html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>
```

이 폼에는 위젯이 전혀 없습니다. **Spam check**를 **Ikiform**으로 설정하면 사람 확인은 POST 이후 ikiform.com에서 이루어지므로, 페이지는 캡차 스크립트를 불러오지 않습니다. [스팸 문서](https://ikiform.com/ko/docs/spam.md#human-check)에서 각 모드를 설명합니다.

> 동시에 호스팅 폼 서비스에서 옮겨 오는 중이라면, [Formspree](https://ikiform.com/alternatives/formspree)와 [Netlify Forms](https://ikiform.com/alternatives/netlify-forms) 비교 페이지에서 그 밖에 무엇이 바뀌는지 볼 수 있습니다.

## 작동 확인하기

1. 전환 후 폼을 제출하세요. POST가 수락되고, 보인 것은 기껏해야 체크박스 하나입니다.
2. 토큰 없이 curl로 엔드포인트에 POST하세요. 거부되며, 서버가 새 토큰을 확인한다는 증거입니다.
3. 페이지에서 `g-recaptcha`와 `recaptcha/api.js`를 검색하세요. 아무것도 남아 있지 않습니다.
4. 대시보드에서 **Submissions**를 여세요. 보낸 모든 필드가 담긴 새 제출이 있습니다.
5. 아무것도 도착하지 않았나요? 대시보드의 상태 필터를 **Spam**으로 바꿔 보세요. 스팸은 실제 제출과 같은 성공 응답을 받습니다.

## 주의할 점

- **빌더 설정.** reCAPTCHA 설정이 내장된 사이트 빌더는 설정이 켜져 있는 동안 모든 폼에 요소를 요구할 수 있습니다. 요소를 지우기 전에 설정을 끄세요.
- **캐시된 페이지.** 오래된 캐시 페이지를 가진 방문자는 배포 후 한동안 `g-recaptcha-response`를 계속 보냅니다. 실패가 몇 건 생길 것을 예상하거나, 하루 동안 두 토큰을 모두 받으세요.
- **보고서의 v3 점수.** 대시보드나 알림이 reCAPTCHA 점수를 읽는다면 전환 후 조용해집니다. 함께 업데이트하세요.

## 질문

### reCAPTCHA의 가장 좋은 대안은 무엇인가요?

대부분의 폼에는 Cloudflare Turnstile입니다. 보통 보이지 않고, 소규모에서는 무료이며, 같은 secret과 response 매개변수로 검증합니다. 서드파티를 전혀 원하지 않는다면 ALTCHA 같은 자체 호스팅 작업 증명 도구가 있습니다. 많은 문의 폼은 허니팟, 점수, 레이트 리밋을 갖추면 캡차가 필요 없습니다.

### reCAPTCHA는 아직 무료인가요?

Google의 결제 문서에는 월 10,000회 평가의 무료 한도와 그 이상의 유료 등급이 나와 있습니다. 이를 전제로 계획하기 전에 Google의 최신 요금을 확인하세요.

### Ikiform은 reCAPTCHA나 hCaptcha 토큰을 검증할 수 있나요?

아니요. Ikiform은 자체 관리형 검사나 여러분의 Turnstile 키를 통한 Cloudflare Turnstile만 검증합니다. Ikiform으로 POST하는 폼에서는 다른 캡차 위젯을 제거하세요.

### reCAPTCHA에서 Turnstile로 전환하는 데 일이 많이 드나요?

보통은 그렇지 않습니다. 스크립트 URL, 요소의 클래스, 토큰 필드 이름, 검증 URL을 바꾸고, secret과 response 매개변수는 그대로 둡니다. 페이지와 서버 변경을 함께 배포하세요.

## 가이드 더 보기

- [문의 폼 스팸 막기](https://ikiform.com/ko/guides/spam-protection.md): 허니팟, 시간 검사, 콘텐츠 점수, 레이트 리밋, 필요한 곳에만 사람 확인까지, 실제 방문자에게 부담 없는 여러 겹의 검사로 문의 폼 스팸을 막으세요.
- [Cloudflare Turnstile](https://ikiform.com/ko/guides/spam-protection/cloudflare-turnstile.md): 일반 HTML 폼에 Cloudflare Turnstile을 추가하세요. 위젯, 서버 측 siteverify, 테스트 키, 그리고 키나 서버 없이 실행하는 방법까지 다룹니다.
- [캡차 없이](https://ikiform.com/ko/guides/spam-protection/without-captcha.md): 허니팟, 서명된 렌더링 시각, 콘텐츠 점수, 레이트 리밋을 따로가 아니라 합쳐서 써서 캡차 없이 대부분의 폼 스팸을 막으세요.
- [허니팟 필드](https://ikiform.com/ko/guides/spam-protection/honeypot.md): 스크린 리더, 키보드, 자동 완성에 걸리지 않으면서 봇을 잡는 허니팟을 어떤 폼에든 추가하고, 스택별 서버 검사까지 구현하세요.
- [레이트 리밋](https://ikiform.com/ko/guides/spam-protection/rate-limiting.md): 공유 저장소로 방문자별 폼 제출에 레이트 리밋을 걸고, Retry-After와 함께 429로 응답하며, 하나의 IP를 쓰는 사무실이 막히지 않게 하세요.
- [정적 사이트](https://ikiform.com/ko/guides/spam-protection/static-site.md): 시크릿을 보관하거나 POST 수를 셀 수 없는 정적 사이트 폼에서도 허니팟 파셜, 안전한 스크립트, 서버 측 검사로 스팸을 막으세요.
