AI로 개발해서 오픈까지 했는데, 민감한 테이블이 그냥 조회됐어요
제 지인이 AI로 서비스를 하나 만들어 막 문을 열었어요. 화면은 잘 돌아갔고, 아직 쓰는 사람은 거의 없을 때였죠. 그런데 밖에서 보면 안 되는 정보가 그냥 보이는 구멍이 하나 있었어요.
제가 "이거 고쳐야 한다"고 알려줬더니, 지인이 자기 AI한테 맡겼대요. AI는 코드를 고쳤고, 따로 "이건 직접 하셔야 해요"라는 할 일 목록도 넘겼어요.
오늘은 이 얘기를 코딩 모르는 분도 따라올 수 있게 풀어볼게요.
건물로 비유하면 이래요
요즘 AI로 앱을 만들면 Supabase 같은 서비스를 많이 써요. 데이터 저장, 로그인, 파일 보관처럼 앱 뒤에서 돌아가야 할 일을 통째로 맡아주는 서비스예요. 이번 이야기는 그중 데이터를 보관하는 창고 부분이에요.
이 창고를 건물이라고 생각해보세요.
- 공개 키 = 건물 출입증이에요. 앱을 쓰는 사람 누구에게나 나눠줘요. 브라우저에서 조금만 들여다보면 누구나 볼 수 있고, 원래 그래도 되는 물건이에요
- 권한 규칙 = 방마다 달린 자물쇠예요. "이 방은 본인만", "저 서랍은 관리자만" 하고 정해두는 거예요
- 비밀 키 = 관리실 마스터키예요. 모든 자물쇠를 무시하고 다 열어요. 이건 절대 밖에 나가면 안 돼요
이런 앱은 화면(앱)이 출입증을 들고 창고에 직접 가서 데이터를 꺼내 오는 구조예요. 중간에 따로 지키는 사람이 없어요. 그래서 창고 쪽 자물쇠가 유일한 문단속이에요.
지인 서비스는 출입증은 잘 나눠줬는데, 방에 자물쇠를 안 달아둔 상태였어요. 그러면 같은 출입증만 있으면 화면을 거치지 않고도 창고에 바로 물어볼 수 있어요. 화면에 안 나오는 방까지요. 예를 들면 이런 것들이요.
- 회원 목록에서 누가 관리자인지
- 채팅 기록에서 "익명"이라던 사람의 접속 주소(IP)
화면은 멀쩡했어요
여기서 중요한 건, 화면에는 아무 문제가 없었다는 거예요. 버튼도 잘 눌리고 글도 잘 올라갔어요. 문제는 화면 뒤, 창고 자물쇠에 있었어요.
요즘은 AI한테 권한만 주면 창고에 방(테이블)도 직접 만들어줘요. 자물쇠를 다는 것도 AI가 할 수 있어요. 그런데 만드는 데 집중하다 자물쇠 다는 걸 빠뜨리는 일이 많아요. 이번에도 그랬어요.
"열쇠가 털린 거야?" — 아니에요
많이들 이렇게 오해하세요. 이번에 문제는 출입증(공개 키)이 보인 것이 아니에요. 출입증은 원래 다 보여요.
진짜 문제는 방에 자물쇠가 없었던 것이에요. 그래서 심각하긴 해도 자물쇠를 달면 막혀요.
반대로 마스터키(비밀 키)가 샜다면 얘기가 완전히 달라요. 자물쇠를 다 무시하니까, 데이터를 보는 건 물론이고 지우거나 바꿀 수도 있어요. 그래서 "어느 키가 문제냐"가 얼마나 심각한지를 가르는 첫 번째 질문이에요.
AI가 고쳤어요, 그런데
지인의 AI는 빠진 자물쇠를 제대로 달았어요. 이제 출입증만으로는 그 방이 안 열려요. 여기까진 잘 고친 거예요.
그런데 보안 문제는 보통 한 군데에만 있지 않아요. 이번에도 자물쇠와는 다른 곳에 설계 문제가 하나 더 남아 있었어요. 자물쇠를 아무리 튼튼하게 달아도 그쪽은 안 막혀요. 종류가 다르거든요.
AI가 "직접 하셔야 해요"라고 넘긴 것
오히려 지인의 AI는 잘 대응했어요. 코드를 고친 뒤, 자기가 대신 못 하는 일을 급한 순서대로 정리해 넘겼거든요.
- 1순위 — 사이트 주소를 관리하는 토큰(주소 설정을 바꿀 수 있는 열쇠)이 화면 캡처에 찍혀 있었대요. 누가 이걸 보면 사이트를 통째로 다른 곳으로 돌릴 수 있어서, 관리 화면에 들어가 직접 지워야 해요
- 2순위 — 중요한 열쇠 파일을 USB에 따로 백업해두기
이 토큰이 앞에서 말한 마스터키 같은 진짜 비밀이에요. 캡처에 찍힌 순간 더 이상 비밀이 아니니까 바로 없애고 새로 만드는 게 기본이에요.
지인이 "주소도 바꾸라고 했었나?" 하고 다시 물었을 때도, AI는 그런 말은 안 했다고 정확하게 답했어요. 괜히 겁주지 않고 할 일만 딱 짚은 거죠.
문제는 이 목록이에요. 관리 화면 로그인, 토큰 삭제, 파일 백업은 계정 주인이 직접 해야 하는 일이라 AI가 대신 못 해요. 그래서 AI가 코드를 다 고쳐도 이 목록이 남아 있으면 끝난 게 아니에요. 그리고 사람들은 보통 여기서 놓쳐요. "AI가 고쳤대"라는 말에 안심해서요.
"AI가 고쳤다"와 "다 끝났다"는 달라요.
AI가 "보안 문제가 있어요"라고 하면 물어볼 네 가지
- 어느 키 얘기야? — 출입증(공개 키)이면 자물쇠 문제고, 마스터키(비밀 키)나 토큰이면 바로 없애야 해요
- 어디가 문제야? — 자물쇠(권한)인지, 로그인 방식인지, 다른 곳인지요. 자리가 다르면 고치는 법도 달라요
- 직접 확인한 거야, 짐작이야? — 처음 구멍을 짚은 AI도 처음엔 둘을 섞어서 말하다가, 다시 물으니 "이건 확인, 이건 추측"으로 나눠줬어요. AI는 그럴듯한 말을 고르는 식으로 답해서, 짐작을 확인한 것처럼 말할 때가 있어요
- 이 중에 내가 직접 해야 하는 건? — 관리 화면, 계정, 백업처럼 AI가 못 하는 일은 따로 받아서 하나씩 체크하세요
코딩을 모르신다면, 이것만은
어려운 설정은 몰라도 괜찮아요. 대신 이 네 가지는 꼭 지켜주세요.
- 필요 없는 정보는 받지 마세요. 전화번호, 주소, 생년월일처럼 없어도 되는 건 아예 모으지 않는 게 제일 안전해요. 안 받은 정보는 샐 일도 없어요
- 긴 영문 키는 아무 데나 붙여 넣지 마세요. 뭐가 출입증이고 뭐가 마스터키인지 모르겠다면, 전부 마스터키라고 생각하세요. 캡처할 때도 가리고요
- AI한테 "했어요"가 아니라 결과를 보여달라고 하세요. "자물쇠 달았어?" 대신 "보안 점검을 돌리고 결과를 보여줘"라고 하세요. Supabase에는 보안 점검 기능이 있어요
- 문 열기 전에 한 번은 아는 사람에게 보여주세요. 5분만 봐줄 사람이 있으면 충분해요. 이번 일도 그렇게 잡았어요
조금 아신다면, 5분 점검
본인 프로젝트에서 이것만 보면 돼요. 남의 사이트를 건드리라는 얘기는 아니에요.
- AI한테 방(테이블)을 만들게 할 땐 "권한(RLS) 규칙도 같이 걸어줘"라고 한 줄 붙이기
- Supabase 관리 화면에서 RLS(방 자물쇠 기능)가 켜져 있는지
- 방마다 누가 볼 수 있는지 규칙이 걸려 있는지
- 관리자 여부, IP, 이메일처럼 민감한 칸이 아무나 보이진 않는지
- 비밀 키가 앱 코드나 깃 저장소에 들어간 적 없는지 — 들어갔다면 바로 새로 만들어야 해요
- 캡처에 키나 토큰이 찍힌 채 어디 올린 적 없는지 — 찍혔다면 그것도 바로 없애기
바이브 코딩은 화면을 빨리 만들어줘요. 그런데 자물쇠는 화면이 아니라 창고 쪽 일이에요. AI도 달 수 있지만 시키지 않으면 빠뜨리기 쉽고, 토큰 지우기는 아예 사람 손으로 해야 하는 일이에요.
지난주 플러그인 취약점, 샌드박스 얘기와도 같은 얘기예요. 막아뒀다고 믿은 곳이 사실 안 막혀 있던 거요.
짚어둘 것
이 글은 특정 사이트나 사람을 가리키지 않아요. 어디인지 알 수 없게 바꿔 썼고, 실제 데이터나 키 값은 이 글에 없어요.
뚫는 방법은 적지 않았어요. "내 프로젝트를 어떻게 점검하나"까지만 썼어요.
지인 건은 쓰는 사람이 거의 없을 때 잡아서 다행히 피해가 없었어요. 문 연 직후가 점검하기 제일 좋은 때예요.
AI가 고쳐줬다길래 안심했다가 놓친 거 있으세요? 카톡 오픈채팅 ⚡ AI랑 코딩하는 사람들에서 이야기 나눠요.