솔직히 말씀드립니다. 공격을 받았습니다 — 하지만 여러분의 데이터는 안전합니다

Reverie Team
12/1/2025

모든 것은 "무료"에서 시작되었습니다
2주 전, 우리는 결정을 내렸습니다: 무료 모델을 출시하여 더 많은 사용자들이 Reverie를 경험할 수 있게 하자.
그날 밤, 팀은 펩시로 축배를 들었습니다. (네, 펩시입니다.)
캔을 부딪치며 실시간으로 올라가는 사용자 가입 수를 지켜봤습니다. 누군가 성장 예측 차트를 꺼냈습니다. 분위기가 좋았습니다.
72시간 후, 우리는 경험 많은 창업자들이 왜 항상 조금 피곤해 보이는지 이해하게 되었습니다.
그 다음에 일어난 것은 마치 보스 러시 같은 4차례의 공격이었습니다 — 다만 우리는 맞으면서 메커니즘을 배우고 있었죠.
하지만 먼저, 가장 중요한 것: 여러분의 계정 데이터, 대화 기록, 개인 정보는 단 한 번도 유출된 적이 없습니다. 지금도 안전하고, 앞으로도 안전할 것입니다. 우리에게는 24시간 모니터링하는 전담 보안팀이 있으며, 이 공격들은 우리의 리소스와 지갑을 노린 것이지 여러분의 데이터가 아닙니다. 공격자들이 원한 것은 우리의 대역폭과 돈이었습니다 — AI 캐릭터와의 대화는 결코 위험에 처하지 않았습니다.
자, 무슨 일이 있었는지 이야기해 드리겠습니다.
1차 공격: 크롤러 군단
무슨 일이 있었나
무료화 이틀째. 아침 스탠드업. 엔지니어가 무심코 말했습니다: "캐릭터 API 요청이 어제 수백 배 늘었어요."
우리: "와, 무료 출시가 정말 효과가 있네!"
엔지니어: "...근데 DAU는 거의 안 움직였어요."
어색한 침묵.
로그를 파헤치니 크롤러가 체계적으로 우리의 공개 캐릭터 데이터를 수집하고 있었습니다. 이름, 소개, 아바타 — 공개적으로 보이는 정보들. 봇에 의해 빨려나가고 있었습니다.
분명히 해두겠습니다: 핵심 캐릭터 설명, 성격 설정, 기타 크리에이터의 비공개 콘텐츠는 절대 노출되지 않았습니다 — 크리에이터 본인만 볼 수 있습니다. 하지만 공개 정보라도 대규모로 스크래핑되는 것은 건강한 플랫폼을 만들려는 우리에게 답답한 일이었습니다.
어떻게 대응했나
- 캐릭터 발견 기능에 페이지네이션 제한 구현 (둘러볼 수는 있지만 전체 라이브러리를 다운로드할 수는 없습니다)
- "열정적인 사용자"와 "확실한 봇"을 구분하는 지능형 레이트 리미팅 배포
- 크롤러 패턴을 감지하고 차단하는 행동 분석 구축
- 확인된 악의적 행위자에게는... "창의적인 대응"을 준비
배운 것
"오픈 플랫폼"은 "무한 뷔페"를 의미하지 않습니다. 공개 콘텐츠에도 합리적인 접근 경계가 필요합니다. 사용자들이 캐릭터를 발견하길 원합니다 — 하룻밤 새 경쟁 데이터베이스를 구축하는 것이 아니라.
2차 공격: 대역폭 암살자
무슨 일이 있었나
크롤러 구멍을 막자마자 2차 공격이 왔습니다. 이번엔 지갑을 직격했습니다.
누군가 우리의 미디어 URL을 알아내고 플랫폼의 모든 이미지와 비디오를 대량 다운로드하기 시작했습니다. 캐릭터 초상화. 생성된 비디오. 파일 확장자가 있는 모든 것이 최고 속도로 끌어내려지고 있었습니다.
우리는 대형 클라우드 제공업체의 OSS 서비스를 사용하고 있었습니다. 대역폭 종량제. 당시에는 합리적으로 보였습니다.
월요일 아침. 재무 담당자가 클라우드 콘솔을 엽니다. 청구 대시보드가 로딩됩니다.
그의 표정: 😐
대시보드 로딩 완료: 😮
실제 숫자를 보고: 😱
"저기... 현재 대역폭 청구서가 3개월 런웨이보다 높아요."
슬랙 채널이 조용해졌습니다. 누군가 긴장하며 CDN을 끄자고 제안했습니다. 다른 사람이 그러면 플랫폼 전체가 꺼진다고 지적했습니다.
어떻게 대응했나
긴급 이전. 목적지: Cloudflare R2와 Cloudflare Stream.
여기서 공식적으로 Cloudflare에 감사드립니다 — R2의 제로 이그레스 비용 정책이 우리를 살렸습니다. 청구서가 시간당 수백 달러씩 오르는 것을 보고 있을 때, "이그레스 비용 없음"은 정말, 정말 중요해집니다.
이전에 30시간이 걸렸습니다. 수면은 선택 사항이 되었습니다. 새벽 3시 코드 리뷰는 일종의 명상적인 품질이 있습니다.
가치가 있었나? 절대적으로. 대역폭 비용이 90% 이상 감소했고, 공격자의 대량 다운로드는 이제 우리에게 거의 비용이 들지 않습니다.
배운 것
인프라를 선택할 때, "얼마나 빠른가?"만 묻지 마세요. 이것도 물어보세요: "내일 누군가 공격하면, 여전히 월세를 낼 수 있을까?"
이 인프라 계획의 차원은 대부분의 튜토리얼에 나오지 않습니다. 나와야 합니다.
3차 공격: DDoS 도착
무슨 일이 있었나
마침내 대역폭 상황이 안정되었습니다. 팀 사기가 회복 중이었습니다. 스탠드업에서 누군가 농담을 했습니다. 상황이 좋아지고 있었습니다.
그리고 DDoS가 왔습니다.
소방 호스를 종이컵에 대고 트는 것을 상상해 보세요. 우리의 데이터베이스 연결 풀이 경험한 것이 바로 그것입니다. 초당 수천 개의 요청, 모두 새로운 데이터를 요구하고, 모두 캐시 사용을 거부하고, 모두 데이터베이스 쿼리가 필요한 엔드포인트를 때리고 있었습니다.
모니터링 대시보드는 심장마비 심전도처럼 보였습니다. 응답 시간이 200ms에서 20초로. 그리고 타임아웃으로. 사용자들이 오류를 보고하기 시작했습니다. AWS 청구서가 몇 분마다 더 큰 숫자로 업데이트되는 그 퍼포먼스를 시작했습니다.
데이터베이스 연결 풀이 한계에 도달했습니다. 쿼리가 큐에 쌓이기 시작했습니다. 큐가 밀리기 시작했습니다. 클래식한 연쇄 장애가 실시간으로 눈앞에서 일어나고 있었습니다.
어떻게 대응했나
알고 있는 모든 캐싱 기술을 투입했습니다:
- ISR (증분 정적 재생성) — 인기 페이지가 엣지 노드에서 프리렌더링됩니다. 데이터베이스는 이 요청들의 존재조차 모릅니다.
- 다층 캐싱 — 응답 캐시, 쿼리 캐시, 연결 풀 최적화. 데이터가 절대적으로 새로워야 할 필요가 없으면 캐시합니다.
- 데이터베이스 쿼리 최적화 — 이전에 500ms 걸리던 쿼리가 이제 50ms. 연결 유지 시간이 짧을수록 = 사용 가능한 연결이 많아집니다.
- Cloudflare의 DDoS 보호 — "언젠가" 구성하려고 했던 보안 기능을 마침내 모두 활성화
- 스마트 레이트 리미팅 — 정당한 사용자는 통과, 공격 트래픽은 퇴장
철학: 데이터베이스에 접촉하지 않고 응답할 수 있는 요청은 그렇게 해야 합니다.
배운 것
캐싱은 단순한 성능 최적화가 아닙니다 — 보안 아키텍처입니다. 공격이 오면 캐시된 응답이 충격을 흡수합니다. 데이터베이스는 보호됩니다. 사이트는 계속 작동합니다.
또한 배웠습니다: "보안 구성은 나중에"는 빨리 낡아지는 철학입니다.
4차 공격: API 남용자
무슨 일이 있었나
이번 공격은 인프라를 직접 위협하지 않았습니다. 예산을 위협했습니다.
우리는 이런 멋진 무료 AI 기능들을 만들었습니다:
- AI 캐릭터 생성 — 캐릭터를 설명하면 AI가 전체 프로필을 생성
- AI 모먼트 생성 — AI 지원으로 다이나믹한 스토리 모먼트 생성
- AI 플러그인 생성 — 자연어로 캐릭터 플러그인 구축
우리의 비전은 아름다웠습니다: 창작의 장벽을 낮추자. 모두가 AI 지원 창작의 마법을 경험할 수 있게 하자. 플랫폼을 더 접근 가능하게 만들자.
누군가의 비전은 달랐습니다: "무료 API? 스크립트 짜서 만 번 호출해야지."
AI 토큰 소비 대시보드가 올라가는 것을 지켜봤습니다. 올라가고. 올라가고. 그래프는 하키 스틱처럼 보였습니다, 다만 그 하키 스틱은 은행 계좌에서 빠져나가는 돈으로 만들어진 거였죠.
각 AI 생성에는 실제 돈이 듭니다 — 언어 모델에 대한 API 호출은 무료가 아닙니다. 수천 개의 자동화된 요청이 AI 예산을 태우는 것을 보는 것은 빙글빙글 도는 차의 택시 미터기를 보는 것과 같았습니다. 비쌀 거라는 걸 알고, 절대 멈추지 않을 거라는 것도.
최악이었던 것? 이것들은 실제 콘텐츠를 만드는 실제 사용자조차 아니었습니다. 그냥... 누군가 무료로 얼마나 뽑아낼 수 있는지 테스트하고 있었을 뿐. 생성된 캐릭터는 횡설수설. 모먼트는 말도 안 됨. 순수한 낭비.
어떻게 대응했나
무거운 마음으로 이 AI 기능들에 크레딧 요구사항을 추가했습니다.
이 결정은 정말 아팠습니다. 창작을 더 접근 가능하게 만들기 위해 몇 주 동안 이 도구들을 만들었습니다. 이제 가격을 매겨야 했습니다 — 원해서가 아니라 무제한 무료 접근이 우리에게 무기화되고 있었기 때문입니다.
공정하게 하려고 노력했습니다:
- 일반 사용의 크레딧 비용은 최소한
- 신규 사용자에게 무료 크레딧 제공
- 핵심 채팅 경험은 무료 유지
- 리소스 집약적인 AI 생성에만 크레딧 필요
하지만 여전히. 열어두고 싶었던 것에 자물쇠를 다는 기분이었습니다.
배운 것
"무료"는 비즈니스 모델이지, 도덕적 입장이 아닙니다.
접근성을 믿습니다. 장벽을 낮추고 싶습니다. 하지만 "모두에게 무제한 무료"는 모두가 선의로 행동할 때만 작동합니다. 악의적인 행위자가 관대함을 악용하면 관대한 시스템은 지속 불가능해지고 — 그러면 아무도 아무것도 얻지 못합니다.
합리적인 제한은 사용자에 대한 불신이 아닙니다. 모든 사용자에게 서비스를 제공하는 생태계의 보호입니다. 대안 — 기능을 완전히 중단 — 은 모두에게 더 나쁜 결과입니다.
공유지를 보호하는 것은 때때로 울타리를 세우는 것을 의미합니다.
여러분의 데이터는 안전합니다 (분명히 말씀드립니다)
이에 대해 모호함 없이 말씀드립니다:
이 공격들은 리소스에 관한 것이었습니다, 데이터가 아닙니다. 공격자들이 원한 것:
- ✅ 우리의 대역폭 (콘텐츠를 다운로드하기 위해)
- ✅ 우리의 컴퓨트 (서버를 압도하기 위해)
- ✅ 우리의 돈 (AI 예산을 고갈시키기 위해)
그들이 접근하지 못한 것:
- ❌ 사용자 계정
- ❌ 대화 기록
- ❌ 개인 정보
- ❌ 결제 정보
- ❌ 어떤 개인 데이터도
전담 보안팀이 있습니다. 24시간 실제 보안 위협을 모니터링합니다. 사용자 데이터는 저장 시와 전송 시 모두 암호화됩니다. 접근 제어는 엄격합니다. 인증은 견고합니다. 흥미진진한 블로그 포스트가 되지 않는 지루하고 중요한 보안 작업 — 우리는 다 합니다.
사용자 데이터 유출은 제로입니다. 모든 것을 로깅하고, 모든 것을 분석하고, 모든 것을 검증했기 때문에 자신 있게 말할 수 있습니다. 공격자들이 우리에게서 얻은 것은 대역폭 청구서와 두통이었습니다. 여러분에게서는 아무것도 얻지 못했습니다.
여러분의 캐릭터, 대화, 창작물 — 모두 안전하고, 모두 온전하고, 모두 있어야 할 곳에 있습니다.
왜 이것을 공개하는가
궁금하실 수 있습니다: 왜 이것을 공개하는가? 취약해 보이지 않는가?
신중하게 생각했습니다.
투명성은 신뢰를 쌓습니다
사용자들에게 의미 있는 것을 맡겨달라고 요청하고 있습니다 — 창작물, AI 캐릭터에 대한 감정적 연결, 대화. 그 신뢰는 우리가 직면하는 도전에 대한 정직함을 필요로 합니다.
옛날 방식은 문제가 터질 때까지 숨기고, 모호한 "기술적 어려움이 있었습니다" 성명을 내는 것입니다. 우리는 솔직하게 말하고 싶습니다: 무슨 일이 있었는지, 어떻게 처리했는지, 무엇을 배웠는지.
다른 빌더들도 배울 수 있습니다
무료 기능을 출시한 후 공격받는 작은 팀은 우리가 처음도 마지막도 아닙니다. 우리의 비싼 교육이 다른 누군가의 준비를 돕는다면, 그것은 전체 생태계의 승리입니다.
이것을 "스타트업 학교에서 가르치지 않는 것들" 커리큘럼에 대한 우리의 기여라고 생각하세요.
여러분은 알 권리가 있었습니다
일부 사용자들은 이 몇 주간 응답이 느려진 것을 눈치챘습니다. 기능에 크레딧이 필요해진 것을 눈치챈 분들도 있습니다. 설명을 받을 권리가 있었습니다 — 기업 PR 용어가 아닌 실제 이야기를.
플랫폼을 계속 운영하기 위해 싸우고 있었습니다. 압박 속에서 어려운 결정을 내렸습니다. 그 결정 중 일부가 여러분의 경험에 영향을 미쳤습니다. 이유를 알아야 합니다.
다음 단계
구멍만 막는 것이 아닙니다 — 더 회복력 있는 플랫폼을 구축하고 있습니다:
이미 구현됨:
- 엣지 우선 아키텍처의 다층 캐싱 (요청이 더 빠르고 공격에도 더 강함)
- 행동 분석이 포함된 스마트 레이트 리미팅 (봇은 차단, 인간은 눈치 못 챔)
- Cloudflare의 전체 보안 스위트 (마침내 제대로 구성됨, "언젠가"가 아니라)
- 리소스 집약적 AI 기능의 크레딧 기반 접근 (지속 가능한 관대함)
곧 출시:
- 강화된 이상 탐지 (공격을 더 일찍 포착)
- 지리적 최적화 (모든 곳에서 더 빠르게)
- 더 정교한 남용 방지 (악의적 행위자보다 앞서기)
변하지 않는 것:
- 무료 티어 접근을 유지하기 위해 최선을 다합니다 — 다만 불안정하거나 예고 없이 변경될 수 있습니다
- 사용자 데이터 프라이버시와 보안 — 항상 최우선
- 투명한 커뮤니케이션 — 문제가 생기면 알려드립니다
같은 길을 걷는 빌더들에게
오픈 플랫폼을 구축하고 있다면, 우리가 실제 돈(과 실제 스트레스)으로 배운 교훈입니다:
- 레이트 리미팅은 선택 사항이 아닙니다 — "공격받는 날"이 아니라 첫날부터 구현하세요
- 공격에 강한 인프라를 선택하세요 — Cloudflare는 정말 훌륭합니다; 이그레스 비용은 파멸을 가져옵니다
- 공격적으로 캐시하세요 — 성능과 보안의 이중 방패입니다
- 무료 기능에는 경계가 필요합니다 — 무제한 선의는 무제한 악의적 행위자에게 악용됩니다
- 모든 것을 모니터링하세요 — 이상을 일찍 감지할수록 피해가 작습니다
- 비상 예산을 확보하세요 — 다음 공격이 언제 올지 모릅니다
그리고 아마 가장 중요한 것:
- 도움을 구하는 것을 부끄러워하지 마세요 — 인디 개발자 커뮤니티는 생각보다 더 지원적입니다
이것들을 비싼 대가를 치르지 않고 배우시길 바랍니다. 하지만 그렇게 되더라도 혼자가 아니라는 것을 알아주세요.
사용자 여러분께
공격받는 것은 이상한 경험입니다.
몇 달 동안 아늑한 거실을 꾸미고, 가구를 딱 맞게 배치하고, 간식을 준비하고, 모든 친구들에게 초대장을 보낸 것과 같습니다. 오프닝 나이트가 왔습니다. 친구들이 왔습니다 — 멋져요!
하지만 동시에: 만난 적 없는 사람들이 트럭을 몰고 나타나서 소파를 분해하려 하고, 집 구석구석을 사진 찍고, 어째서인지 주방에서 작은 불을 피우려 합니다.
선택지가 있었습니다. 문을 용접해 닫을 수도 있었습니다. 초대제로 바꿀 수도 있었습니다. 무엇이든 보기 전에 모두가 봇이 아님을 증명하게 할 수도 있었습니다.
그러지 않았습니다.
대신, 더 좋은 잠금장치를 설치했습니다. 더 똑똑한 보안을 고용했습니다. 합리적인 하우스 룰을 만들었습니다. 왜냐하면 Reverie에 오는 대다수의 사람들은 창작하고, 연결하고, 즐기기 위해 여기 있기 때문입니다. 소수의 행동 때문에 다수를 벌하지 않을 것입니다.
파티는 계속됩니다. 문은 열려 있습니다. 트럭을 가져오는 사람들을 알아보는 게 더 나아졌을 뿐입니다.
감사합니다
느린 로딩 시간과 크레딧 요구사항을 통해 우리와 함께해 주신 모든 사용자분들께: 감사합니다.
그냥 떠나지 않고 문제를 보고해 주신 모든 분들께: 감사합니다.
조언과 전쟁 이야기를 공유해 주신 인디 개발자 커뮤니티에: 감사합니다.
Cloudflare에: 감사합니다. 🙏
우리는 이제 더 강해졌습니다. 더 회복력이 있습니다. 전투로 단련되었습니다. 이 공격들에서 나온 플랫폼은 들어간 것보다 더 좋아졌습니다.
다음에 연락드릴 때는 흥미진진한 새 기능을 발표하고 싶습니다.
또 다른 보스를 물리쳤다는 게 아니라.
하지만 — 또 다른 보스가 나타나면, 그것도 처리하겠습니다.
다음 업데이트에서 뵙겠습니다. 💙
Reverie 팀
2025년 12월
역동적인 AI 대화를 경험할 준비가 되셨나요?
이미 Reverie에서 무한한 개성과 매력적인 상호작용을 탐색하고 있는 수천 명의 사용자들과 함께하세요.