
AI로 만든 앱에서 계속 발견하는 치명적인 버그들 때문에, 배포 전에 잡아주는 Claude Code 스킬을 만들었습니다.
요약
AI 코딩 도구로 만든 앱에서 흔히 발생하는 치명적인 버그들을 사전에 잡아주는 'Claude Code 스킬'을 개발했습니다. 이 스킬은 프로젝트의 사용된 스택(Next, Vite 등)을 감지하여 보안, 인증, 인프라 등 5개 영역에 걸쳐 점수를 매기고 개선 목록을 제공합니다. 단순 코드 검토를 넘어 기본 설정과 운영상의 취약점까지 강제적으로 감사하는 것이 핵심입니다.
핵심 포인트
- AI 코딩 도구의 한계: '작동'은 하지만, 치명적인 보안/설정 오류는 놓침.
- Claude Code 스킬 도입: 프로젝트 전체에 대한 체계적이고 점수화된 감사(Audit)를 수행.
- 주요 발견 취약점: RLS 미활성화 Supabase 테이블, 클라이언트 번들에 포함된 service_role key 등.
- 강제적인 규율 적용: 단순 코드 검토가 아닌, 운영 및 기본 설정까지 체크리스트로 강제 점검.
저는 생계형 웹 개발자이자 SEO 전문가이며, 클라이언트들에게 AI(Claude 포함)를 사용해 구축하도록 적극적으로 권유하고 있습니다. 문제는 최근 제 받은 편지함에 도착하는 내용입니다. 절반은 같은 이메일입니다: '이걸 Lovable/Bolt/Cursor로 만들었는데 작동해요. 사람들에게 보여주기 전에 실제로 구현할 수 있게 해줄 수 있나요?' 그래서 코드를 열어보면, 거의 항상 똑같은 이야기입니다. 앱은 완성된 것처럼 보입니다. 하지만 사용자의 모든 데이터를 유출하는 것과 단지 URL 하나만 차이 날 뿐이며, 아무도 알아차리지 못합니다. 왜냐하면 추적되는 것이 없기 때문이죠. 제가 가장 많이 발견하는 것은 'row-level security'가 꺼진 Supabase 테이블입니다. 사이트를 로드하는 누구든 네트워크 탭에서 anon key를 읽어낸 다음 모든 사용자의 행을 읽고 쓸 수 있습니다. 이론적인 취약점이 아닙니다. 브라우저에서 데이터베이스 전체를 약 1분 만에요. 두 번째로 흔한 것은 VITE_ 접두사 때문에 클라이언트 번들에 포함된 service_role key입니다. 이는 RLS(row-level security)를 완전히 우회시키며, 첫 번째 문제를 해결했더라도 마찬가지입니다. 이 모든 것이 도구의 결함은 아닙니다. AI 코딩 도구들은 '작동하게 만드는 것'에 있어서는 정말 훌륭합니다. 다만 'anon key가 번들에 있다는 것'(설계상 괜찮음)과 'RLS가 꺼져 있다'(치명적임) 사이의 차이를 알려주도록 설계되지는 않았습니다. 바로 그 간극에서 사람들이 피해를 입는 것입니다. 저는 매번 같은 감사(audit) 내용을 수동으로 입력하는 것에 지쳤고, 그래서 실제 체크리스트를 Claude Code 스킬로 만들었습니다. 그리고 이 전체 과정을 Claude Code 자체 내에서 구축했습니다. 실제 클라이언트 저장소들을 가리키면서 루브릭(rubric), 스택 감지(stack detection), 수정 템플릿을 작성해 나가며 점수가 제대로 나올 때까지 작업했습니다. 프로젝트를 지정하면, 사용된 스택(Next, Vite, SvelteKit, Astro, Remix, Supabase, Firebase, Prisma 등)을 감지하고, 프론트엔드, 백엔드/데이터, 인증/보안, 인프라, 운영/복구의 다섯 가지 영역에 대해 감사합니다. 점수가 매겨진 스코어카드가 제공되며, 정확한 파일 경로와 복사-붙여넣기 수정 사항이 포함된 개선 목록(punch list)도 받습니다. 그런 다음 블로커를 수정하고 다시 실행하여 0/5점에서 녹색으로 올라가는 것을 지켜봅니다. 이 순환 과정 자체가 핵심입니다.
혹시 'Claude가 똑똑한데, 왜 스킬이 필요하죠? 그냥 코드 검토를 요청하면 안 되나요?'라고 생각하시는 분들이 계실 겁니다. 물론 가능하고, 그것도 어느 정도 찾아낼 것입니다. 하지만 문제는 지식의 부족이 아니라 기본 설정(defaults)에 있습니다. 코드 검토를 요청하면 정확히 그 결과만 받게 됩니다. 즉, 백업을 복원 테스트한 적이 있는지, 알림이 실제로 휴대폰으로 도착하는지 같은 질문은 하지 않습니다. 왜냐하면 그것은 코드에 포함되어 있지 않기 때문입니다. 반박해도 동의하기 쉬운 태도를 보이며, 실행할 때마다 점수가 다르게 매겨져서 비교할 근거가 없습니다. 이 스킬은 그러한 기본 설정을 뒤집습니다. 검증할 수 없는 모든 것은 플래그가 지정된 수동 확인(manual check) 상태로 남아 절대로 조용히 통과하지 않습니다. 사용자의 '괜찮아요'라는 말도 녹색으로 바뀌는 대신 미검증(unverified)으로 기록됩니다. 그리고 고정된 루브릭이 0/5점에서 5/5점으로 올라가는 것을 단순한 느낌(vibes)이 아닌 실제 점수로 만듭니다. Claude가 지능을 가져온다면, 이 스킬은 규율을 가져옵니다. 이것은 MIT 기반의 일반 텍스트 스킬 파일이며, 사용자가 '그냥 MVP예요', '나중에 인증 기능을 추가할게요'라고 합리화할 때 반박합니다. 왜냐하면 가장 그럴듯하게 느껴지는 변명들이 바로 사람들이 보안 침해를 당하는 원인이 되기 때문입니다. 이 스킬이 하지 않는 것: 이것은 모의 해킹(pentest)이 아니라 감사(audit)입니다. 다섯 가지 항목을 모두 통과한다는 것은 더 이상 쉬운 목표가 아니라는 뜻이지, 절대 해킹 불가능하다는 뜻은 아닙니다. 또한 비밀 키나 데이터베이스 설정에는 손대지 않습니다. 그것들은 수동 단계로 보고되는데, 라이브 키를 로테이션하는 것은 스크립트가 추측할 일이 아니라 사용자의 결정이기 때문입니다. 레포 (MIT): https://github.com/wunderlandmedia/launchworthy Claude Code에 설치: /plugin marketplace add wunderlandmedia/launchworthy /plugin install launchworthy@wunderlandmedia 제출자: /u/kemalios [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/ClaudeAI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기