R2 3D Tiles 보안 — 전체 방식 분류 및 현황
Cloudflare R2에서 3D Tiles(GLB, b3dm)를 서빙할 때 사용할 수 있는 보안 방식의 전체 지도.
업데이트: 2026-04-06
핵심 요약
| 구분 | 내용 |
|---|
| 📖 정의 | R2 Object Storage 위에서 대량의 3D 타일 파일을 안전하게 서빙하기 위한 보안 아키텍처 선택지 |
| 💡 핵심 | 6가지 방식이 존재하며, Worker + R2 Binding + JWT 조합이 3D Tiles 서빙에 최적 |
| 🎯 대상 | 3D 타일링 파이프라인을 운영하며 R2에서 tileset을 서비스하는 개발자 |
| ⚠️ 주의 | API Key를 URL에 포함하거나 파일마다 Presigned URL을 발급하는 방식은 3D Tiles에 부적합 |
목차
- 문제 정의 — 왜 3D Tiles 보안이 특수한가
- 전체 보안 방식 분류
- 주요 방식 현황 테이블
- R2 비용 구조 기초
- 관련 표준 및 가이드라인
1. 문제 정의 — 왜 3D Tiles 보안이 특수한가
일반 API vs 3D Tiles 요청 패턴
일반 API 보안과 달리, 3D Tiles 서빙은 한 번의 씬 로드에서 수백~수천 개 파일이 동시에 요청되는 특수한 패턴을 가진다.
| 구분 | 일반 API | 3D Tiles 서빙 |
|---|
| 요청 패턴 | 1회 요청 → 1개 응답 | 1회 씬 로드 → tileset.json + 수백~수천 개 .b3dm/.glb 동시 요청 |
| 파일 수 | 소수 | 도시 모델 기준 수천~수만 개 |
| 동시성 | 낮음 | CesiumJS가 카메라 시점에 따라 병렬 요청 발행 |
| 트래픽 규모 | 예측 가능 | 사용자 10명 × 씬 전환 = 초당 수천 파일 요청 가능 |
기존 방식의 문제점
| 방식 | 문제 | 심각도 |
|---|
| URL에 API Key 포함 | 브라우저 히스토리, 네트워크 탭, 서버 로그에 키 노출 | 🔴 치명적 |
| 파일마다 Presigned URL 발급 | 서버 병목 + 클라이언트↔서버 왕복 지연 × 파일 수 | 🔴 치명적 |
[ Presigned URL 병목 흐름 ]
CesiumJS가 tile_0.b3dm 필요
→ 백엔드에 presigned URL 발급 요청 (왕복 1)
→ 백엔드가 URL 생성
→ 클라이언트가 R2에 실제 요청
↑ 이 과정이 파일 수만큼 반복
파일 1,000개 = 백엔드 왕복 1,000번 = 렌더링 지연 폭증
핵심 요구사항: API Key 노출 없이, 파일 수에 무관하게 일괄 인증이 가능한 방식이 필요하다.
2. 전체 보안 방식 분류
Cloudflare가 제공하는 R2 보안 방식은 크게 인증 프록시형, 토큰 서명형, 네트워크 제한형으로 나뉜다.
flowchart TD
ROOT["R2 3D Tiles 보안 방식"]
ROOT --> AUTH["인증 프록시형"]
ROOT --> SIGN["토큰 서명형"]
ROOT --> NET["네트워크 제한형"]
AUTH --> A["A. Worker + R2 Binding<br/>(JWT Auth Proxy)"]
AUTH --> B["B. Cloudflare Access<br/>(Zero Trust)"]
SIGN --> C["C. R2 Presigned URL<br/>(S3 호환)"]
SIGN --> D["D. Worker HMAC<br/>Signed URL"]
NET --> E["E. Public Bucket<br/>+ WAF/Rate Limiting"]
NET --> F["F. Cloudflare Tunnel<br/>+ Private Network"]
A -.- A1["R2 비공개 유지<br/>Worker가 내부 바인딩으로 접근<br/>JWT 1개로 전체 타일 인증"]
B -.- B1["대시보드 설정만으로 구현<br/>Service Token 또는 IdP 연동"]
C -.- C1["파일마다 개별 URL 서명<br/>3D Tiles에 부적합"]
D -.- D1["URL 쿼리에 HMAC 서명<br/>헤더 불가 환경에 유용"]
E -.- E1["버킷 공개 + WAF로 보호<br/>보조 레이어로만 활용"]
F -.- F1["WARP 클라이언트 필요<br/>내부 접근 전용"]
style A fill:#2d6a4f,color:#fff
style C fill:#d32f2f,color:#fff
방식별 인증 구조 비교
| 구분 | R2 버킷 상태 | 인증 위치 | 인증 수단 | 파일별 처리 |
|---|
| A. Worker JWT | 비공개 | Worker (엣지) | JWT 헤더 | 불필요 (토큰 1개) |
| B. Access | 공개 (Access가 보호) | Cloudflare 엣지 | Service Token / 쿠키 | 불필요 |
| C. Presigned URL | 비공개 | URL 서명 | S3 서명 파라미터 | 필요 (파일마다) |
| D. HMAC Signed | 비공개 | Worker (엣지) | URL 쿼리 HMAC | prefix 단위 가능 |
| E. WAF | 공개 | Cloudflare WAF | IP/Referer/Rate | 불필요 |
| F. Tunnel | 비공개 | WARP 클라이언트 | 디바이스 인증 | 불필요 |
3. 주요 방식 현황 테이블
| 방식 | 권장도 | 3D Tiles 적합성 | 월 비용 | 코드 필요 | 주요 사용 사례 |
|---|
| A. Worker + R2 Binding (JWT) | ★★★★★ | 최적 | 0 5 | 예 (Worker) | B2B SaaS, 다중 프로젝트 |
| B. Cloudflare Access | ★★★★☆ | 적합 | 0(50명)/7·인 | 아니오 | 소규모 팀, 내부 뷰어 |
| C. R2 Presigned URL | ★★☆☆☆ | 부적합 | 무료 tier 소진 위험 | 예 (서버) | 단일 파일 다운로드 전용 |
| D. Worker HMAC Signed URL | ★★★★☆ | 적합 | 0 5 | 예 (Worker) | iframe, 헤더 불가 환경 |
| E. Public + WAF | ★★★☆☆ | 보조 레이어 | $0 (제한적) | 아니오 | 기본 보호 + 다른 방식 보완 |
| F. Tunnel + WARP | ★★★☆☆ | 내부 전용 | $0 (50명) | 아니오 | 개발/스테이징 환경 |
기술 의존성
| 방식 | 필요 서비스 | 추가 라이브러리 | 외부 서버 필요 |
|---|
| A | Workers, R2 | jose (JWT) | JWT 발급 서버 |
| B | Access, R2 | 없음 | 없음 |
| C | R2 (S3 API) | @aws-sdk/client-s3 | Presigned URL 발급 서버 |
| D | Workers, R2 | 없음 (crypto.subtle 내장) | 서명 URL 발급 서버 |
| E | WAF, R2 | 없음 | 없음 |
| F | Tunnel, WARP | 없음 | cloudflared 데몬 |
4. R2 비용 구조 기초
R2의 가장 큰 특징은 Egress 비용이 $0이라는 점이다. 대용량 3D 타일 파일을 서빙해도 데이터 전송 비용이 발생하지 않는다.
| 항목 | 무료 Tier | 초과 단가 |
|---|
| 스토리지 | 10 GB/월 | $0.015/GB/월 |
| Class A Operations (PutObject 등) | 1,000,000건/월 | $4.50/100만 건 |
| Class B Operations (GetObject 등) | 10,000,000건/월 | $0.36/100만 건 |
| Egress (외부 전송) | 무제한 | $0 |
Workers 비용
| 항목 | 무료(Free) | Standard ($5/월) |
|---|
| 요청 수 | 100,000건/일 | 10,000,000건/월 포함 |
| CPU 시간 | 10ms/요청 | 30,000,000 ms/월 포함 |
| 초과 요금 | 서비스 중단 | $0.30/100만 건 |
Cloudflare Access 비용
| 플랜 | 사용자 수 | 비용 |
|---|
| Free | 최대 50명 | $0 |
| Pay-As-You-Go | 무제한 | $7/사용자/월 |
| Enterprise | 무제한 | 별도 계약 |
5. 관련 표준 및 가이드라인
| 표준/가이드 | 관련 내용 | 비고 |
|---|
| OWASP API Security Top 10 | API 키 노출 방지, 인증 설계 | API Key in URL은 OWASP 위반 |
| OGC 3D Tiles 1.1 | 타일셋 구조 및 HTTP 기반 서빙 스펙 | 인증 방식은 미지정 (구현체 자유) |
| RFC 7519 (JWT) | JSON Web Token 표준 | 방식 A에서 사용 |
| RFC 2104 (HMAC) | Hash-based Message Authentication Code | 방식 D에서 사용 |
| Cloudflare Zero Trust | 기업용 접근 제어 프레임워크 | 방식 B, F에서 사용 |
문서 탐색
참고 자료