AI가 생성한 크론 잡(cron job)이 한 스타트업의 모든 활성 Stripe 구독을 10초도 안 되어 삭제하여, 회사의 월간 반복 매출(MRR)을 38달러로 급감시켰습니다. 이 사건은 위험이 코드를 작성한 언어 모델이 아니라 배포 파이프라인에 존재한다는 것을 보여줍니다.
무슨 일이 일어났는가
지난주 BridgeMindAI 팀은 월간 반복 매출(MRR)이 단 38달러만 표시된 대시보드를 보며 잠에서 깨어났습니다. 한 AI 모델이 생성한 단 한 줄의 코드를 스케줄러가 자동으로 실행한 것이 화근이었습니다. 그 코드는 모든 고객 레코드에 대해 Stripe의 구독 취소 엔드포인트를 호출했습니다. 이 호출은 7초 만에 완료되었고 고객 기반을 완전히 쓸어버렸습니다.
해당 스크립트는 비어 있는 삭제 대기열을 모든 것을 삭제하라는 신호로 잘못 해석했습니다. 이러한 "비어 있음 = 전체(empty = all)" 패턴은 생성형 AI가 등장하기 훨씬 전인 1980년대부터 프로덕션 코드에 존재해 왔습니다.
모델이 범인이 아닌 이유
사람들은 AI 모델이 신뢰할 수 없다는 이유로 빠르게 비난했습니다. 하지만 모델을 교체했더라도 삭제 사고를 막을 수는 없었을 것입니다. 결함은 환각(hallucination)이나 편향이 아니라, 사람이 작성한 로직에 있었기 때문입니다.
진짜 실패 원인은 아키텍처에 있었습니다:
- 스크립트에 구독을 취소할 수 있는 실제 프로덕션용 Stripe API 키가 저장되어 있었습니다.
- 런타임 감독 없이 코드가 실행되었습니다.
- 코드 생성과 실행 사이에 인간의 확인 단계(checkpoint)가 없었습니다.
이러한 허점들로 인해 단 하나의 버그가 몇 초 만에 수익원을 파괴할 수 있었습니다.
모든 자율 파이프라인을 위한 세 가지 안전 질문
어떤 작업이 되돌릴 수 없는가? 구독 취소, 레코드 삭제 또는 환불 처리는 되돌릴 수 없습니다. 이러한 작업은 읽기 전용 쿼리보다 더 강력한 보호가 필요합니다.
에이전트가 어떤 자격 증명(credentials)을 보유하고 있는가? 자율 프로세스에 Stripe 마스터 키를 부여하는 것은 무제한의 권한을 주는 것과 같습니다. 최소 권한 원칙(least-privilege principle)을 적용하십시오. 필요한 작업만 수행할 수 있는 범위 제한 키(scoped keys)를 사용해야 합니다.
인간의 확인 단계(human checkpoint)는 어디에 있는가? 코드 리뷰만으로는 충분하지 않습니다. 코드 생성 이후와 파괴적인 작업이 수행되기 이전에 게이트를 설치하십시오.
실질적인 안전 가드레일
- 드라이 런(Dry-run) 게이트 – 삭제 또는 취소 호출을 하기 전에 대상 목록을 로그로 남기십시오. 목록이 비어 있거나 비정상적으로 많다면 작업을 중단하고 사람에게 알림을 보냅니다.
- 범위 제한 자격 증명(Scoped credentials) – 기본적으로 읽기 전용 키를 사용하십시오. 구독을 취소해야 하는 작업의 경우, 한 번에 하나의 고객 ID에 대해서만 작동할 수 있는 제한된 키를 생성하십시오.
- 인간 참여형(Human-in-the-loop) 프롬프트 – Slack과 같은 채널에 "47개의 구독을 취소하려고 합니다. 확인하시겠습니까?"와 같은 짧은 메시지를 보냅니다. 비용은 미미하지만, 안전 측면에서의 이득은 엄청납니다.
이러한 조치들은 코드를 작성하는 모델이 무엇인지와 관계없이 작동합니다. 모델(생성기)이 아니라 실행 환경을 보호하기 때문입니다.
자율 에이전트를 위한 프로덕션 체크리스트
- 모든 작업을 읽기(read), 되돌릴 수 있음(reversible), 또는 **되돌릴 수 없음(irreversible)**으로 분류하십시오.
- 모든 되돌릴 수 없는(irreversible) 작업에 대해서는 명시적인 인간의 승인을 요구하십시오.
- 자격 증명은 작업에 필요한 최소한의 권한으로 제한하십시오.
- 레코드를 삭제하거나 수정하는 루프에 크기 제한을 설정하십시오.
- 에이전트를 먼저 프로덕션 데이터를 모방한 샌드박스에서 실행하십시오. 실제 데이터에 접근하기 전에 결과를 확인해야 합니다.
- 실행 전 에이전트의 계획을 쉬운 언어로 로그에 남겨, 검토자가 의도를 한눈에 파악할 수 있도록 하십시오.
이 체크리스트를 따르면 "한 번 실행하고 잊어버리는" 스크립트가, 문제가 있어 보일 때 감사하고 중단할 수 있는 통제된 워크플로우로 바뀝니다.
교훈은 명확합니다. 모델이 아니라 프로세스를 신뢰하십시오.
