바이브 코더가 가장 많이 당하는 사고 TOP 5
이 다섯 개만 피해도 대부분의 사고를 막을 수 있어
한 줄로 말하면
AI로 만든 앱의 사고는 대부분 비밀값 노출, 열린 DB, 화면에서만 막은 권한, 무제한 사용, 깃허브 유출에서 나와.
이번 레슨은 "이런 게 있다"를 알아보는 지도야. 각각 어떻게 막는지는 L1, L2 레슨에서 하나씩 자세히 배울 거야.
1위·2위: 비밀값 노출과 열린 DB
1. 앱·웹 코드에 비밀 키 넣기
AI 서비스 키, 결제 비밀 키 같은 API 키를 화면 코드에 넣으면, 앱을 받은 누구나 꺼내 쓸 수 있어. 결과는 요금 폭탄이나 데이터 유출이야. 특히 Supabase의 서비스 롤 키는 모든 보안 규칙을 건너뛰는 관리자 키라서, 이게 앱에 들어가면 DB 전체가 열린 거나 마찬가지야.
2. DB 보안 규칙 안 켜기
Supabase처럼 앱이 DB에 직접 말을 거는 서비스는 RLS라는 규칙으로 "각자 자기 데이터만" 보게 막아야 해. 이걸 안 켜거나 "모두 허용"으로 열어두면, 공개 키만 가진 누구나 남의 데이터를 읽고 지울 수 있어.
3위·4위·5위: 화면 권한, 무제한 사용, 깃허브
3. 화면에서만 막은 권한
관리자 버튼을 일반 사용자 화면에서 숨기는 것만으로는 인가가 아니야. 요청은 화면을 거치지 않고도 직접 보낼 수 있거든. "이 사람이 이걸 해도 되나?"는 서버나 DB가 판단해야 해.
4. 사용량 제한 없음
AI 기능, 문자 발송, 이메일 발송처럼 쓸 때마다 돈이 드는 기능에 레이트 리밋이 없으면, 누군가 반복 요청을 보내는 것만으로 청구서가 폭발해. 로그인 시도 횟수 제한이 없으면 비밀번호 대입 공격도 쉬워져.
5. 깃허브에 비밀값 올리기
.env 파일이나 키가 들어간 코드를 깃허브에 올리면, 공개 저장소의 경우 키를 자동으로 수집하는 봇이 금방 찾아내. 나중에 파일을 지워도 Git 기록에 그대로 남아.
배포 전 5분 점검
- 앱·웹 코드에 비밀 키가 없나? (특히
EXPO_PUBLIC_,NEXT_PUBLIC_,VITE_로 시작하는 값 확인) - DB 테이블마다 RLS가 켜져 있고, 정책이 "모두 허용"이 아닌가?
- 관리자 기능이나 남의 데이터 수정을 서버·DB에서 막고 있나?
- 돈 드는 기능에 사용자별 사용량 제한과 서비스 예산 알림이 있나?
.env가.gitignore에 들어 있고, 깃허브에 비밀값이 올라간 적 없나?
확인 퀴즈
- 그대로 끈다
- 필요한 만큼만 허용하는 정책을 추가한다
- 서비스 롤 키를 앱에 넣는다
- 테이블을 지우고 새로 만든다
정답 보기
2번. RLS를 끄는 건 문을 떼어내는 거야. 필요한 행동만 허용하는 정책을 추가하는 게 정답이야.
- 화면 디자인 바꾸기
- 사용자별 사용량 제한 + 서비스 예산 알림
- 앱 이름 바꾸기
- 앱을 비공개로 출시하기
정답 보기
2번. 반복 요청을 막는 사용량 제한과, 혹시 뚫렸을 때 피해 상한을 만드는 예산 알림을 같이 걸어야 해.
- 앱 이름
- Supabase 서비스 롤 키
- Supabase 공개용 키 (RLS 켜짐)
- 앱 버전 번호
정답 보기
2번. 서비스 롤 키는 RLS를 무시하는 관리자 키라서, 앱에 들어가면 DB 전체가 열린 것과 같아.
무료 · 카카오로 바로 시작 · 레슨 243개