AI로 만든 내 SaaS를 직접 감사해 보았다. 재앙을 예상했지만, 결제 로직은 괜찮았다. 하지만 두 가지 요소가 API 비용을 바닥내고 키를
요약
AI 도구(Cursor, Claude Code)를 활용해 구축한 SaaS의 보안성을 직접 감사한 경험담입니다. 결제 로직은 예상외로 견고했으나, API 비용을 급증시킬 수 있는 무료 기능의 속도 제한(Rate-limiting) 설정 오류 등 실제 운영 시 주의해야 할 보안 및 비용 문제를 다룹니다.
핵심 포인트
- AI가 작성한 결제 로직은 서버 측 검증이 적절하다면 충분히 안전할 수 있음
- 작동하는 코드와 보안이 확보된 코드는 다르므로 직접적인 코드 감사가 필요함
- 결제 로직보다 API 호출 제한(Rate-limiting) 설정 오류가 비용 재앙을 초래할 수 있음
- 개발 환경의 지름길(Shortcut)이 운영 환경에 노출되지 않도록 주의해야 함
저는 보안 전문가가 아닙니다.
저는 주로 AI 프롬프팅을 통해 작은 유료 SaaS를 구축했습니다. Cursor와 Claude Code가 대부분의 타이핑을 담당했고, 저는 방향을 잡는 역할을 했습니다. 결제 프로세서 체크아웃(checkout)이 연결된, 사람들이 비용을 지불하고 사용하는 도구입니다. 그리고 실제 사용자들에게 공개하기 직전, 저는 불안해졌습니다.
무언가 고장 난 것처럼 보여서가 아니었습니다. 모든 것이 제대로 작동했습니다. 데모는 깔끔했고, 체크아웃은 완료되었으며, 유료 기능들이 해제되었습니다. 바로 그것이 문제였습니다. 그것은 '작동'하고 있었지만, 저는 제 코드베이스를 완전히 읽고 그것이 실제로 안전한지 판단할 수 없었습니다. "작동한다"는 것과 "실제 돈과 실제 사용자 데이터를 뒤에 둘 만큼 안전하다"는 것은 같은 문장이 아니며, 저는 그 둘 사이에 놓인 코드를 절반 정도만 이해하고 있었습니다.
그래서 출시 전에 직접 자리에 앉아, 저에게 실제로 해를 끼칠 수 있는 부분들을 한 줄씩 감사(audit)했습니다. 제가 발견한 것들, 그리고 저를 놀라게 했던 부분을 공유합니다.
제가 두려워했던 것들
"AI가 보안에 취약한 코드를 작성한다"는 스레드를 읽어보셨다면, 흔히 의심되는 대상들을 알고 계실 것입니다. 그리고 그것들은 정확히 제가 두려워했던 것들이었습니다:
- 누군가 브라우저에서 가격을 변경하여 29달러 대신 1달러만 결제할 수 있는가?
- 나의 페이월(paywall)이 진짜인가, 아니면 누구나 결제를 건너뛰고 유료 결과물을 가져갈 수 있는가?
- AI가 내 비밀 키(secret keys)를 브라우저가 볼 수 있는 어딘가에 조용히 붙여넣지는 않았는가?
- 프로덕션(production) 환경에 여전히 살아있는 "결제 건너뛰기" 개발용 지름길이 있는가?
이것들은 당신을 조용히 죽이는 것들입니다. 극적인 해킹이 아니라, 사용자가 이것저것 건드려보다가 값 하나를 바꾸고, 당신이 잠든 사이에 유료 제품을 무료로 얻어가는 식입니다.
저를 놀라게 했던 부분
결제 경로는 견고했습니다.
가격은 서버에서 강제되었습니다. 클라이언트는 선택한 플랜이 무엇인지만 전송할 뿐, 금액을 절대 보내지 않으므로 조작할 수 있는 요소가 없습니다. 결제 프로세서(Payment processor)가 결제를 캡처한 후, 코드는 실제로 상태, 금액, 통화가 모두 올바른지 확인한 뒤에야 무언가를 전달했습니다. 유료 보고서를 잠금 해제하는 토큰은 암호학적으로 서명(Cryptographically signed)되어 있어 위조할 수 없습니다. 그리고 제가 걱정했던 그 "결제 건너뛰기(skip payment)" 지름길은요? 개발 환경(Development environment)에만 잠겨 있었습니다. 운영 환경(Production)에서는 단순히 꺼져 있었습니다.
저는 난장판이 될 것을 어느 정도 예상했지만, 그런 상황은 발견하지 못했습니다.
제가 일부러 이렇게 말하는 이유는, 대부분의 "AI 코드는 보안에 취약하다"라는 주장들이 가끔은 괜찮을 수도 있다는 부분을 생략하기 때문입니다. 만약 제가 모든 것이 망가졌다고 말했다면, 저는 보안 전문가들이 무언가를 팔기 위해 하는 행동, 즉 당신을 겁주는 행동을 하고 있었을 것입니다. 망가지지 않았습니다. 그것을 작성한 사람(저, 그리고 많은 AI)은 결제 경로를 제대로 구현했습니다. 인정할 건 인정해야 합니다.
그리고 바로 그 점이 두 가지 진짜 문제들을 흥미롭게 만들었습니다. 그것들은 제가 찾고 있던 곳에 있지 않았습니다.
실제로 저를 곤란하게 만들 뻔했던 두 가지
첫째: 저의 무료 기능이 제 청구 금액을 바닥낼 수 있었습니다.
이 앱에는 AI 모델을 호출하는 무료 단계가 있습니다. 이것은 사용자를 유입시키는 미끼(Hook) 역할을 합니다. 아무도 이를 마구 두들겨 댈 수 없도록 속도 제한(Rate-limited)이 걸려 있어야 합니다. 하지만 제한 장치(Limiter)를 주의 깊게 읽어보니 구멍이 있었습니다. 특정 인프라 구성이 정확하게 설정되지 않으면, 속도 제한이 강화되는 것이 아니라 아예 꺼져 버리는 구조였습니다. 제한이 전혀 없었습니다. 그리고 제한의 기준이 되는 요소는 요청을 보내는 사용자가 교체할 수 있었습니다.
번역하자면: 간단한 스크립트를 가진 누군가가 저의 무료 AI 기능을 반복해서 호출하여, 제가 AI 제공업체에 지불해야 하는 비용을 치솟게 만들 수 있다는 뜻입니다. 해킹도, 로그인도, 흔적도 없습니다. 그저 제 신용카드가 조용히 비어갈 뿐입니다.
둘째: 라이브 키(Live keys)로 가득 찬 백업 파일이 부주의한 압축 파일(Zip) 하나 차이로 유출될 뻔했습니다.
프로젝트 폴더 안에는 실제 라이브 키(Live keys)가 포함된 환경 설정 파일(environment file)의 "백업" 복사본이 놓여 있었습니다. 이 파일은 버전 관리(Version control) 대상에서 제외되어 있었기에 제 저장소(Repo)에 올라가지는 않았습니다. 하지만 프로젝트 폴더 안에 그대로 남아 있었기 때문에, 프로젝트를 공유하기 위해 압축(Zip)하거나 다른 곳으로 옮기는 순간 그 키들도 함께 따라가게 됩니다. 이것은 해킹이 아닙니다. 습관의 문제입니다. 그리고 그런 습관이 키를 있어서는 안 될 곳으로 흘러 들어가게 만듭니다.
제 기억에 강렬하게 남은 부분은 이것입니다: 스캐너(Scanner)는 이 두 가지 중 그 어느 것도 잡아내지 못했을 것입니다. 저 또한 자동화 도구들을 실행해 보았습니다. 한 가지 문제는 런타임 로직(Runtime logic) — 특정 조건에서 잘못된 방식으로 작동하는 제한기(Limiter)였습니다. 다른 하나는 습관 — 잘못된 위치에 있는 파일이었습니다. 도구들은 42번 라인에 하드코딩된 키(Hardcoded-key)와 같은 기계적인 작업에는 매우 뛰어납니다. 하지만 이 두 가지는 돈과 오용(Abuse) 경로를 실제로 읽어보며 "좋아, 그런데 이 부분이 없다면 어떻게 되지?"라고 질문할 수 있는 사람이 필요했습니다.
내가 확인하지 않은 것들
솔직히 말씀드리면: 이것은 완전한 침투 테스트(Penetration test)는 아니었습니다. 라이브 사이트를 공격하지도 않았고, 가장 긴 파일의 모든 줄을 읽지도 않았으며, 결제 프로세서(Payment processor) 계정 설정도 감사하지 않았습니다. 이것은 출시 전에 저에게 돈을 쓰게 하거나 데이터를 유출할 가능성이 가장 높은 부분들을 읽어본 것이지, 전체 시스템이 무결하다(Bulletproof)고 보증하는 인증서는 아닙니다.
두 가지 문제를 해결하는 데는 오후 한나절이 걸렸습니다. 그 백업 파일에 들어있던 키들을 교체(Rotating)하는 데는 10분이 걸렸습니다. 이제 이 서비스는 제가 밤잠을 설칠 걱정 없이 돈을 받을 수 있게 되었습니다.
만약 당신이 이런 것을 만들었다면
만약 당신이 AI로 만든 무언가를 출시했거나 출시할 예정이며, 그것이 결제를 처리하거나 API를 호출한다면, 다음 두 가지 유형은 스스로 확인해 볼 가치가 있습니다. 왜냐하면 이것들은 도구들이 침묵을 지키는 영역이기 때문입니다:
- 무료 AI 호출 기능에 Fail Closed (실패 시 차단) 방식의 속도 제한 (Rate Limit)이 적용되어 있습니까? 즉, 기능이 꺼져 있을 때 '무제한'이 아니라 '차단' 상태가 되어야 합니다. 그리고 이 제한이 사용자가 쉽게 바꿀 수 없는 요소에 기반하고 있습니까?
- 실제 키(Key)가 포함된 파일이 프로젝트 폴더 내에 있으며, 압축 파일 하나만으로 공공 장소에 노출될 위험이 있지는 않습니까?
제가 사용한 전체 체크리스트를 쉬운 영어로 이곳에 작성해 두었습니다: https://gist.github.com/haiyangr-cmyk/cd98502fa007b07d1807af1516f3e13a
만약 스캐너가 잡아내지 못하는 부분, 즉 금전적 손실과 남용 경로(money-and-abuse path)를 누군가가 대신 검토해 주길 원하신다면, 그것이 제가 현재 제공하는 서비스입니다. 여기에 답글을 남기거나 DM을 보내주시면 살펴보겠습니다.
어느 쪽이든, 무료 엔드포인트(Free-endpoint)를 확인하십시오. 그것은 조용히 찾아오며, AI로 구축된 앱을 가장 크게 괴롭히는 요소입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기