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으로 본전 뽑음.