Anthropic Console 결제 버그: 로케일 소수점 처리로 5.04 입력 시 504달러 청구
Anthropic Console을 사용하는 한 개발자가 크레딧 구매 금액 입력란에 5.04를 입력했는데, 이 값이 조용히 504로 해석되어 의도한 금액의 약 100배인 504.00달러가 신용카드로 청구되었고, 거래 실행 전에 확인 화면이 없었다고 보고했습니다. Hacker News 아이템 50121562로 게시된 이 보고서는 로케일 종속 입력 구문 분석 실패와 자동화된 지원 프로세스가 환불을 거부한 상황을 설명합니다.
핵심 주장은 쉼표를 소수점으로 사용하는 로케일에서 사용자가 입력한 소수점 구분자가 거부되거나 정규화되지 않고 제거되었으며, 결과 금액이 즉시 결제 게이트웨이로 제출되었다는 것입니다.
신고자가 말한 상황
게시자는 자신을 코스타리카에서 개발자 팀을 이끄는 LegalTech 변호사라고 밝혔습니다. 게시물에 따르면, 그는 Anthropic API 계정에 크레딧을 추가하려고 시도했고 결제 금액을 입력하라는 메시지가 표시되었습니다. 스페인어 사용 지역에서 현지화된 시스템이 일반적으로 쉼표를 소수점 구분자로 사용하기 때문에 그는 5.04를 입력했습니다.
게시물에 따르면, 시스템은 형식 오류를 발생시키지 않았고 값을 변환하지도 않았습니다. 대신 내부적으로 소수점을 제거하고 504.00달러를 청구했습니다. 게시자는 처리 전에 최종 금액을 요약하는 확인 모달이나 검토 화면이 없었다고 밝혔습니다.
신고자의 버그 재현
같은 스레드의 후속 댓글에서 원 게시자는 콘솔 내에서 입력 검증 실패를 재현했다고 말했습니다. 그가 설명한 메커니즘은 다음과 같습니다:
"지역 설정에서 쉼표를 소수점으로 사용하는 경우(예: 제 잔액이 430,26으로 표시됨), 입력 필드는 여전히 물리적으로 점(0.5 또는 5.04)을 입력할 수 있게 허용합니다. 치명적인 UX 실패는 입력 직후 'Enter'를 누를 때 발생합니다. 폼은 프론트엔드 검증 레이어가 차단하거나 사용자에게 올바르게 경고하기 전에 원시적이고 검증되지 않은 입력 문자열을 백엔드로 즉시 제출합니다."
그는 또한 이 동작이 플랫폼 자체의 명시된 최소 금액을 우회한다고 주장했습니다:
"시스템은 자체 'USD 5.00 최소' 규칙을 위반하고, 적절한 오류 방지를 우회하며, 즉시 Stripe/게이트웨이로 결제 요청을 보냅니다."
이것들은 신고자의 시스템 동작에 대한 특성화이며, 독립적으로 검증된 결과는 아닙니다.
청구 금액은 세금으로 증가
별도의 업데이트에서 게시자는 카드에서 실제로 출금된 최종 금액이 504.00달러보다 높았다고 말했습니다. 현지 부가가치세가 잘못된 기본 금액에 추가로 계산되었기 때문입니다:
"시스템이 잘못된 504.00달러 기본 금액을 처리했기 때문에, 자동으로 현지 VAT(세금)를 추가 계산하여 추가로 65.52달러가 더해졌습니다. 이 한 번의 클릭 버그로 제 카드에서 출금된 총액은 569.52달러입니다."
지원 경험
게시자는 같은 날 이의를 제기했지만 인간 상담원이 아닌 자동화된 지원 봇으로 연결되었다고 밝혔습니다. 게시물에 따르면, 봇은 환불을 거부하고 일반 정책을 인용하며 티켓을 닫았으며, 초과 청구가 플랫폼 버그에서 비롯되었다는 주장을 인간이 검토하지 않았습니다.
그는 또한 코스타리카에 있는 은행에 차지백을 신청했으며, 그곳의 은행 절차는 해결에 최대 120일이 걸릴 수 있어 그동안 청구가 명세서에 남아 있다고 밝혔습니다.
반론: 총액이 화면에 표시됨
한 댓글 작성자는 금액이 표시되지 않았다는 주장에 반박했습니다. 사용자 striking은 platform.claude.com의 '크레딧 추가' 화면을 확인했고 총 결제 금액이 눈에 띄게 업데이트되는 것을 관찰했다고 보고했습니다:
"https://platform.claude.com의 '크레딧 추가' 화면을 보고 있는데, 입력란에
5,04를 입력하면 '총 결제 금액'이 504.00달러로 눈에 띄게 표시됩니다..."
이 관찰은 두 가지 이유로 주목할 만합니다. 첫째, 필드가 쉼표를 소수점 구분자가 아닌 천 단위 구분자로 취급할 수 있음을 시사하며, 이 경우 5,04에서 504가 생성될 수 있습니다. 둘째, 계산된 총액이 제출 전에 렌더링된다는 것을 나타내며, 이는 확인 단계보다 약한 안전장치이지만 조용한 청구와는 다릅니다. 신고자의 입장은 표시된 총액이 확인 모달이 아니며 입력이 모호한 것으로 거부되었어야 한다는 것입니다.
또 다른 댓글 작성자 merb는 입력 자체에 의문을 제기했습니다:
"5.04로 무엇을 하려고 했나요?? 스페인이나 다른 유럽 국가에서는 5,04가 맞았을 것입니다. 그래서 5.04는 유효하지 않거나 Claude가 한 것처럼 504가 되어야 합니다."
실패 모드가 단일 거래 이상으로 중요한 이유
신고자는 이 문제를 개인적인 문제가 아닌 시스템적인 문제로 규정합니다. 그의 주장은 동일한 구문 분석 경로가 입력된 숫자에 비례하여 확장된다는 것입니다. 동일한 동작에서 50.00을 입력하면 5,000.00달러가 청구될 것입니다. 그는 또한 금융 소프트웨어는 숫자 입력의 의미를 추측하기보다 모호한 입력을 거부해야 한다고 주장합니다.
"금융 소프트웨어에서 시스템은 명시적 검증 없이 숫자 입력을 추측하거나 자동으로 조작해서는 안 됩니다. 로케일 차이로 인해 입력이 모호한 경우, 애플리케이션은 100배 과잉 청구를 실행하지 말고 입력을 거부하거나 명확성을 요청해야 합니다."
자동화된 지원의 비대칭성
스레드에서 가장 널리 공감된 우려는 구문 분석 버그 자체가 아니라 명백한 실수를 인식할 수 있는 인간에게 도달할 수 없다는 점이었습니다. 댓글 작성자 clickety_clack은 이를 구조적 불균형으로 설명했습니다:
"이것은 제가 두려워하는 종류의 실수입니다. 평범한 인간이라면 '아, 물론 실수입니다. 죄송합니다'라고 말할 수 있지만, 인간과 대화할 수 없습니다. 기업은 해결을 위해 몇 달을 기다릴 수 있지만 개인은 그럴 수 없습니다."
댓글 작성자 nottorp는 결제 통제에 대한 인접한 질문을 제기하며, 이러한 결제 UI가 일회용 가상 카드 번호를 허용하는지, 유럽 카드에 3D Secure가 지원되는지 물었습니다. 이러한 질문은 스레드에서 답변되지 않았습니다.
한 댓글 작성자 UnlockedSecrets는 원 게시물이 AI 도움으로 작성되었는지 의문을 제기했습니다. 이 댓글은 보이는 스레드에서 실질적인 후속 답변을 받지 못했습니다.
해결되지 않은 사항
스레드에는 Anthropic의 버그 확인 또는 반박 응답, 수정 사항이 배포되었다는 언급, 환불이 승인되었다는 표시가 없습니다. 신고자의 재현 주장과 은행 명세서 스크린샷은 자체 보고입니다. 스레드에서 유일한 독립적 확인은 striking의 관찰로, 콘솔이 5,04 입력에 대해 계산된 총 결제 금액 504.00달러를 표시한다는 것을 확인하며, 이는 신고자의 청구 금액 설명과 일치하지만 정확한 구문 분석 경로나 확인 단계의 존재를 자체적으로 확립하지는 않습니다.
결제 입력을 구축하는 모든 사람을 위한 일반화 가능한 교훈
자유 형식 텍스트를 허용하는 통화 금액 필드는 소수점 구분자를 명시적으로 해결해야 하며 추측해서는 안 됩니다. 여기 설명된 실패 패턴은 각각 독립적으로 예방할 수 있는 세 가지 분리 가능한 구성 요소를 가지고 있습니다:
- 모호한 입력이 조용히 수락됨. 사용자 로케일과 일치하지 않는 구분자를 포함하는 값은 오류로 거부되거나 해석된 값을 눈에 띄게 표시하여 정규화되어야 합니다.
- 돌이킬 수 없는 청구 전에 확인 단계가 없음. 표시된 실행 합계는 최종 금액과 통화에 대한 명시적 확인과 동일하지 않습니다.
- 에스컬레이션 경로가 없는 자동화된 지원. 인간 검토 없이 봇이 발행한 환불 거부는 영향을 받은 당사자에게 느린 차지백 경로만 남기며, 신고자에 따르면 코스타리카에서는 최대 120일이 걸릴 수 있습니다.
사용량 기반 API 결제를 통합하는 개발자에게 실용적인 시사점은 체크아웃 시 표시된 금액을 의도한 금액과 확인하고, 공급업체가 지원하는 경우 거래당 한도 또는 일회용 번호를 허용하는 결제 수단을 선호하는 것입니다.