바이브코딩의 진짜 위험은 '동작 안 하는 버그'가 아니다. 동작은 잘 되는데, 그 안에 당신의 열쇠가 박혀 있다는 것이다.
"AI야, 이거 만들어줘"는 이제 누구나 한다. 코딩 몰라도 앱이 나온다. 문제는, 그 앱이 작동하는 순간 우리는 안심한다는 것이다. 화면이 뜨고 로그인이 되니까 다 된 줄 안다.
하지만 보안에서 진짜 사고는 "안 되는 것"이 아니라 "되는데 새는 것"에서 난다. AI에게 "Gemini 붙여줘", "결제 연동해줘", "텔레그램 알림 보내줘"라고 하면, 모델은 가장 빨리 화면에 결과를 보여주는 방법을 고른다. 그게 대개 키를 코드에 그냥 박는 것이다. 눈에는 아무 문제 없어 보인다.
※ '5개 중 1개'는 전수가 아닌 스캔된 표본 기준이다. 그래도 방향은 분명하다. 노출의 다수가 프론트엔드(브라우저가 내려받는 코드)에 키를 직접 넣은 경우였고, 유출 키의 상당수가 생성형 AI(Gemini 등) 키였다. AI 연동을 화면 쪽에 바로 붙이는 패턴이 가장 위험하다.
왜 위험한가. 프론트엔드 코드는 당신 사이트를 연 사람 누구나 브라우저 개발자도구(F12)로 내려받아 볼 수 있다. 거기 키가 있으면, 그 키는 이미 공개된 것이다. GitHub도 마찬가지다 — 커밋된 토큰을 수집하는 자동화 봇이 상주해서, 올리는 즉시~수분 내에 긁어간다.
말로만 하면 공허하니, 최근에 쓸 만한 프로그램을 하나 만들었다. 중고 딜 알림봇 — 번개장터·당근마켓에 원하는 물건이 조건대로 뜨면 텔레그램으로 알려주는 도구다(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와 키 분리는 최소한이지, 끝이 아니다. 몇 가지 정직한 한계:
"우리 서비스도 이런 게 새고 있진 않을까?"
바이브코딩·외주로 빠르게 만든 서비스일수록 시크릿·권한 설정이 비어 있는 경우가 많습니다. SEC.ACADEMY는 실제 공격자 관점으로 노출·권한·설정을 점검합니다.
보안 점검 문의하기 ▸