이 글은 보안 전문가가 아닌 1인 개발자에게도 일어날 수 있는 사고를 비식별화하고 일반화하여 정리한 것입니다. 공격 절차는 포함하지 않습니다. 목적은 이런 일을 피하도록 돕고 — 혹시 일어나더라도 침착하게 대응하도록 하는 데 있습니다.
- 유형
- 계정 정지 / API 키 탈취 및 악용
- 발단
- 탈취된 API 키가 제3자에게 악용됨
- 사유
- 그 악용이 '디스틸레이션' 정책 위반으로 자동 분류됨
- 역설
- 제3자가 한 일인데도 키 소유자의 계정이 정지됨
- 예방
- 키 분리, 최소 권한, 사용량 알림, 의존성 CVE 머신 모니터링
- 대응
- 증거 보존 → 공식 양식으로 이의 제기(로그로 '사람이 한 일이 아님' 입증)
"청구를 멈췄다" ≠ "끝났다"
부정 청구를 멈추는 것은 출혈을 막을 뿐입니다. 진짜 대응은 누출 경로를 닫고, 지금 당신의 이름으로 기록된 "위반"까지 처리하는 것입니다.
피해자조차 정지되는 이유
핵심은 플랫폼의 판단이 **"누가 조작했는가"가 아니라 "이 계정 아래에서 무슨 일이 일어났는가"**에 근거한다는 점입니다. 키 보유자가 책임 주체로 취급되므로, 위반 패턴이 탐지되는 순간 계정이 정지됩니다.
"디스틸레이션"이란 무엇인가
강력한 모델의 출력을 대규모로 수집해 그 입력→출력 쌍을 학습 데이터로 삼아 다른 AI 모델을 학습시키는 것입니다. 대부분의 주요 AI 제공자 약관은 자사 출력을 경쟁 모델 구축에 사용하는 것을 금지합니다. 대량 어노테이션과 데이터 라벨링은 이 패턴에 정확히 들어맞으며, 바로 그 지점에서 자동 집행이 발동하기 쉽습니다.
실제로 일어나는 일
탈취범에게 남의 키는 "공짜로 태울 수 있는 연산 자원"입니다. 그 사용이 정책 위반(디스틸레이션, 대량 생성)일 때 소유자의 계정이 폭발 반경에 휘말립니다. 이 사고의 고약한 부분은 탈취 그 자체가 아니라 키가 그 후 어떻게 쓰이는가가 정지를 유발한다는 점입니다.
전형적인 징후(일반화)
실제 사례에서는 정지 이전에 보통 "본인이 인지하지 못한 사용량"이 먼저 보입니다. 구체적 수치는 생략하지만, 공통된 특징은 다음과 같습니다.
징후 1 — 사용량 이상
평소 기준을 한참 넘어서는 사용량과 청구가 짧은 시간에 나타남.징후 2 — 콘텐츠 불일치
한 번도 쓴 적 없는 모델, 본인 작업과 무관한 콘텐츠, 본인 것이 아닌 언어로의 처리.징후 3 — 자동화 지문
매우 짧은 시간에 집중된 막대한 수의 요청, 그중 상당수가 빈 출력 — 사람이 만들 수 없는 분포.결과 — 계정 정지
며칠 뒤, 정책(예: 디스틸레이션) 위반으로 계정이 정지됨.
징후가 보이면 무언가를 단정하기 전에 원시 로그부터 보세요. 모델, 콘텐츠, 언어, 시간 분포가 그것이 당신의 사용인지를 한눈에 알려줍니다.
예방: 사고가 번지지 않게 하는 키 설계
정지를 뿌리부터 끊으려면, 애초에 키를 탈취당하지 말고 — 만약 당했더라도 폭발 반경을 작게 유지하세요.
서비스마다 키를 분리한다
최소 권한과 한도
사용량에 이상 탐지 알림을 건다
의존성 CVE를 머신으로 모니터링한다
키는 파일 외의 장소에서도 새어 나간다
코드와 git을 깔끔하게 grep했다고 안전한 것은 아닙니다. 실행 중인 프로세스의 환경 변수는 취약점(RCE)이나 HTTP 헤더를 통해 빠져나갈 수 있습니다. 누출은 파일만이 아니라 런타임에서도 일어납니다. RCE란 무엇인가 / .env란 무엇인가 참고.
정지되었다면: 이의 제기를 어떻게 생각할까
악용의 객관적 증거를 쥐고 있다면, 침착하게 사실을 제출하는 것이 길을 엽니다. 관건은 로그로 "이건 사람이 했을 리 없다"를 보여주는 것입니다.
증거를 보존한다
공식 양식으로 사실을 제출한다
국면에 따라 논점을 바꾼다
"사람이 한 일이 아니다"가 통하는 이유
매우 짧은 시간에 집중된 막대한 요청, 그중 상당수가 빈 출력 — 이는 정상적 사용으로 설명되지 않습니다. 사용 패턴의 부자연스러움 그 자체가 "이건 내 조작이 아니다"라는 가장 강력한 객관적 증거입니다.
흔한 실수 vs 올바른 준비
흔한 실수
- 하나의 키를 여러 프로젝트에서 재사용
- 사용 한도나 이상 탐지 알림이 없음
- grep이 깨끗해서 안심
- 청구를 멈춘 것만으로 "끝났다"고 판단
- 증거를 정리하지 않고 감정적으로 항의
올바른 준비
- 서비스마다 키 분리, 최소 권한
- 하드/소프트 사용 한도와 이상 탐지 알림 설정
- 런타임 누출(RCE, 헤더)도 의심
- 출혈 차단과 누출 차단을 모두 수행
- "사람이 한 일이 아님"을 로그로 침착하게 제시
이 사례는 어떻게 마무리되었나(후일담)
이 부류의 사고에서는 로그 — 그 행위가 사람이 한 것이 아니라는 객관적 증거 — 를 뒷받침으로 한 이의 제기가 최종적으로 계정 복구로 이어졌습니다. 동시에 악용된 사용분에 대한 추가 환불은 이루어지지 않았고, 이미 적용된 크레딧 선에서 그 이상은 없이 끝났습니다.
그것이 여기서 가장 날카로운 교훈입니다: 계정이 돌아오더라도, 탈취된 키로 빠져나간 돈은 돌아오지 않습니다. 복구에도 시간과 노력이 듭니다. 그러니 진짜 방어는 "잠긴 뒤에 싸우는 것"이 아니라 — 키를 누출시키지 않고, 누출되더라도 사용량을 상한 처리해 폭주하지 못하게 하는 사전 설계입니다. 이의 제기는 최후의 수단이지, 1차 방어선이 아닙니다.
한 줄로: 정지를 부르는 것은 탈취가 아니라 "키가 그 후 어떻게 쓰이는가"입니다. 그러니 방어는 키 설계에, 대응은 로그 보존에 있습니다.
다음으로 읽기
- 용어집: RCE란 무엇인가 / .env란 무엇인가 / CVE란 무엇인가
- 방어: CVE를 놓치지 않고 안전하게 운영하기
FAQ
Q아무 정책도 위반하지 않았는데 왜 계정이 정지되나요?
당신의 API 키가 탈취되어 제3자가 정책 위반 행위(대량 데이터 생성 등)에 사용하면, 그 행위는 당신의 조직 아래에 기록됩니다. 대부분의 플랫폼은 자동화된 집행으로 위반 패턴을 탐지해 계정을 정지하기 때문에 — 제3자가 한 일이라 하더라도 키의 소유자인 당신의 계정이 정지될 수 있습니다.
Q'디스틸레이션(distillation)'이란 무엇인가요?
강력한 모델의 출력을 대규모로 수집해 입력→출력 쌍을 학습 데이터로 삼아 다른 AI 모델을 학습시키는 것입니다. 대부분의 주요 AI 제공자는 자사 모델의 출력을 경쟁 모델 구축에 사용하는 것을 금지합니다. 대량 어노테이션이나 데이터 라벨링은 이 패턴에 들어맞아 자동 집행에 걸리기 쉽습니다.
Q정지되면 먼저 무엇을 해야 하나요?
악용의 증거(매우 짧은 시간에 집중된 비정상적 폭증, 당신의 사용 양상과 맞지 않는 콘텐츠)를 보존하고, 공식 이의 제기 양식으로 사실을 제출하세요. 핵심은 로그를 객관적 증거로 삼아 — 키가 탈취되었고 그 행위가 당신의 작업이 아니라 자동화된 악용이었음을 보여주는 것입니다.