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