# 바이브코딩 사이트 5분 만에 뚫리는 이유, 비개발자 필수 상식

AI한테 "이런 서비스 만들어줘" 했더니 진짜로 만들어줬을 거예요. 링크도 생겼고, 실제로 작동도 됩니다. 

이 뿌듯함은 직접 경험해본 사람만 알죠. 그런데 그 링크, 지금 어떤 상태인지 확인한 적 있으신가요?

바이브코딩으로 만든 서비스가 5분 만에 뚫리는 건 해킹 기술이 필요해서가 아니에요. 문이 그냥 열려 있기 때문입니다. 그리고 이건 특정 누군가의 문제가 아니라, 바이브코딩으로 서비스를 배포한 대부분이 갖고 있는 구멍이에요.

이러한 문제마다 AI한테 그대로 붙여넣을 수 있는 프롬프트를 담았습니다. 읽고 나서 바로 쓸 수 있는 것들만 골랐어요.

---

## AI는 시킨 것만 합니다

본격적으로 들어가기 전에 이것부터 짚고 갈게요.

바이브코딩으로 서비스를 만들 때 보통 이렇게 시키죠. "로그인 기능 만들어줘", "결제 붙여줘", "대시보드 만들어줘." AI는 이것까진 잘 해줍니다.

그런데, 혹시 "보안 설정도 다 해줘"라고 시킨 적 있으신가요? 아마 없으실 겁니다. 그러면 AI는 최소한의 보안만 설정해 주고, 제대로 작업을 해주진 않습니다. 각잡고 시킨 적이 없으니까요.

