JJ Creative 교육연구소 · HRD×AI 라운지 바이브 04 · 2026-10-08

«노출된 API 키가 감지되었습니다»
— 바로 오늘, 제 계정에서
열쇠(API 키)가 새는 길, 막는 법, 샜을 때 할 일

이 시리즈 마지막 편을 찍으려고 Google AI 스튜디오를 열었다가, 화면 맨 위에서 이 문구를 봤습니다. «공개적으로 노출된 API 키가 감지되었습니다.» 결제가 연결된 Gemini 키 두 개였습니다. 구글이 인터넷 어딘가에 공개된 제 키를 찾아내 알려 준 것입니다. 두 키를 바로 삭제했고, 경고는 사라졌습니다. 이론 대신 방금 겪은 실제 사고로 시작합니다. 바이브 코딩에서 가장 비싼 실수가 이것이기 때문입니다 — 앱은 다시 만들면 되지만, 새어 나간 열쇠로 쓴 요금은 돌아오지 않습니다.

읽는 법
🔑 열쇠API 키 = 카드가 연결된 금고 열쇠«키·토큰·시크릿»은 모두 같은 말입니다.
📷 실제 화면제 계정 그대로키 끝자리와 프로젝트 이름만 흐리게 가렸습니다.
💬 AI에게 말하기점검도 AI에게단, «키 값은 보여주지 마»를 꼭 붙입니다.
오늘의 실제 사고

2026년 10월 8일 오후, AI 스튜디오 «API 키» 화면

AI 스튜디오(aistudio.google.com) 왼쪽 메뉴 API 키를 누르면 내가 만든 열쇠 목록이 나옵니다. 이날 목록 맨 위에 노란 경고가, 열쇠 하나 옆엔 «경고» 딱지가 붙어 있었습니다.

Google AI Studio API 키 화면 — 맨 위 «공개적으로 노출된 API 키가 감지되었습니다» 경고 배너와 한 키 아래 «경고» 딱지에 빨간 네모, 키 이름과 프로젝트는 흐리게
삭제 전. 위쪽 빨간 네모가 경고 배너, 왼쪽 아래 작은 빨간 네모가 노출된 열쇠에 붙은 «경고» 딱지. 목록을 끝까지 내려 보니 같은 딱지가 붙은 열쇠가 하나 더 있었습니다.
같은 AI Studio API 키 화면 — 경고 배너와 경고 딱지가 사라진 상태, 키 이름과 프로젝트는 흐리게
두 열쇠를 삭제한 뒤. 경고 배너도 딱지도 사라졌습니다.
확인한 것내용
어떤 열쇠Gemini(구글 AI) 열쇠 두 개 — 각각 2025년 9월, 2026년 1월에 만든 것. 둘 다 결제 계정이 연결돼 있었습니다
어디서 샜나지금 컴퓨터의 프로젝트 파일에는 남아 있지 않았습니다. 예전에 공개된 곳(지난 기록·웹페이지·캡처 등)에 한 번 올라갔던 것으로 보입니다 — 지금 지워도 이미 퍼진 건 회수할 수 없습니다
한 일두 열쇠 삭제(= 그 열쇠로는 더 이상 아무것도 못 함). 실제로 쓰는 열쇠는 경고 대상이 아님을 끝자리로 확인
배운 것쓰지 않는 열쇠는 그때그때 지우기 · 앱마다 열쇠 따로 · 화면 코드에 넣지 않기 — 아래에서 하나씩
구글이 알려 줘서 다행이었습니다

구글·GitHub·OpenAI 같은 회사는 인터넷에 공개된 곳을 훑어 자기 회사 열쇠 모양을 찾으면 주인에게 알려 주거나 자동으로 막습니다. 하지만 항상 먼저 찾아 준다는 보장은 없습니다. 나쁜 사람들도 같은 방법으로, 더 빨리 훑습니다.

열쇠가 새는 길

«설마 내가?» — 열쇠는 대부분 이 네 곳에서 샙니다

