1일 1 개발공부 #1 · 복습 자료

바이브코딩 앱, 배포 전 보안 점검 3가지

시크릿 키·서버 검증·레드팀 — 내 앱에서 직접 확인하는 방법과 그대로 붙여넣는 레드팀 프롬프트 4개

바이브코딩으로 만든 앱을 배포하기 전에 이 3가지만 확인해도 큰 사고는 대부분 막을 수 있어요. 숏츠에서 짧게 말한 내용을, 내 앱에서 직접 확인하는 방법과 고치는 방법까지 풀어 적었어요.

먼저: 클라이언트 코드는 전부 공개된 거예요

웹이나 앱 같은 프론트엔드 코드는 누구나 볼 수 있어요. 새로운 얘기는 아니에요.

원래도 클라이언트 코드는 오픈소스라고 생각해야 된다라고 했거든요.

달라진 건 이제 누구나 뜯어볼 수 있다는 점이에요. Claude Code 같은 에이전트에 리버스 엔지니어링 도구를 붙이면, 개발을 몰라도 남의 앱 내부를 들여다볼 수 있어요. 지켜야 할 보안 지침이 새로 생긴 게 아니라, 원래 있던 지침을 뚫을 수 있는 사람이 많아진 거예요.

그래서 원칙은 하나예요. 클라이언트는 최대한 멍청하게 만든다. 어차피 털리는 곳이니 중요한 건 하나도 두지 않고, 화면을 그리는 용도로만 써요. 아래 3가지가 전부 이 원칙에서 나와요.

1. 시크릿 키 조심하기

과외를 하면서 수강생분들이 만든 서비스를 보면, 시크릿 키가 노출된 경우가 정말 많아요. 모바일 앱을 만드시는 분들은 더 그래요. 앱 안에 넣은 키는 앱 파일을 풀면 그대로 나오거든요.

시크릿 키는 그 값만 있으면 내 이름으로 외부 서비스를 쓸 수 있는 값이에요. OpenAI API 키, 결제사 비밀 키, DB 비밀번호, Supabase service_role 키 같은 것들이요. 누가 가져가면 요금은 내가 내고, 데이터는 남이 가져가요.

키가 새면 남의 데이터를 보고, 지울 수도 있어요

확인하는 법

고치는 법

코드로 보면 이런 차이예요
// ❌ 앱 코드 안에서 OpenAI를 직접 부른다 — 키가 사용자 기기에 내려간다
const res = await fetch("https://api.openai.com/v1/chat/completions", {
  headers: { Authorization: "Bearer sk-proj-..." },
  // ...
});
// ✅ 앱은 내 서버(/api/chat)만 부르고, 키는 서버 환경변수에서 읽는다
// app/api/chat/route.ts — 서버에서만 실행된다
const res = await fetch("https://api.openai.com/v1/chat/completions", {
  headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
  // ...
});

2. 입력은 서버에서 검증하기

배송비가 5만 원 이상 구매하면 배송비 무료 이런 로직 있잖아요. 이거 클라이언트에 넣는 분들 진짜 많거든요.

그러면 안 돼요. 서버에서 계산해서 내려줘야 해요. 클라이언트가 보낸 금액을 서버가 그대로 믿으면, 요청을 고쳐서 원하는 금액으로 결제하는 것도 가능해져요.

금액 계산을 앱 안에서 하면, 값을 바꿔 0원으로 주문할 수 있어요

서버에서 다시 해야 하는 건 세 가지예요.

권한 검사가 없으면 남의 회원 정보가 그대로 보여요

Supabase를 쓴다면 한 번 더 보세요. 브라우저에서 공개 키로 DB를 바로 부르는 구조인데 RLS(테이블 행 단위 접근 권한)가 꺼져 있으면, 누구나 그 테이블을 읽고 쓸 수 있어요. 저는 RLS를 켜고 정책을 따로 만들지 않아 외부에서 직접 접근하는 길을 막은 다음, 데이터는 서버에서만 다뤄요.

민감한 정보는 암호화해서 저장해요. 주민번호는 말할 것도 없고, 고객의 업무상 비밀 같은 내용도 평문으로 두지 않는 편이 좋아요. AI한테 "단방향 또는 양방향 암호화를 적절히 적용해 달라"고 하면 잘해 줘요. 단방향은 비밀번호처럼 맞는지만 확인하면 되는 값, 양방향은 나중에 다시 꺼내 써야 하는 값에 써요.

3. 배포 전에 레드팀 공격하기

레드팀은 일부러 공격자 역할을 맡아 내 서비스를 털어 보는 거예요. 학생분들한테 예전부터 많이 시키던 건데요.

일단 앱이나 뭘 만들었으면 한번 보안적으로 두들겨 볼 필요가 있어요.

