- TablePlus는 몇 주째 이어진 DDoS 시도에도 IP 차단이나 Cloudflare “Under Attack” 모드 없이 서버 상태를 관찰하고 있음
- 최근 30일 설치 파일 다운로드 시도는 약 600만 회, 최근 5일만 800,126회였으며 파일 크기는 다운로드당 약 200MB임
- 공격 중에도 서버 CPU 사용률은 대부분 0~1% 에 머물렀고, 8개가량의 API 서비스와 데이터베이스가 캐시 없이 월 수십억 요청을 처리할 수 있게 구성돼 있음
- 백엔드는 앱별 모놀리식 서비스로 묶고, Docker·Kubernetes·런타임 환경 없이 단일 바이너리를 새 VPS에 배포하는 방식을 사용함
- Go/Rust 프레임워크, 데이터베이스 인덱싱, 로그 DB 분리, Nginx 리버스 프록시, Cloudflare CDN/R2, 메일 발송 throttling 같은 단순한 구성이 공격 비용과 운영 복잡도를 낮춤
몇 주간 이어진 DDoS 시도
- 누군가 TablePlus 서버에 몇 주 동안 수억 건의 요청을 보내고 설치 파일을 수백만 번 다운로드하려고 시도함
- 설치 파일 다운로드 시도는 최근 5일 동안 800,126회, 최근 30일 기준 약 600만 회에 달함
- 설치 파일 크기는 다운로드당 약 200MB
- 최근 30일 API 호출 기준으로 트래픽 대부분은 EU, 특히 Germany와 United Kingdom에서 발생함
- 이 수치는 다운로드 요청과 CDN 트래픽을 포함하지 않음
- 글 작성 시점에도 공격은 계속 진행 중임
실제 대응: 차단보다 버티는 구조
- 공격자 IP 주소를 차단하지 않음
- Cloudflare를 사용하지만 “Under Attack” 모드는 켜지 않음
- 공격 중에도 서버 CPU는 대부분 0~1% 수준으로 거의 유휴 상태임
- 서비스가 월 수십억 요청을 문제없이 처리할 수 있고 비용 부담도 크지 않아 별도 조치를 거의 하지 않음
단순한 백엔드 설계
- TablePlus 앱 설계는 단순함을 지향하며, 백엔드 서비스도 가능한 한 최소 구성으로 유지함
- Vercel이나 Netlify 같은 서드파티 렌더링 서비스는 공격 중 병목이나 예상치 못한 청구서를 만들 수 있어 사용하지 않음
- 자체 웹서버를 쓰면 이런 제한을 피할 수 있다고 봄
- 과거에는 약한 VPS와 프로세서 때문에 모놀리스가 병목이 될 수 있었지만, 현재 VPS는 멀티코어 CPU, 큰 RAM, 빠른 SSD를 제공함
- 빠른 SSD와 RAM은 데이터베이스 성능을 크게 높임
- 올바르게 구현하면 단일 인스턴스의 모놀리스 서비스도 월 수십억 요청을 처리할 수 있음
앱별 모놀리스 운영 방식
- 각 앱에 필요한 API, 웹사이트, 이메일, 결제 등을 하나의 서비스로 통합함
- 배포는 설정 파일 하나, 빌드, 배포만으로 끝남
- 다른 클라우드 벤더로 서비스를 이전하거나 새로 배포할 때 빠르게 처리할 수 있음
- 의존성이 적어 디버깅과 병목 식별이 쉬움
- 오류가 발생해도 확인해야 할 서비스가 하나이거나 소수에 그침
- 선택 가능한 모놀리스 프레임워크 예시는 다음과 같음
- Golang: Echo, Gin
- PHP: Laravel
- Ruby: Rails
- Rust: Actix, Rocket, Warp
월 수십억 요청을 위한 구성 원칙
- 고성능 웹 프레임워크를 선택하며, TablePlus는 Golang과 Rust를 선호함
- 데이터셋이 커질수록 조회 시간을 줄이기 위해 데이터베이스에 인덱스를 설정함
- 핵심 비즈니스 성능을 보호하기 위해 주 데이터베이스와 로그·사용량 데이터베이스를 분리함
- 주 데이터베이스는 변하지 않거나 시간이 지나도 크기가 늘지 않는 데이터용
- 로그·사용량 데이터베이스는 시간이 지나며 계속 커지는 데이터용
- 핵심 API 앞단에는 리버스 프록시를 두어 요청을 처리하고 분산함
- 여러 서버가 필요한 경우 도움이 됨
- TablePlus는 Nginx를 사용함
- 모든 것을 Cloudflare 뒤에 두고 캐시, Argo, Cloudflare와 서버 간 full SSL을 적절히 설정함
- DDoS 보호가 있는 CDN을 사용함
- TablePlus는 비용 절감과 보호를 위해 Amazon CloudFront + S3보다 Cloudflare R2와 CDN을 선호함
- 큰 다운로드 파일을 CDN이나 캐싱 없이 VPS에 두면 대역폭을 빠르게 소모함
- TablePlus는 무제한 대역폭의 Cloudflare CDN을 사용함
- 같은 도메인에서 Argo를 활성화하면 Cloudflare CDN 트래픽이 Argo를 거칠 수 있고, Argo 대역폭은 무료가 아니므로 비용이 커질 수 있음
- 비밀번호 찾기처럼 서버에서 이메일을 보내야 하는 요청은 throttling으로 메일러를 보호함
배포 방식: 컨테이너 없이 바이너리 실행
- TablePlus는 Docker, Kubernetes, 컨테이너, 별도 런타임 환경 설정 없이 배포 과정을 최대한 단순하게 유지함
- 배포 단위는 바이너리임
- Linux 서버에 복사한 뒤 프로세스로 실행함
- macOS에서 TablePlus 앱을 실행하는 방식과 비슷하게 다룸
- Linux Systemctl이 프로세스를 감시하고 치명적 오류가 발생하면 재시작하도록 맡길 수 있음
- VM, 가상화, 서드파티 인프라 관리자 같은 중간 계층에 CPU/RAM을 낭비하지 않기 위해 네이티브 방식으로 실행함
- Go와 Rust는 고성능 언어이며 배포용 바이너리 파일을 생성할 수 있어 선택함
Vercel 사용 시 켜둘 보호 기능
- Vercel은 이런 상황에서 사이트를 보호하는 기능으로 Spend Management와 Attack Challenge Mode를 제공함
- Spend Management: soft 또는 hard 지출 한도를 설정할 수 있음
- Attack Challenge Mode: Cloudflare의 “Under Attack” 모드와 유사함
- Vercel을 사용한다면 해당 기능을 켜두는 것이 필요함