네 칸 만화 — 길가 가게 유리창 안쪽에 붙은 빨간 열쇠, 세미나 슬라이드에 크게 찍힌 빨간 열쇠, 휴대폰 단톡방 사진 속 빨간 열쇠, 도서관 공책의 지난 페이지에 남은 빨간 열쇠
유리창(화면 코드), 슬라이드(강의 자료), 단톡방(캡처), 공책의 지난 페이지(GitHub 기록). 네 장면 모두 «잠깐이면 괜찮겠지»에서 시작합니다.
새는 곳어떻게 새나이렇게 막기
① 화면 코드
유리창
AI가 «빨리 되게» 하려고 열쇠를 웹페이지 코드에 바로 넣음. 그 페이지를 연 누구나 브라우저의 «페이지 소스 보기»로 열쇠를 볼 수 있음비싼 열쇠는 «주방»(서버)에만 — 막는 법 ②
② 공개 GitHub
공책의 지난 페이지
공개 저장소에 올라간 순간 몇 분 안에 수집됨. 나중에 파일에서 지워도 지난 기록(커밋)엔 남아 있음저장소는 비공개로, 열쇠는 보관함 파일에 — 막는 법 ①
③ 캡처·단톡방·메일«이거 왜 안 돼요?» 하며 설정 화면을 통째로 캡처해 공유. 사진 속 글자도 읽힘보내기 전에 열쇠 부분 가리기
④ 강의 슬라이드·영상실습 화면을 녹화·발표하다 열쇠가 그대로 찍힘. 영상은 한 번 올라가면 내려도 퍼져 있음시연용 열쇠는 따로 만들고, 강의 끝나면 삭제
보여도 되는 열쇠

모든 열쇠가 위험한 건 아닙니다 — 이름으로 구분하세요

헷갈리는 이유가 있습니다. 어떤 열쇠는 일부러 화면에 넣으라고 만든 것이기 때문입니다. 이름과 쓰임으로 구분합니다.

열쇠화면 코드에이유
Supabase publishable / anon🟢 넣어도 됨장부 규칙(RLS)이 지켜 주는 «공개용» — 단, RLS가 켜져 있을 때만(«바이브 03»)
Firebase 웹 설정값
apiKey 라고 적혀 있어도
🟢 넣어도 됨앱을 식별하는 «주소표»에 가까움. 보안은 Firebase 보안 규칙이 담당
Supabase secret / service_role🔴 절대 안 됨장부 규칙을 무시하는 관리자 열쇠
Gemini · OpenAI · Claude 키🔴 절대 안 됨쓰는 만큼 내 카드로 요금이 나감. 오늘 사고가 바로 이 종류
GitHub 토큰 · 결제(PG) 시크릿🔴 절대 안 됨내 저장소·매출에 손댈 수 있음
Supabase API Keys 화면 — Publishable key 와 Secret keys 두 칸, 키 값은 흐리게
한 서비스 안에도 두 종류가 나란히 있습니다(Supabase 설정 화면). 위는 공개용, 아래는 비밀용. 헷갈리면 «secret»이라는 글자가 보이면 비밀로 기억하세요.
막는 법 ①

열쇠는 «보관함»에, 보관함은 «올리지 않을 목록»에

내 컴퓨터에서 열쇠를 둘 곳은 .env라는 보관함 파일입니다. 그리고 GitHub에 올라가지 않도록 .gitignore(올리지 않을 목록)에 그 파일 이름을 적어 둡니다. 둘 다 AI가 해 줍니다 — 확인만 하면 됩니다.

GitHub의 jj-aiedu 저장소 .gitignore 파일 — 7번째 줄 .env* 와 8번째 줄 !.env.example 에 빨간 네모
제 홈페이지 저장소의 «올리지 않을 목록». 7번 줄 .env*는 «.env로 시작하는 보관함은 올리지 마», 8번 줄 !.env.example은 «단, 열쇠 없이 칸 이름만 적은 견본은 올려도 돼»라는 뜻입니다.
Vercel Add Environment Variable 창 — Type 의 Secret 선택지와 Key·Value 입력 칸에 빨간 네모
배포한 가게(Vercel)에는 보관함 파일 대신 Settings → Environment Variables에 넣습니다. 종류를 Secret으로 고르면 «저장한 뒤엔 나도 다시 볼 수 없는» 열쇠가 됩니다(입력하지 않고 창만 열어 찍었습니다).

🗂️ 내 컴퓨터