![바이브코딩으로 서비스를 배포한 화면 예시](https://upload.cafenono.com/image/slashpagePost/20260331/121253_gx1kgTpL2c9h3bJ9ng?q=80&s=1280x180&t=outside&f=webp)

바이브코딩 서비스의 보안 구멍은 코드를 못 짜서가 아니라, 설정을 안 시켜서 생겨요. 

반대로 말하면, 어떤 설정을 시켜야 하는지만 알면 된다는 뜻입니다. 보안도 AI한테 쉽게 시킬 수 있거든요.

---

## Tip 1. 문이 열려 있다 — 접근 권한

혹시, 바이브코딩으로 사이트를 만든 적이 있으신가요? 그럼 내 서비스 주소 뒤에 `/admin`을 쳐보세요.

![주소창에 슬래시 어드민 입력 시 관리자 페이지 노출 예시](https://upload.cafenono.com/image/slashpagePost/20260331/121344_s5i9yKVwpiD0sp7keK?q=80&s=1280x180&t=outside&f=webp)

만약 여기서 로그인 화면을 거치지 않고 관리자 페이지가 그냥 뜬다면, '문이 열려 있는' 겁니다. `/main`, `/dashboard`도 마찬가지예요. 로그인 없이 접근이 된다면 전부 같은 문제입니다.

왜 이런 일이 생기냐면, AI가 로그인 페이지를 만들 때 "로그인 안 한 사람은 다른 페이지에 못 들어오게 해줘"라는 말을 들은 적이 없기 때문이에요. 로그인 페이지는 만들었는데, 뒷문을 잠그지 않은 거죠.

비유하면 이렇습니다. 가게 정문에 자물쇠는 걸려 있는데, 뒷문이 열려 있는 거예요. 손님한테는 정문으로 오라고 했지만, 뒤로 돌아가면 그냥 들어올 수 있는 상태입니다.

### **지금 확인하는 방법**

내 서비스 주소 뒤에 아래를 하나씩 붙여서 접속해보세요.

- `/admin`

- `/main`

- `/dashboard`

- `/users`

로그인 없이 페이지가 보인다면 아래 프롬프트를 바로 쓰면 됩니다.

### **AI한테 이렇게 시켜보시면 됩니다**

> `이 서비스의 모든 페이지는 로그인한 사용자만 접근할 수 있어야 해. 로그인하지 않은 상태에서 URL을 직접 입력하면 로그인 페이지로 자동으로 돌아오게 해줘. 관리자 페이지는 일반 사용자도 접근하지 못하도록 따로 권한을 분리해줘.`

---

## Tip 2. 열쇠가 밖에 나와 있다 — API 키 노출

ChatGPT나 Claude 같은 AI 기능을 서비스에 붙이려면 API 키라는 게 필요해요. 일종의 인증 열쇠인데, 이게 있어야 AI 기능을 쓸 수 있거든요. 바이브코딩으로 이 기능을 붙일 때 보통 어떻게 하냐면, AI가 "여기에 API 키 넣으세요"라고 알려주는 자리에 그냥 복붙합니다. 작동도 잘 돼요. 그런데 이 상태로 배포하면 절대 안됩니다.

![브라우저 개발자 도구에서 API 키가 노출되는 화면](https://upload.cafenono.com/image/slashpagePost/20260331/121205_E7tH1lc4uS2kWWsF0s?q=80&s=1280x180&t=outside&f=webp)

배포된 서비스에서 브라우저 개발자 도구를 열면, 코드 안에 넣어둔 API 키가 그대로 보이기 때문이예요. 말 그대로, 누구나 볼 수 있어요. 

문제는 이 키를 가져다 쓰면 요금은 내 계정에서 나간다는 점입니다. 실제로 배포 직후 몇 분 만에 키가 긁혀서 수십만 원이 청구된 사례도 종종 보입니다.

비유하면 이렇습니다. 금고 비밀번호를 메모지에 적어서 금고 옆에 붙여놓은 거예요. 금고는 잠겨 있는데, 비밀번호가 옆에 있으니 의미가 없는 거죠.

### **지금 확인하는 방법**

브라우저에서 내 서비스에 접속한 뒤, 키보드에서 F12를 누르세요. 맥이라면 `Command + Option + I`입니다. 개발자 도구가 열리면 상단 탭에서 "Sources" 또는 "Network"를 클릭하고, 검색창에 `sk-`나 `API_KEY`를 입력해보세요. 뭔가 나온다면 노출된 겁니다.

### **AI한테 이렇게 시켜보시면 됩니다**

> `현재 코드에 API 키가 직접 입력되어 있는데, 이걸 환경 변수로 분리해줘. API 키가 브라우저에서 보이지 않도록 서버 측에서만 사용하게 바꿔줘. .env 파일을 만들고, .gitignore에 추가해서 외부에 노출되지 않게 해줘.` 

혹은 더 간단하게,

> `API 키는 하드코딩되면 안돼.`

라고도 할 수 있습니다. 하드코딩이란, "코드 안에 값을 직접 넣는"것을 뜻하는데요. 민감한 정보가 유출되어 있으면 안되니, 이걸 사전에 막도록 요청하는 겁니다.

---

## Tip 3. 에러 메시지가 지도를 보여준다 — 에러 정보 노출

서비스를 쓰다 보면 가끔 오류가 나기도 합니다. 이때 화면에 뭐가 뜨는지 확인해본 적 있으신가요?

개발하는 동안에는 오류가 상세하게 뜨는 게 편해요. 어디서 문제가 생겼는지 바로 보이거든요. 근데 배포 후에도 이 설정이 그대로라면, 그 상세한 오류 내용이 사용자 화면에도 그대로 뜹니다.

![배포 환경에서 상세 에러 메시지가 노출되는 화면](https://upload.cafenono.com/image/slashpagePost/20260331/121406_IlcEi8GW5Y3PiQkxMJ?q=80&s=1280x180&t=outside&f=webp)

거기엔 데이터베이스 이름, 파일 경로, 서버 구조 같은 정보가 담겨 있어요. 공격자 입장에서는 이게 지도나 다름없습니다. 어디를 공략하면 되는지 힌트를 얻는 거거든요.

비유하면 이렇습니다. 가게에서 문제가 생겼을 때 직원이 손님한테 "지금 3층 창고 두 번째 선반에 있는 금고 비밀번호가 틀려서요"라고 설명하는 거예요. 친절한 것 같지만, 없어도 될 정보를 건네주는 겁니다.

### **지금 확인하는 방법**

서비스에서 의도적으로 오류를 내보세요. 존재하지 않는 페이지 주소로 들어가거나, 로그인 시 잘못된 정보를 입력해보세요. 화면에 뜨는 오류 메시지가 한 줄짜리 안내 문구가 아니라 길고 복잡한 텍스트라면 설정이 필요한 상태입니다.

### **AI한테 이렇게 시켜보시면 됩니다**

> `배포 환경에서는 오류가 발생해도 사용자 화면에 상세한 에러 내용이 보이지 않게 해줘. 사용자한테는 "문제가 발생했습니다" 같은 간단한 안내만 보여주고, 상세한 에러 내용은 서버 로그에만 기록되도록 설정해줘.`

---

세 가지 모두 어려운 개념이 아니에요. AI가 기본적으로 안 해주는 설정들입니다. 시키지 않았으니까요.

서비스가 작을 때는 별일 없어 보여도, 사용자가 늘어날수록 이 구멍들은 커집니다. 개인정보가 유출되거나 요금 폭탄을 맞으면 사과문 하나로 수습되지 않을 수 있어요.

위에 적은 프롬프트 세 개는 바이브코딩에 바로 사용하셔도 무방한 프롬프트입니다. 꼭 사용해 보세요 :)

다음 세션에는 고객들의 데이터를 취급하는 경우 알아둬야 할, 데이터 보안 기본기에 대해 살펴보겠습니다.

---

_팀제이커브는 비개발자를 위한 AI 활용 교육 전문 기관입니다. 기업 임직원 대상 AI 리터러시 교육과 실무 적용 워크샵을 운영하고 있습니다._

For the site tree, see the [root Markdown](https://blog.teamjcurve.com/.md).
