홈 · 함정 가이드

x402 연동 함정 가이드: 실제 사고 22건

이 페이지는 튜토리얼이 아니라 우리의사고 대장. 각 항목에는 당시 무엇이 틀렸는지, 최종적으로 어떻게 해결했는지, 지금 어떻게 자가 점검하는지를 적었습니다. 이 함정들은 연동, 출시, 운영, GEO, 정산 다섯 단계에 걸쳐 있습니다—— 하나씩 보면 작지만, 밟으면 반나절에서 이틀을 잃습니다. 대응하는 무료 도구가 각 항목 아래에 있어 그대로 따라 할 수 있습니다.

출처 · Feegate와 rentgpu.link 프로덕션 환경 합계 22건 범위 · 연동 / 배포 / 운영 / GEO / 정산 업데이트 · 2026-10-29 기계 판독용 · pitfalls.json

1 · 데이터 소스 연동

API, 데이터베이스, CSV, 크롤러를 과금 가능한 도구로 나누는 단계 — 여기가 가장 지뢰를 심기 쉬운 지점입니다.

01수집기에서 gzip을 끄지 않아, 상대가 압축을 켜자 파싱이 터졌습니다

당시
상대 API를 호출하면 gzip 바이트 스트림이 돌아왔는데, 이를 그대로 텍스트로 파싱해 깨진 문자 오류가 쏟아졌습니다.
해결 방법
수집 레이어는 항상 Accept-Encoding: identity를 보내고 상대의 기본 동작에 의존하지 않습니다; 타임아웃과 재시도를 추가합니다.

02온체인 로그를 0번 블록부터 스캔하면 반드시 실패합니다

당시
온체인 데이터를 제네시스 블록부터 스캔했지만 타임아웃까지 결과가 없었습니다.
해결 방법
체인 헤드에서 고정 블록 수만큼 되돌아가 증분 스캔하고 커서를 DB에 저장하면, 재실행 시 이어서 진행됩니다.

03402 응답 헤더를 보냈는데 브라우저에서 읽히지 않음

당시
패킷 캡처에서는 payment 관련 헤더가 보이는데, 프런트엔드 JS에서는 undefined였습니다.
해결 방법
사용자 정의 응답 헤더는 명시적으로 Access-Control-Expose-Headers에 추가해야 하며, 그렇지 않으면 브라우저가 보안 정책에 따라 차단합니다.

04금액 단위를 잘못 써서 facilitator가 바로 거부

당시
0.01 USDC를 1e16으로 적었더니 facilitator는 'amount mismatch'만 돌려줬고, 단위 문제라는 걸 알 수 없었습니다.
해결 방법
USDC는 소수점 6자리입니다. 0.01 = 10000. 가격 생성은 공통 변환 함수를 거치고 직접 쓰지 않습니다.

2 · 배포와 라우팅

문법 검사를 통과해도 사이트가 열린다는 뜻은 아닙니다. 이 섹션의 함정은 모두 문법 밖에 있습니다.

05nginx -t는 모두 통과인데 리다이렉트 루프로 사이트가 열리지 않음

당시
정확 일치 location의 301과 try_files의 내부 리다이렉트가 서로를 물고 늘어져 브라우저가 '리다이렉트가 너무 많음'을 표시했습니다.
해결 방법
변경 후에는 실제로 요청을 보내 상태 코드와 홉 수를 확인하고, --max-redirs 로 리디렉션 횟수를 제한해 검증해야 하며, 문법만 봐서는 안 됩니다.

06관리자 주소가 301 → 슬래시 추가 → 403 흰 화면

당시
/admin 는 301로 /admin/로 넘어갔습니다. 실제 디렉터리에 index 파일이 없어 곧바로 403; 들어갈 수 있는 것은 /admin.html 뿐입니다.
해결 방법
내부 rewrite로 파일에 직접 연결합니다:rewrite ^/admin/?$ /admin.html last;. 로그인 보호 계층은 그대로 유지합니다.

07location에서 if로 정규식 판정을 하다 캡처 그룹을 덮어썼습니다

당시
클린 URL 규칙에 if 정규식 판정을 넣었더니,$1 가 초기화되고,/pricing.html 는 301로 홈페이지로 넘어갔습니다.
해결 방법
if 판정을 해당 location 밖으로 빼거나 map으로 바꿉니다. location 안에서 if와 캡처 그룹을 함께 쓰지 마세요.

08MCP 엔드포인트 리버스 프록시가 버퍼링해 SSE가 멈췄습니다

당시
streamable-http는 SSE를 쓰는데 nginx 기본 버퍼링이 스트림을 막아 클라이언트가 응답을 받지 못했습니다.
해결 방법
proxy_buffering off; + proxy_cache off; + 늘리기 proxy_read_timeout。
대응 도구:리다이렉트 체인 진단기(리버스 프록시 스니펫)

3 · 캐시와 버전

가장 까다로운 유형: 서버는 멀쩡한데 페이지만 계속 오류를 냅니다.

09CSS / JS를 고쳤는데 운영에서 '적용되지 않은 것처럼' 보임(3연속 발생)

당시
nginx가 정적 리소스에 expires 7d를 설정했는데, 페이지 참조에는 버전 번호가 없었습니다.
해결 방법
긴 캐시를 설정하면 버전 스탬프가 필수입니다. 리소스를 바꿀 때마다 버전을 올리고 릴리스 체크리스트에 적습니다.

10서버 로그는 모두 200인데 페이지는 '데이터를 읽을 수 없다'고 표시

당시
브라우저가 7일간 캐시된 옛 스크립트를 실행하다 새 데이터 형식을 렌더링할 때 크래시가 났고, catch가 이를 모두 '서버를 읽을 수 없음'으로 보고했습니다.
해결 방법
관리자 스크립트는 별도로 no-cache, 데이터 조회와 렌더링은 두 개의 try로 분리, 완전 실패 시 localStorage로 폴백합니다.