.env 보관함 파일 → .gitignore에 등록 → GitHub엔 안 올라감.

🏪 배포한 가게

Vercel Environment Variables → 종류 Secret → 손님은 못 보고 가게만 씀.
막는 법 ②

비싼 열쇠는 «주방»에서만 꺼냅니다

보관함을 잘 써도, 화면 코드가 직접 Gemini를 부르는 구조라면 열쇠는 결국 손님 브라우저로 전달됩니다. 해결책은 1편의 식당 비유 그대로 — 손님(화면)은 주문서만 넘기고, 열쇠는 주방(서버)에서만 씁니다.

식당 단면 — 홀의 손님이 배식구로 주문서를 건네고, 벽 뒤 주방의 요리사가 빨간 열쇠로 벽 금고를 열어 재료를 꺼내는 그림. 손님은 주방을 볼 수 없음
손님은 주문서만, 금고 열쇠(빨강)는 주방 밖으로 나오지 않습니다. 이 «주방»이 Vercel의 서버 기능이나 구글 Apps Script입니다.
위험한 구조안전한 구조
흐름화면 → (열쇠 들고) → Gemini화면 → 내 서버(주방) → (열쇠는 여기서만) → Gemini
열쇠 위치웹페이지 코드 안 = 누구나 «소스 보기»로 확인Vercel 환경 변수 = 아무도 못 봄
덤으로—«한 사람당 하루 몇 번까지» 같은 사용량 제한을 주방에서 걸 수 있음
AI에게«Gemini 키가 화면 코드에 들어가지 않게, Vercel 서버 함수를 거쳐서 부르는 구조로 바꿔줘»
«AI 스튜디오 앱 공유»도 같은 원리

AI 스튜디오·캔버스 같은 곳에서 만든 앱을 «내 키로» 공개 공유하면, 앱을 쓰는 사람들의 사용료가 내 계정으로 청구될 수 있습니다. 공유 전에 누구의 열쇠로 돌아가는 앱인지 꼭 확인하세요.

샜을 때 할 일

자물쇠부터 바꾸고, 그다음에 범인 찾기

열쇠가 샌 걸 알았을 때 가장 흔한 실수는 «어디서 샜는지»부터 찾는 것입니다. 그동안에도 누군가 쓰고 있을 수 있습니다. 순서가 중요합니다.

열쇠공이 현관 자물쇠를 새것으로 바꾸고 집주인이 새 열쇠를 들고 있는 그림. 바닥에는 두 동강 난 빨간 옛 열쇠, 옆 탁자엔 달력과 영수증을 비추는 돋보기
옛 열쇠(빨강)는 부러뜨리고, 자물쇠를 새로 달고, 영수증(사용 내역)을 확인합니다.
  1. 즉시 삭제(폐기) — 그 서비스 화면에서 열쇠를 지웁니다. 오늘 제가 AI 스튜디오에서 한 일입니다. 1분이면 끝나고, 이 순간부터 새어 나간 열쇠는 쓸모가 없어집니다.
  2. 새 열쇠로 교체 — 그 열쇠를 쓰던 앱이 있으면 새 열쇠를 발급해 보관함·Vercel 환경 변수에 넣고 다시 배포합니다. AI에게 «이 앱의 키를 새 키로 바꿔서 다시 배포해줘».
  3. 사용 내역 확인 — AI 스튜디오의 «사용량»·«지출» 메뉴(다른 서비스도 비슷)에서 내가 안 쓴 사용이 있었는지 봅니다. 이상하면 결제 카드사·서비스 고객센터에 바로 문의.
  4. 원인 지우기 — 그다음에 어디서 샜는지 찾습니다. 공개 GitHub 기록이었다면 저장소를 비공개로 돌리고, 캡처였다면 내립니다. 단, 1번을 했다면 이미 안전합니다 — 지난 기록을 완벽히 지우려고 애쓸 필요는 없습니다.
미리 걸어 두면 좋은 것 — 지출 한도

대부분의 AI 서비스는 «한 달 최대 얼마까지»를 정할 수 있습니다(AI 스튜디오 왼쪽 메뉴 «비용 제한» 등). 열쇠가 새도 피해가 그 금액에서 멈춥니다. 강의 실습용 계정이라면 꼭 걸어 두세요.

