앱이 완성됐고 배포도 됐고 이제 링크를 세상에 공개하는 일만 남았습니다. 시리즈 마지막 편은 그 직전에 서서 하는 최종 점검입니다. 사용자를 받기 전에 확인해야 할 보안 체크리스트 여섯 항목, 그리고 1편부터 이어온 지도의 전체 요약입니다.
시작 전에 흔한 오해 하나를 정리하겠습니다. “내 앱은 작고 유명하지도 않은데 누가 공격하겠어”라는 생각이요. 2편에서 봤듯이 공격자는 사람이 아니라 봇입니다. 봇은 표적을 고르지 않고 그물을 칩니다. 인터넷에 공개된 모든 주소를 자동으로 훑으면서 열린 문을 찾죠. 작은 앱이라서 안전한 게 아니라, 작은 앱이라서 아무도 지켜주지 않을 뿐입니다. 다행히 바이브 코딩 앱에서 뚫리는 문은 대부분 정해져 있고 아래 여섯 개가 그 문들입니다.
공개 전 체크리스트 6
1. 비밀 값이 새고 있지 않은가. 2편의 그 점검입니다. API 키가 프론트엔드나 GitHub 공개 저장소에 노출돼 있지 않은지. AI에게 시키는 말: “이 프로젝트에서 API 키나 비밀 값이 프론트엔드로 전송되거나 Git에 커밋된 적이 있는지 전부 찾아줘.”
2. 권한 검사가 백엔드에 있는가. 1편의 원칙입니다. 삭제 버튼을 숨기는 것은 장식일 뿐, 요청은 누구나 보낼 수 있습니다. 글 삭제·수정·조회 각각에 대해 “이 사용자가 이걸 할 자격이 있나”를 백엔드가 확인해야 합니다. AI에게 시키는 말: “모든 백엔드 API가 로그인 여부와 소유권을 확인하는지 감사하고, 빠진 곳을 목록으로 줘.”
3. DB에 아무나 드나들 수 없는가. 창고(DB)에는 자체 출입 규칙이 있습니다. Supabase라면 RLS(Row Level Security, 행 단위 보안)라는 기능인데, 쉽게 말해 “각 데이터 줄마다 누가 읽고 쓸 수 있는지”를 창고 문에 붙여두는 규칙입니다. 이게 꺼져 있으면 백엔드를 거치지 않고 창고를 직접 터는 경로가 열립니다. 실제로 바이브 코딩 앱 사고 사례에서 가장 자주 지적되는 항목입니다. AI에게 시키는 말: “내 DB 테이블 중 아무나 읽거나 쓸 수 있는 테이블이 있는지 확인하고 잠그는 법 알려줘.”
4. 이상한 입력에 대비돼 있는가. 사용자는 입력창에 뭐든 넣습니다. 10만 글자짜리 글, 이상한 코드 조각, 빈 값. 백엔드가 입력의 길이와 형식을 검증하지 않으면 앱이 깨지거나 뚫립니다. AI에게 시키는 말: “사용자 입력을 받는 모든 곳에서 길이 제한과 형식 검증이 있는지 확인해줘.”
5. 요금 안전장치가 걸려 있는가. 7편의 그 5분 설정입니다. 지출 한도와 예산 알림. 사용자가 생기는 순간부터 호출량은 내 손을 떠나므로 공개 전이 마지막 설정 기회입니다.
6. 되돌아갈 곳이 있는가. 3편의 세이브 포인트입니다. 공개 직전 상태를 커밋·푸시해두고, DB 백업이 켜져 있는지 확인합니다. 공개 후 첫 사고 때 “잘 되던 시점”으로 돌아갈 수단이 있느냐가 복구 속도를 결정합니다.
여섯 개를 다 챙기기 부담스러우면, 마지막 수단으로 이 프롬프트 하나라도 실행하세요. “너는 보안 감사관이야. 이 프로젝트를 공개하기 전에, 비밀 값 노출·권한 검사 누락·DB 접근 규칙·입력 검증 관점에서 위험한 곳을 전부 찾아서 심각한 순서대로 알려줘.” 만들 때 실수한 AI도, 감사를 시키면 잘 찾습니다. 다만 AI의 “이제 안전합니다”를 그대로 믿지 말고 위 체크리스트와 대조하며 하나씩 확인하는 것까지가 점검입니다.
시리즈 총정리: 한 장의 지도
여덟 편을 한 장으로 접으면 이렇게 됩니다.
- 1편 — 구조: 앱은 홀(프론트엔드)·주방(백엔드)·창고(DB)입니다. 프론트엔드는 공개된 공간이므로 비밀을 두지 않습니다.
- 2편 — API 키: 키는 법인카드입니다. 자리는
.env와 배포 대시보드, 딱 두 곳입니다. - 3편 — Git: 커밋은 세이브입니다. 잘 되는 순간마다, 큰 수정 직전마다 세이브합니다.
- 4편 — 배포: 배포는 서버로의 이사입니다.
.env는 이삿짐에 실리지 않으니 대시보드에 따로 등록합니다. - 5편 — 에러: 에러 메시지는 자백서입니다. 통째로, 상황과 함께 AI에게 넘깁니다. AI가 뱅뱅 돌면 판을 바꿉니다.
- 6편 — 미스터리: “아무것도 안 바꿨는데”의 범인은 캐시·의존성·외부 서비스·어제의 나입니다. 싼 확인부터 순서대로.
- 7편 — 요금: 청구서는 토큰·읽기쓰기·트래픽에서 나옵니다. 지출 한도와 알림이 5분짜리 보험입니다.
- 8편 — 공개 전 점검: 위의 여섯 문을 잠그고 나갑니다.
마치며
이 시리즈는 코딩을 가르치지 않았습니다. 대신 지도를 그렸습니다. 내 앱이 어떤 부품으로 되어 있고, 각 부품이 어디서 어떤 사고를 내며 사고가 났을 때 어디를 보고 AI에게 뭐라고 말해야 하는지. 바이브 코딩의 진짜 실력은 코드를 읽는 능력이 아니라, 이 지도를 들고 AI에게 정확한 질문을 던지는 능력입니다.
지도는 이제 여러분 손에 있습니다. 좋은 것을 만들어서 세상에 보여주세요.
