SEC.ACADEMY · INSIGHTS · 2026.07.02

AI가 짜준 코드가,
당신을 판다.

바이브코딩의 진짜 위험은 '동작 안 하는 버그'가 아니다. 동작은 잘 되는데, 그 안에 당신의 열쇠가 박혀 있다는 것이다.

01버그는 눈에 보인다. 시크릿은 안 보인다.

"AI야, 이거 만들어줘"는 이제 누구나 한다. 코딩 몰라도 앱이 나온다. 문제는, 그 앱이 작동하는 순간 우리는 안심한다는 것이다. 화면이 뜨고 로그인이 되니까 다 된 줄 안다.

하지만 보안에서 진짜 사고는 "안 되는 것"이 아니라 "되는데 새는 것"에서 난다. AI에게 "Gemini 붙여줘", "결제 연동해줘", "텔레그램 알림 보내줘"라고 하면, 모델은 가장 빨리 화면에 결과를 보여주는 방법을 고른다. 그게 대개 키를 코드에 그냥 박는 것이다. 눈에는 아무 문제 없어 보인다.

02숫자가 말한다 — 이건 예외가 아니라 기본값이다

5개 중 1개
조사된 바이브코딩 사이트에서 API 키·시크릿 노출 (약 13만 개 스캔 기준)
150만
한 서비스가 유출된 키 하나(Supabase, RLS 미설정)로 털린 계정 수
2,865만
2025년 한 해 GitHub에 새로 올라온 하드코딩된 시크릿 (GitGuardian 2026)

※ '5개 중 1개'는 전수가 아닌 스캔된 표본 기준이다. 그래도 방향은 분명하다. 노출의 다수가 프론트엔드(브라우저가 내려받는 코드)에 키를 직접 넣은 경우였고, 유출 키의 상당수가 생성형 AI(Gemini 등) 키였다. AI 연동을 화면 쪽에 바로 붙이는 패턴이 가장 위험하다.

왜 위험한가. 프론트엔드 코드는 당신 사이트를 연 사람 누구나 브라우저 개발자도구(F12)로 내려받아 볼 수 있다. 거기 키가 있으면, 그 키는 이미 공개된 것이다. GitHub도 마찬가지다 — 커밋된 토큰을 수집하는 자동화 봇이 상주해서, 올리는 즉시~수분 내에 긁어간다.

03직접 만들어봤다 — 그리고 실제로 막았다

말로만 하면 공허하니, 최근에 쓸 만한 프로그램을 하나 만들었다. 중고 딜 알림봇 — 번개장터·당근마켓에 원하는 물건이 조건대로 뜨면 텔레그램으로 알려주는 도구다(github.com/jin7744/deal-alarm, 오픈소스).

이 봇은 알림을 보내려고 텔레그램 봇 토큰이 필요하다. 이건 사실상 그 봇의 비밀번호다. 이게 유출되면 남이 내 봇을 통째로 조종한다 — 스팸을 뿌리고, 내 알림을 가로챈다. AI에게 맡기면 이 토큰을 설정/코드에 그냥 적어 넣는다. 그대로 GitHub에 올리면 끝이다.

그래서 만들 때 세 가지를 지켰다:

# 1) 실제 토큰이 든 config.json 은 .gitignore 로 커밋 차단
config.json
.seen.json

# 2) 공개용은 가짜 값이 든 예시 파일만
config.example.json   →  "telegram_bot_token": "여기에_토큰"

# 3) 서버는 127.0.0.1(내 컴퓨터)만 열어 외부 노출 차단

별것 아닌 것 같지만, 이 세 줄이 "내 봇이 남 손에 넘어가는 사고"와 "안전한 배포"를 가른다. 그리고 이건 AI가 기본으로 해주지 않는다. 사람이 넣어야 한다.

// 정직하게 — 이걸 해도 완벽하지 않다

.gitignore와 키 분리는 최소한이지, 끝이 아니다. 몇 가지 정직한 한계:

  • 이미 한 번 커밋했다면 — 나중에 .gitignore에 넣어도 소용없다. git 히스토리에 남아 있고, 봇은 이미 긁어갔을 수 있다. 그 키는 폐기·재발급이 정답이다.
  • 서버로 옮겨도 끝이 아니다 — Supabase 같은 건 키를 숨겨도 RLS(행 수준 보안)를 안 켜면 공개 키만으로 관리자처럼 접근된다. 150만 계정 사고의 실제 원인이 이것이었다.
  • 자동 스캐너는 만능이 아니다 — 커스텀 토큰·난독화된 키는 놓친다. 도구는 1차 방어일 뿐, 설계가 먼저다.

// 30초 자가점검

  • 내 앱을 GitHub에 올렸다면 → 코드 검색으로 token, key, sk-, AIza, secret을 쳐본다. 나오면 지금 노출 중이다.
  • 웹앱이라면 → 브라우저 F12 → Sources 탭에서 같은 키워드를 검색한다. 프론트엔드에 키가 있으면 전 세계에 공개된 것이다.
  • 나왔다면 → ① 해당 키 즉시 재발급/폐기 ② 코드에서 빼서 서버·환경변수로 ③ .gitignore 등록 ④ 데이터베이스면 RLS/권한 확인.

"우리 서비스도 이런 게 새고 있진 않을까?"

바이브코딩·외주로 빠르게 만든 서비스일수록 시크릿·권한 설정이 비어 있는 경우가 많습니다. SEC.ACADEMY는 실제 공격자 관점으로 노출·권한·설정을 점검합니다.

보안 점검 문의하기 ▸