11어떤 페이지는 새것, 어떤 페이지는 옛것

당시
같은 CSS를 여러 페이지가 참조하는데, 그중 몇 개만 버전 번호를 올렸습니다.
해결 방법
사이트 전체에서 해당 리소스 이름을 검색해 일괄로 버전을 올립니다. 페이지를 손으로 골라 고치지 마세요.

12오류 문구가 방향을 잘못 잡게 만든다

당시
렌더링 크래시, 네트워크 실패, 키 만료, 타임아웃이 모두 하나의 catch에서 같은 문구로 보고되어 서버 쪽을 이틀 동안 뒤졌습니다.
해결 방법
네 가지 실패에 네 가지 문구, 401/403은 재시도 없이 재로그인을 안내하고, 실패 시 캐시 데이터를 먼저 보여 줍니다.

4 · 모니터링과 운영

크론 작업과 생존 확인 스크립트는 잘못 작성하면 조용히 데이터를 망칩니다.

13손으로 고친 876개 페이지가 크론 1회로 전부 덮어써짐

당시
정적 생성 사이트는 크론으로 재생성되므로 산출물을 손으로 고치면 반드시 덮어써집니다.
해결 방법
생성기 템플릿만 수정 → 재생성 → 배포. 산출물 mtime을 감시하는 가드 스크립트를 추가합니다.

14JSON 클라이언트로 MCP 엔드포인트를 확인해 SSE를 '죽음'으로 판정

당시
생존 확인 스크립트가 응답 본문을 파싱했는데, MCP는 SSE 스트림을 반환하므로 파싱 실패가 곧 사망 판정이 되었습니다.
해결 방법
HTTP 상태 코드만으로 판정합니다. 200과 402 모두 살아 있음으로 보고 응답 본문은 절대 파싱하지 않습니다.

15탐지 필드명을 잘못 적어 모든 항목이 항상 '변동'으로 판정됨

당시
작성한 값은 p.ok 지만 실제 필드는 p.lastOk여서 판정 로직이 항상 예외 분기로 빠졌습니다.
해결 방법
필드명은 기억이 아니라 DB에 쓰는 코드와 대조해 확인합니다. 배포 전에 알려진 데이터 두 건으로 판정 로직을 검증하세요.

16일별 집계를 증분 누적으로 하면 PV가 하루에 두 배가 됩니다

당시
'어제 값 + 오늘 증분'은 재실행할 때마다 두 배가 됩니다.
해결 방법
일 단위로 다시 계산해 덮어써 멱등성을 보장합니다. 시간 문자열 변환은 반드시 모든 집계 뒤에 둡니다.

5 · GEO와 인용 가능성

AI가 당신을 볼 수 없으면 아무리 좋은 데이터도 팔리지 않습니다.

17기본 robots.txt가 모든 AI 크롤러를 차단해 GEO가 0이 됨

당시
프레임워크 기본 템플릿을 써서 주요 AI 크롤러가 문 앞에서 막혔습니다.
해결 방법
40개 이상의 AI 크롤러를 하나씩 명시적으로 허용하고, 관리자 등 비공개 경로는 별도로 Disallow합니다.
대응 도구:robots.txt 생성기

18llms.txt를 마케팅 문구로 쓰면 어떤 AI도 인용하지 않습니다

당시
소개와 형용사를 넣었지만 AI가 검증할 수 없으니 쓰지 않은 것과 같습니다.
해결 방법
검증 가능한 사실만 씁니다. 가격, 네트워크, 엔드포인트, 절대 경로, 명확한 정산 규칙입니다.

19외부 AI가 언급은 했지만 규칙을 틀리게 말했습니다

당시
AI가 수수료를 15%, 정산을 T+7로 말했는데 '언급률' 지표는 초록불이었습니다.
해결 방법
모니터링은 '내용 정확도'를 별도 지표로 두어야 합니다. 언급되었어도 틀렸다면 언급되지 않은 것과 같습니다.

6 · 가격과 정산

돈 문제는 한 번 틀리면 신뢰를 되찾기 어렵습니다.

20가격이 너무 낮아 1년이 지나도 정산 기준에 못 미침

당시
단가를 너무 낮게 잡아 월 매출이 $50 정산 기준을 넘지 못해 자금이 계속 장부에 묶여 있었습니다.
해결 방법
등록 전에 계산합니다. 호출량 × 단가 × 분배율로 최소 성립 가격을 역산하고 회수 기간을 확인합니다.

21런타임에 데이터 파일을 고쳤더니 메모리의 옛 값이 다시 덮어씀

당시
서비스가 도는 중에 데이터 파일을 직접 고쳤는데, 재시작 전에 옛 값이 다시 기록되었습니다.
해결 방법
데이터를 만지기 전에 서비스를 멈춥니다. 대사는 온체인 Transfer 이벤트만 인정하며 허용 오차는 ±$0.02입니다.

22무료 할당량을 IP로 제한하면 분산된 Agent에게는 전혀 효과가 없습니다

당시
Agent는 매번 소스 IP가 달라서 IP 기준 제한은 제한이 아닙니다.
해결 방법
할당량을 Agent / 키 차원에 묶고 일일 서킷 브레이커를 추가합니다. 무료 할당량은 획득 비용으로 보고 ROI를 계산합니다.

이 22건을 20개의 무료 도구로 만들었습니다

각 항목 아래 도구는 모두 무료이고 로그인이 필요 없으며, 입력 내용은 브라우저 안에서만 계산됩니다. 직접 해낼 수 있으면 도구를 쓰고, 안 되면 저희가 대신 등록·홍보·정산합니다.