← 블로그
2026-05-06 · altcha · self-host · open-source

30분 안에 폼에 ALTCHA 셀프호스팅

오픈소스 작업증명 캡차의 처음부터 단계별 설정 , 위젯, 서버 라이브러리, 검증 플로우.

ALTCHA는 2026년 가장 쉬운 셀프호스팅 캡차, 호스팅할 게 거의 없기 때문 , JavaScript 위젯은 방문자 브라우저에서 실행, 검증은 서버 코드의 작은 라이브러리 호출. 중앙 서비스 없음, 데이터베이스 없음, 데몬 없음. 30분 안에 컨택 폼에 동작 가능.

필요한 것

  • 폼을 호스팅할 정적/동적 페이지
  • 서버 측 언어 (Node, Go, Python, PHP, Ruby, Rust, Java, .NET 모두 ALTCHA 라이브러리 있음)
  • 약 30분

끝. 벤더 계정 없음, API 키 없음, 월 비용 없음.

1단계: 폼에 위젯 추가

ALTCHA 스크립트(약 10KB)와 위젯 요소 포함:

<script async defer src="https://cdn.jsdelivr.net/npm/altcha/dist/altcha.min.js" type="module"></script>

```

위젯은 인라인 렌더링, 해결되면 "altcha"라는 hidden input에 증명 추가. 방문자 브라우저에서 백그라운드로 300~800ms, "Verifying" 잠깐 보이고 버튼은 활성 유지.

2단계: 서버에 챌린지 엔드포인트 추가

Node 예제:

import { createChallenge, verifySolution } from 'altcha-lib';

const HMAC_KEY = process.env.ALTCHA_HMAC_KEY;

app.get('/altcha-challenge', async (req, res) => { const challenge = await createChallenge({ hmacKey: HMAC_KEY, maxNumber: 100000, expires: new Date(Date.now() + 600000) }); res.json(challenge); }); ```

HMAC 키가 시크릿 , 무작위 문자열 생성해서 환경변수로 저장. 키 아는 사람은 가짜 챌린지 생성 가능, 데이터베이스 비밀번호처럼 취급.

3단계: 폼 제출 시 증명 검증

app.post('/submit', async (req, res) => {
  const proof = req.body.altcha;
  const valid = await verifySolution(proof, HMAC_KEY);
  if (!valid) {
    return res.status(400).send('Bot detected');
  }
  // ... 폼 처리
});

이게 전체 통합. verifySolution 호출은 증명 유효 + HMAC 일치 + 만료 안 됐으면 true 반환. 아니면 false.

실제로 막는 것

ALTCHA는 실제 브라우저 JavaScript 실행 안 하는 모든 봇 차단. cURL 스크립트, 단순 HTTP 라이브러리(Python requests, Node fetch), 저가 스팸 도구 커버. 실제 브라우저(Playwright, Puppeteer) 돌리는 봇도 폼 제출당 CPU 500ms 지불해야 해서 비용 상승, 고볼륨 스팸 비경제적.

ALTCHA는 실제 브라우저 돌리고 매 제출마다 CPU 비용 기꺼이 지불하는 결정된 공격자는 못 막음. 그건 추가 레이어 필요(IP 평판, 레이트 리미트, 허니팟, 행동 체크). ALTCHA는 진행 중 비용 0으로 폼 스팸의 약 95% 처리하는 깔끔한 프라이버시 친화 1차 레이어.

ALTCHA에서 업그레이드할 때

ALTCHA 배포 후 지속 스팸 통과 보이면, 봇 크롤러 아닌 실제 공격자에게 표적됨. 캡차 난이도 추가는 도움 안 됨 , 레이어 변경 필요. 올바른 다음 수: IP별 레이트 리미트(Cloudflare WAF 무료 룰), 이메일 평판 점수화(Sendgrid Email Validation 체크당 $0.005), 대시보드와 abuse 시그널 위해 Friendly Captcha 전환 가능.

대부분 컨택 폼, 댓글 폼, 가입 폼에 ALTCHA + 허니팟 + 기본 IP 레이트 리미트면 벤더 의존성 없이 스팸 영구 처리. 30분 설정이 진행 중 비용 0과 데이터 인프라 이탈 0으로 본전 뽑음.

이 글에 등장한 도구