배포 전 10초 점검

«올려줘» 전에 다섯 줄만

☐
화면 코드에 비밀 열쇠가 없다 — Gemini·OpenAI·secret 열쇠는 서버(주방)에만
☐
.env 보관함이 «올리지 않을 목록»에 있다 — AI에게 «.gitignore에 .env 있는지 확인해줘»
☐
GitHub 저장소가 비공개(Private)다 — 저장소 이름 옆 «Private» 표시(«바이브 02»)
☐
장부 규칙(RLS)이 켜져 있다 — Supabase를 쓰는 앱이라면(«바이브 03»)
☐
안 쓰는 열쇠는 지웠다 — 시연용·옛날 앱 열쇠 정리, 지출 한도 확인
AI에게 말하기

명령어 대신, 이렇게 말하세요

AI-01 💬 코딩 에이전트

올리기 전 — 열쇠 점검

배포 전 10초 점검을 AI에게
GitHub에 올리기 전에 이 앱의 보안을 점검해줘.
1) API 키·토큰·비밀번호가 코드나 화면 파일에 그대로 들어간 곳이 있는지
2) .env 같은 보관함 파일이 .gitignore에 들어 있는지
3) 지난 커밋 기록에도 열쇠가 올라간 적이 있는지
열쇠 값 자체는 화면에 보여주지 말고, 어느 파일 몇 번째 줄인지만 알려줘. 고칠 방법도 같이.
AI-02 💬 코딩 에이전트

구조 바꾸기 — 열쇠를 주방으로

화면 코드가 AI를 직접 부르고 있다면
지금 이 앱은 화면 코드에서 Gemini를 직접 부르고 있어. 키가 브라우저에 노출되지 않게
Vercel 서버 함수를 거쳐서 부르는 구조로 바꿔줘. 키는 Vercel 환경 변수(Secret)에 넣고,
한 사람이 너무 많이 부르지 못하게 간단한 사용량 제한도 걸어줘. 내가 Vercel에서 할 일은 순서대로 알려줘.
AI-03 💬 코딩 에이전트

샜을 때 — 새 열쇠로 교체

폐기는 내가, 교체는 AI가
이 앱이 쓰던 Gemini 키가 노출돼서 방금 삭제했어. 새 키를 발급했으니
코드 어디에서 그 키를 쓰는지 찾아서, 새 키는 .env와 Vercel 환경 변수에만 넣고 다시 배포해줘.
새 키 값은 내가 직접 붙여 넣을 테니 넣을 위치만 알려주고, 화면에 키를 출력하지 마.
요령 새 열쇠를 대화창에 붙여 넣는 것도 «한 번 보여 준 것»입니다. 가능하면 Vercel·보관함 화면에 본인이 직접 붙여 넣고, AI에게는 «넣을 곳»만 묻는 편이 안전합니다.
시리즈를 마치며

바이브 코딩 기초 네 편

편한 줄
바이브 01 · 지도작업실 → 창고(GitHub) → 가게(Vercel) → 간판(도메인), 그리고 장부와 열쇠
바이브 02 · 배포«올려줘» 한마디에 2분 — 처음 한 번 연결하는 법
바이브 03 · 장부«응답 0명»을 막는 한 권의 장부와 장부 규칙
바이브 04 · 열쇠 (지금 글)열쇠가 새는 네 곳, 막는 두 가지, 샜을 때 네 단계
이 글을 만든 방법

2026년 10월 8일 제 Google AI 스튜디오·GitHub·Vercel·Supabase 계정에서 찍었습니다. AI 스튜디오의 경고는 실제로 받은 것이고, 해당 열쇠 두 개는 같은 날 삭제했습니다(키 끝자리와 프로젝트 이름은 가림). Vercel 열쇠 등록 창은 입력·저장하지 않고 열기만 했습니다. 서비스 화면 구성은 바뀔 수 있습니다.

JJ Creative 교육연구소 · HRD×AI 라운지 바이브 04 · 확인일 2026-10-08
전재현 소장 · jjh@jjcreative.co.kr · 010-8448-2354 · jjcreative.co.kr
참고: Gemini API 키 사용하기 · Vercel Environment Variables · Supabase API keys
이 자료의 활용을 원하시면 문의해 주세요.