인프라나 데이터베이스 쪽에서 뭔가 빠뜨리는 경우가 생각보다 많거든요. AI에게 레드팀을 시켜 보면 진짜 잘해요. 개발을 잘 모르는 상태에서 얼기설기 만들었다면 문제가 나올 확률이 높아요.

AI에게 해커 역할을 시키면 내 앱의 구멍을 찾아 줘요

프롬프트, 언제 어디에 붙여넣나요

① 배포 직전, 누구나 먼저

너는 보안 레드팀이야. 이 프로젝트를 해커 입장에서 분석해서 ① 코드나 앱에 노출된 시크릿 키 ② 클라이언트에서만 하는 가격·할인·권한 처리 ③ 권한 검사가 빠진 API를 찾아줘. 각 문제마다 위치, 공격 방법, 고치는 방법을 알려줘.

② 모바일 앱이라면 — ① 다음에

너는 보안 레드팀이야. 이 모바일 앱 프로젝트를 해커 입장에서 분석해줘. 앱을 빌드했을 때 앱 파일 안에 그대로 들어가는 것을 기준으로 ① 앱 코드나 설정 파일에 들어간 API 키·시크릿 ② 앱이 서버를 거치지 않고 직접 부르는 외부 서비스(결제·AI·DB) ③ 앱 안에서만 하는 결제·권한 처리를 찾아줘. 각 문제마다 위치, 공격 방법, 고치는 방법을 알려줘.

③ Supabase·Firebase 같은 DB나 파일 저장소를 쓴다면 — ① 다음에

너는 보안 레드팀이야. 이 프로젝트의 데이터베이스와 파일 저장소 설정을 공격자 입장에서 점검해줘. ① 로그인 없이 공개 키만으로 읽거나 쓸 수 있는 테이블 ② 로그인한 사용자가 남의 데이터를 읽거나 고칠 수 있는 경로 ③ 누구나 열 수 있는 파일 저장소 ④ 암호화 없이 저장된 개인정보를 찾아줘. 실제로 확인해 볼 수 있는 요청 예시와 고치는 방법을 같이 알려줘.

④ 문제 목록이 나왔으면 — 같은 채팅창에 이어서

위에서 찾은 문제를 심각한 순서로 정리하고, 하나씩 서버 쪽에서 고쳐줘. 고친 뒤에는 같은 공격을 다시 시도해서 실제로 막혔는지 확인해줘.

결과를 받으면 세 가지만 기억하세요.

AI 기능을 넣었다면 하나만 더요. 프롬프트 인젝션까지 출시 전부터 막을 필요는 없다고 봐요. 악용하는 사람이 나타나는 건 생각보다 나중이거든요. 대신 사용자별로 크레딧 한도를 걸어서, 넘으면 끊기게만 해 두세요. 요금 폭탄은 그걸로 막혀요.

배포 전 체크리스트

배포 전, 한 번쯤은 꼭

더 보고 싶다면

우리가 아무리 보안 수준이 높은 코드를 작성하더라도 데이터베이스 자체가 문이 열려 있으면 소용이 없어요.

DB나 이미지 저장소 같은 인프라는 꼭 필요한 권한을 가진 경우에만 접근을 허용하도록 규칙을 세워야 해요. 이 부분은 AI에게 통째로 맡기기가 조금 번거로워서, 어느 정도 알아 두는 편이 좋아요.

이 내용은 따로 강의로 정리했어요. 아래 인프라·네트워크 설계 VOD를 보세요.

관련 숏츠: 바이브코딩 보안은 어떻게 해야할까? · 바이브코딩 앱, 배포 전 보안 점검 3가지

다음 단계

풀스택 펀더멘탈 기초강의: 터미널, 개발자도구, Git 등

무료 강의 · 약 30분

풀스택 펀더멘탈 기초강의: 터미널, 개발자도구, Git 등

코드가 어디서 돌고, 에러가 어디 찍히고, 코드가 어디 저장되는지

오티클라이언트와 서버에러는 어디에 찍히나Git과 GitHub마무리 정리
0원으로 듣기
바이브코더를 위한 인프라·네트워크 설계

VOD

바이브코더를 위한 인프라·네트워크 설계

5부 · 순차 공개설계서 템플릿검수 프롬프트 5종예제 설계서 3종
커리큘럼 보기

마피아MCP

내 AI가 먼저 위험한 지점을 짚어요

동네 빵집 예약 앱 만들고 싶어

Claude

🧠 마피아MCP 판단 3개 참고

바로 기능 목록을 짜기 전에, 사장님이 지금 예약을 어떻게 받는지부터 볼게요. 첫 버전은 '예약 받기·확인 문자'만 넣고, 결제는 다음으로 미루는 걸 추천해요.

자세히 보기