OpenCode Console 키 유출, 맡긴 제공사 키 폐기와 지출 상한 걸기
OpenCode Console 워크스페이스에 OpenAI·Anthropic·Google 키를 연결해 둔 팀은 그 키를 이미 남의 손에 넘어간 것으로 보고 제공사 대시보드에서 폐기해야 한다. OpenCode 는 10월 17일(UTC) Console 이용자의 1.4%가 이번 침해에 걸렸다고 밝혔다. 빠져나간 키는 Console 을 거치지 않고 제공사 API 를 바로 부르므로, 피해 액수를 묶어 두는 장치는 제공사 쪽 지출 상한뿐이다.
01 Console 워크스페이스에 맡긴 제공사 키가 레거시 시스템에서 새어 나갔다
OpenCode 는 터미널에서 도는 오픈소스 코딩 에이전트다. 같은 팀이 운영하는 OpenCode Console 은 호스팅 서비스로, 팀이 고른 모델을 요청당 과금 크레딧으로 쓰게 하고 워크스페이스·멤버별 월 사용 한도 같은 관리 기능을 얹었다. 워크스페이스 소유자와 관리자는 여기에 자기 제공사 계정을 직접 연결할 수도 있다. 흔히 BYOK(bring your own key, 내 API 키를 서비스에 맡겨 쓰는 방식)라 부르는 이 구성이 이번 사고의 대상이다.
회사가 영향받은 이용자에게 보낸 알림에는 "third party provider keys (eg OpenAI, Anthropic) saved in your workspace may have been exposed" 라는 문장이 들어 있었다. 침입 지점은 회사가 걷어 내던 레거시 시스템이고, 외부 제공사를 연결해 둔 이용자만 해당한다. 회사는 메일을 받지 못했다면 영향이 없다고 했고, 지금까지 키 말고 다른 데이터가 샌 흔적은 찾지 못했다고 밝혔다. 조사는 끝나지 않았으며 Anthropic·OpenAI·Google 과 함께 수습 중이라는 것이 공식 입장이다.
국내에는 한국 시간 18일 새벽 GeekNews 에 소개되며 알려졌다. 알림 메일이 나간 날짜는 보도마다 17일과 18일로 갈리는데, 대부분은 17일 오전으로 적는다. 공지 전후로 X 에는 키로 요금이 불어난다는 이용자 제보가 이어졌다.
02 '증류 공격' 이라는 설명은 키가 털린 경로를 아직 풀어 주지 못한다
증류(distillation)는 성능 좋은 모델에 질문을 대량으로 던지고, 돌아온 답으로 다른 모델을 학습시키는 기법이다. OpenCode 의 X 공지는 이번 일을 대규모 증류 공격과 엮인 침해로 소개했고, 고객 메일은 레거시 시스템 무단 접근을 원인으로 들었다. 두 설명을 잇는 고리는 아직 공식 발표에 없다.
Hacker News 토론과 해외 보도에서 가장 많이 나온 해석은 이렇다. 레거시 시스템에서 이용자 키를 빼냈고, 그 키로 상위 모델을 되풀이해 불러 답을 모았다는 것이다. 이 해석이 맞다면 남이 학습 데이터를 모으는 데 든 비용을 키 주인 계정이 치른 셈이다. 잔액이 밤사이 빠졌다거나 청구액이 수백 달러에 이르렀다는 글이 잇따랐지만, 금액은 아직 확인되지 않은 이용자 제보다. 회사가 키를 회수하는 과정에서 OpenCode 자체 키가 작업 도중 끊기거나 소셜 로그인이 실패했다는 글도 올라왔다.
공식 발표로 아직 답이 나오지 않은 것은 다음과 같다.
- 1.4%가 실제로 몇 계정인지
- 레거시 시스템에 어떤 경로로 들어왔고, 언제 처음 알아챘는지
- 무단 호출로 생긴 요금을 누가 어떻게 처리하는지
- Console 이 아니라 내 컴퓨터의 설정 파일에 둔 키도 위험한지
토론 참가자들이 원인 분석 보고서(RCA)를 요구하고 있으니, 이 네 가지는 그 보고서가 나오면 다시 확인할 거리다.
03 키가 빠져나가면 왜 Console 쪽 한도로는 못 막나
Console 의 한도는 Console 을 지나가는 요청에만 걸린다. 평소에는 개발자의 요청이 Console 에 들어오고, Console 이 저장된 키로 제공사를 부른다. 그런데 키 문자열 자체가 밖으로 나가면 공격자는 Console 을 건너뛰고 제공사에 곧장 요청을 보낸다.
평소 개발자 → OpenCode Console(워크스페이스에 내 제공사 키 보관) → 제공사 API
유출 뒤 공격자 ─────────── 같은 키로 직접 호출 ───────────→ 제공사 API
요금은 키 주인의 제공사 계정에 쌓이고, Console 은 이 호출을 보지 못한다Console 문서를 보면 워크스페이스 전체와 멤버마다 월 사용 한도를 걸 수 있다. 자동 충전을 켜 두면 잔액이 5달러 밑으로 떨어질 때 20달러씩 다시 채운다. 이 한도가 BYOK 요청에도 적용되는지와 상관없이, 유출된 키로 직접 들어온 호출은 Console 을 지나지 않는다. 그래서 새어 나간 키가 쓸 수 있는 금액의 끝은 그 키가 속한 OpenAI 프로젝트, Anthropic 워크스페이스, Google Cloud 프로젝트에 걸어 둔 한도가 정한다.
따로 한도를 걸지 않았다면 남는 것은 제공사가 정한 조직 상한이다. Anthropic 은 사용 등급마다 월 상한을 두는데, 2026년 10월 공식 문서 기준 값은 아래와 같다(Custom 등급은 상한이 따로 없다).
| Anthropic 사용 등급 | 조직 월 상한 |
|---|---|
| Start | 500달러 |
| Build | 1,000달러 |
| Scale | 200,000달러 |
등급이 높은 조직일수록, 한도를 직접 걸지 않은 키 하나가 낼 수 있는 손실도 그만큼 커진다.
로컬에서 OpenCode CLI 만 쓴 경우는 구조가 다르다. 공식 문서상 /connect 로 넣은 키는 내 컴퓨터의 ~/.local/share/opencode/auth.json 에 저장되고, 어떤 제공사 자격 증명이 들어 있는지는 아래 명령으로 본다. 이번 공지는 Console 워크스페이스에 저장된 키를 말하므로 로컬 키는 범위 밖이다. 에이전트가 .env 파일을 읽어 로컬 키도 샜을 수 있다는 말이 토론에 돌았지만, 다른 커뮤니티 글을 옮긴 전언일 뿐 근거는 나오지 않았다.
# 로컬 OpenCode 에 저장된 제공사 자격 증명 목록
opencode auth list04 키 폐기·사용량 확인·지출 상한은 제공사마다 자리가 다르다
세 제공사 모두 새 키를 만들고 옛 키를 끄는 기능은 갖췄다. 차이는 사용량을 키 단위로 보는 법과, 돈을 실제로 멈추는 한도에서 난다. 2026년 10월 공식 문서 기준으로 나란히 놓으면 이렇다.
| 제공사 | 키 교체·폐기 | 키별 사용량 | 실제로 요청을 막는 상한 |
|---|---|---|---|
| OpenAI | 프로젝트 API 키를 새로 만들어 배포한 뒤 옛 키를 revoke | Usage 페이지(추적이 켜진 키만) | 조직·프로젝트 월 한도에서 Enforce a hard limit 을 켜야 막힌다 |
| Anthropic | Admin API 로 키 상태를 inactive·archived 로 바꿈 | Usage and Cost API 의 api_key_ids[] 필터·api_key_id 묶음 | Billing 페이지의 조직 한도, 워크스페이스별 월 한도 |
| Google(Gemini API) | AI Studio 나 Cloud 콘솔에서 새 키 발급 → 배포 → 옛 키 비활성 | Cloud 콘솔의 결제 로그·API 사용량 | 알림 전용 예산은 막지 않고, 지원되는 경우의 spend cap 예산만 서비스를 멈춘다 |
OpenAI: 오래된 키는 키별 기록이 비어 있을 수 있다
2023년 12월 20일 전에 만든 키는 키별 추적이 기본으로 꺼져 있어서, 그 사용량은 Usage 페이지에 Untracked 로 묶여 나온다. Console 에 오래된 키를 넣어 두었다면 어느 호출이 그 키에서 나왔는지 가려내기 어렵다는 뜻이다. hard limit 을 켜도 집행이 즉시 일어나지는 않아서 기록된 지출이 설정값을 조금 넘을 수 있다. 한도에 닿은 요청은 429 와 함께 project_spend_limit_exceeded 또는 organization_spend_limit_exceeded 를 돌려받는다.
Anthropic: 기본 워크스페이스에는 한도를 걸 수 없다
Default 워크스페이스에는 워크스페이스 한도를 걸 수 없어 조직 한도만 적용된다. 외부 도구에 줄 키는 별도 워크스페이스에서 만들고, 그 워크스페이스에 월 상한을 거는 편이 낫다. 워크스페이스를 보관(archive)하면 거기서 만든 키가 몇 초 안에 모두 보관 처리되므로 도구 하나를 통째로 끊을 때도 쓸 수 있다. 다만 워크스페이스 보관은 되돌릴 수 없다.
조직 계정이라면 Admin API 로 키별 사용량을 시간 단위로 뽑아 이상 호출이 몰린 키를 찾을 수 있다. 사용량은 보통 요청 뒤 5분 안에 반영된다. Admin API 는 개인 계정에서는 쓸 수 없다.
# 10월 16~17일, 키별·시간별 사용량 (Admin API 키 필요)
curl "https://api.anthropic.com/v1/organizations/usage_report/messages?\
starting_at=2026-10-16T00:00:00Z&\
ending_at=2026-10-18T00:00:00Z&\
group_by[]=api_key_id&\
bucket_width=1h&\
limit=48" \
-H "anthropic-version: 2023-06-01" \
-H "x-api-key: $ANTHROPIC_ADMIN_KEY"키 목록에는 가려진 키 힌트(partial_key_hint)가 있어 Console 에 넣었던 키를 맞춰 볼 수 있다. 찾은 키는 상태를 archived 로 바꿔 끈다.
# 노출된 키 보관 처리
curl https://api.anthropic.com/v1/organizations/api_keys/$API_KEY_ID \
-H 'Content-Type: application/json' \
-H 'anthropic-version: 2023-06-01' \
-H "X-Api-Key: $ANTHROPIC_ADMIN_KEY" \
-d '{"status": "archived"}'Google: 예산 알림만으로는 돈이 멈추지 않는다
Gemini API 키는 모두 Google Cloud 프로젝트에 묶이고, AI Studio 에서 Gemini API 전용으로 쓰임새를 좁힐 수 있다. 예산은 정해 둔 비율에 닿을 때마다 알림을 보낼 뿐이고, 알림 전용 예산은 사용을 멈추지 않는다. 유출이 의심되면 대체 키를 먼저 만들어 배포한 뒤 옛 키를 Cloud 콘솔에서 비활성으로 돌리라는 것이 공식 안내다.
05 국내 팀은 Console 에 키를 맡겼는지부터 가르면 된다
이번 사고가 닿는 범위는 좁고 분명하다. OpenCode Console 워크스페이스에 자기 OpenAI·Anthropic·Google 키를 연결한 팀이 대상이고, 이 팀은 메일을 받았든 아니든 오늘 키를 바꾸는 편이 낫다. 회사 말대로라면 메일이 없으면 안전하지만 조사가 아직 진행 중이고, 키 하나를 바꾸는 품은 작다. Console 크레딧만 썼거나 로컬 CLI 에 키를 넣어 쓴 개인 개발자는 지금 공지 기준으로 할 일이 없다. 원인 분석 보고서가 로컬 키를 어떻게 다루는지만 지켜보면 된다.
손이 많이 가는 쪽은 한 키를 여러 곳에서 함께 쓰던 팀이다. Console 에 넣은 키를 CI 파이프라인, 사내 봇, 동료의 로컬 설정에도 쓰고 있었다면 폐기하는 순간 그쪽이 한꺼번에 멈춘다. 평소 교체라면 새 키부터 배포하고 옛 키를 끄는 순서가 맞다. 하지만 이미 남이 쓰고 있을 수 있는 키라면 짧은 장애를 감수하고 먼저 끄는 쪽이 손실을 줄인다.
길게 보면 외부 도구에 제공사 키를 넘기는 방식 자체를 정리할 때다. 도구마다 OpenAI 프로젝트·Anthropic 워크스페이스·Google Cloud 프로젝트를 따로 두고 그 단위에 실제로 막히는 월 상한을 걸면, 다음 유출 때 잃을 수 있는 금액이 그 상한으로 정해진다. 토론에서는 LiteLLM 같은 게이트웨이를 직접 띄우자는 의견도 나왔다. 그러면 남의 레거시 시스템에 키를 맡기지 않아도 되지만, 키를 지키는 책임이 고스란히 내 쪽으로 넘어온다.
06 오늘 할 일과 이번 주에 지켜볼 것
- OpenCode 알림 메일이 왔는지 확인하고, 메일 속 링크 대신 제공사 대시보드에 직접 접속한다.
- Console 에 저장했던 제공사 키를 폐기하고 새 키를 발급한다.
- 같은 키를 쓰던 앱·CI·동료 설정을 새 키로 바꾼다.
- 10월 16일 이후 키별 사용량과 청구를 보고, 낯선 호출이 있으면 화면과 내보낸 기록을 남겨 둔다.
- 외부 도구용 프로젝트·워크스페이스에 실제로 요청을 막는 월 상한을 건다.
- OpenCode 원인 분석 보고서가 나오면 침입 경로·탐지 시점·로컬 키 언급을 확인한다.
무단 호출 요금을 어떻게 처리할지는 아직 정해지지 않았다. 4번에서 남긴 기록이 나중에 OpenCode 나 제공사와 이야기할 때 근거가 된다.
07 자주 묻는 질문
메일을 받지 못했으면 아무것도 안 해도 되나
OpenCode 공지 기준으로는 영향이 없다. 다만 Console 워크스페이스에 키를 저장했다면 조사가 끝나지 않았으니 키를 바꿔 두는 편이 안전하다.
로컬 OpenCode CLI 의 auth.json 키도 바꿔야 하나
지금 공지 범위는 아니다. 로컬 키는 내 컴퓨터에 저장되고 회사가 따로 언급하지 않았으니, 원인 분석 보고서를 보고 판단한다.
이미 나간 무단 요금은 돌려받을 수 있나
아직 정해진 처리 방침이 없다. 키별 사용량과 청구 기록을 남겨 두고 OpenCode 와 제공사 안내를 기다린다.
Anthropic 기본 워크스페이스의 키에 따로 한도를 걸 수 있나
아니오. 기본 워크스페이스에는 워크스페이스 한도를 걸 수 없어 조직 한도만 적용되므로, 외부 도구용 키는 별도 워크스페이스에서 만든다.