Cloudflare R2 vs AWS S3 비용 비교 2026 | 이그레스 무료·VAT 포함 실비용 계산
Cloudflare R2는 이그레스 비용이 없어 이미지·영상 서비스에서 AWS S3보다 6~7배 저렴할 수 있다. 스토리지 단가·GET 요청·PUT 요청·CDN 포함 실비용을 한국 VAT 기준으로 계산하고, S3 API 호환성·마이그레이션 방법·한국 컴플라이언스 주의사항까지 비교 정리한다.
AWS S3에서 데이터를 내보낼 때마다 요금이 붙는 걸 처음 실감한 건 청구서를 보고 나서였다. 이미지 서비스를 한 달 돌리니 S3 스토리지 요금보다 이그레스(데이터 전송) 요금이 두 배 더 나왔다.
Cloudflare R2는 이그레스 요금이 없다. 그게 전부는 아니다. 가격 구조, API 호환성, 성능, 한국에서의 실제 사용성까지 비교해야 어떤 상황에 어떤 선택이 맞는지 판단할 수 있다. 이 글은 S3를 쓰고 있거나, 오브젝트 스토리지를 처음 선택하는 한국 개발자를 기준으로 두 서비스를 비교한다.
요금 구조 비교 | S3 vs R2 기본 단가
아래는 2026년 기준 요금이다. 환율 변동에 따라 달라지므로 최신 공식 가격 페이지를 함께 참고한다. 모두 달러 기준이며, 한국에서 사용 시 VAT 10%가 추가된다.
항목
AWS S3 (ap-northeast-2 서울)
Cloudflare R2
스토리지
$0.025/GB/월
$0.015/GB/월
이그레스 (외부 인터넷)
$0.09~0.13/GB
무료
GET 요청
$0.0004/1,000건
$0.0036/1,000,000건 (1M까지 무료)
PUT/POST 요청
$0.005/1,000건
$4.50/1,000,000건 (1M까지 무료)
CloudFront/CDN
별도 CloudFront 요금 필요
R2 Public 또는 Cloudflare CDN 무료 포함
무료 티어
5GB/월 (12개월)
10GB/월 (영구)
숫자만 보면 R2가 거의 모든 항목에서 저렴하다. 하지만 실제 청구 구조는 이그레스 요금에서 가장 크게 갈린다. 이미지·영상 서비스처럼 많은 데이터를 사용자에게 내보내는 구조라면 S3 요금의 상당 부분이 이그레스다.
R2는 스토리지·요청 단가 모두 S3보다 낮고, 특히 이그레스가 무료라는 점에서 차이가 크다
이그레스 비용 차이 | 한국 서비스 기준 실비용 계산
이미지 중심 서비스(평균 이미지 1장 200KB, 월 방문자 10만 명, 페이지당 평균 이미지 5장)를 기준으로 계산한다.
이 규모에서 R2가 약 6~7배 저렴하다. 트래픽이 늘수록 이 차이는 선형으로 커진다. 스토리지 위주이고 외부 노출이 거의 없는 백업용이라면 차이가 크지 않다.
VAT 주의: 한국 사업자가 AWS 또는 Cloudflare를 사용하면 부가가치세 10%가 추가된다. 스타트업 초기에 해외 카드로 결제하면 VAT 없이 나오지만, 사업자 등록 후 세금계산서를 받으려면 한국 결제 수단이 필요하다. 두 서비스 모두 한국 VAT 처리를 지원한다.
성능 비교 | 지연시간·처리량·한국 리전
성능 비교는 사용 패턴과 CDN 설정에 따라 크게 달라지므로 일반화가 어렵다. 다만 구조적 차이는 명확하다.
항목
AWS S3 (서울)
Cloudflare R2
리전
ap-northeast-2 (서울 직접 리전)
리전 없는 글로벌 분산 (Automatic Jurisdiction)
CDN 없을 때 지연
서울→서울: 20~50ms
가장 가까운 CF 노드 (서울 있음): 10~40ms
CDN 포함
S3 + CloudFront 별도 설정 필요
R2 Public URL이 자동으로 CF CDN 경유
대용량 파일 업로드
멀티파트 업로드 직접 구현 또는 SDK
멀티파트 API 동일, 최대 파일 크기 5TB
SLA
99.99% 가용성
99.9% SLA (공식 문서 기준)
S3 서울 리전은 한국 서버에서 업로드·다운로드할 때 지연이 낮다. 반면 R2는 Cloudflare의 글로벌 네트워크를 타기 때문에 CDN 없이도 사용자 가까운 곳에서 서빙되는 구조다. 단, 서울 사용자끼리만 있는 서비스라면 S3 서울 리전이 좀 더 예측 가능하다.
월 100GB 트래픽 기준 S3 약 24,300원 vs R2 약 3,800원(VAT 포함, 한화 기준)
S3 API 호환성 | 기존 코드 그대로 쓸 수 있나
R2는 S3 API를 지원한다. AWS SDK를 그대로 써서 endpoint만 바꾸면 대부분 동작한다.
AWS SDK v3 — R2 endpoint로 전환
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'
// S3 기존 설정
const s3 = new S3Client({ region: 'ap-northeast-2' })
// R2 전환 — endpoint와 credentials만 바꾼다
const r2 = new S3Client({
region: 'auto', // R2는 리전이 auto
endpoint: `https://${process.env.CLOUDFLARE_ACCOUNT_ID}.r2.cloudflarestorage.com`,
credentials: {
accessKeyId: process.env.R2_ACCESS_KEY_ID!,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
},
})
// 사용법은 동일
await r2.send(new PutObjectCommand({
Bucket: 'my-bucket',
Key: 'images/photo.jpg',
Body: fileBuffer,
ContentType: 'image/jpeg',
}))
const { Body } = await r2.send(new GetObjectCommand({
Bucket: 'my-bucket',
Key: 'images/photo.jpg',
}))
const data = await Body?.transformToByteArray()
S3와 달리 R2에서 지원하지 않거나 동작이 다른 기능이 있다. 전환 전에 확인해야 할 항목이다.
S3 Select — R2 미지원. S3 Select로 CSV·JSON에서 직접 쿼리하는 패턴은 쓸 수 없다.
Object Lambda — R2 미지원. 파일 변환을 S3 Object Lambda로 하던 경우, Workers나 별도 서버로 이동해야 한다.
이벤트 알림 (SNS/SQS) — R2는 Workers를 통한 이벤트 처리 방식이다. SQS 트리거를 직접 붙이는 패턴은 없다.
버킷 퍼블릭 설정 — R2는 R2.dev 서브도메인이나 커스텀 도메인을 Cloudflare Workers/Pages와 연결하는 방식으로 공개한다. S3의 Static Website Hosting과는 다르다.
Presigned URL — 지원한다. 만료 기간 최대 7일(S3는 최대 7일 동일).
선택 기준 | R2가 맞는 경우 vs S3가 맞는 경우
두 서비스 중 어느 쪽이 맞는지는 사용 패턴과 기존 인프라에 따라 갈린다.
상황
추천
이유
이미지·영상 등 다운로드 많음
R2
이그레스 무료로 가장 큰 비용 절감
AWS Lambda·RDS 등 AWS 서비스와 연동
S3
같은 리전 트래픽은 이그레스 무료, VPC 내 연동 안정적
Cloudflare Workers·Pages 사용
R2
Workers 바인딩으로 SDK 없이 직접 접근 가능
S3 Select·Object Lambda 사용 중
S3 유지
R2 미지원 기능 존재
글로벌 사용자 + 멀티 CDN
R2
CF 글로벌 네트워크 + CDN 자동 포함
컴플라이언스·감사(HIPAA·ISMS-P)
S3
한국 컴플라이언스 사례 더 많음
백업·아카이브 (다운로드 거의 없음)
S3 Glacier 또는 R2 비슷
스토리지 단가 차이 작음, Glacier가 더 저렴할 수도
R2 버킷 생성 후 AWS SDK 호환 API 토큰을 발급해 기존 S3 코드를 재사용할 수 있다
S3 → R2 마이그레이션 | 기존 버킷 옮기는 순서
기존 S3 버킷을 R2로 옮기는 방법은 몇 가지다. 데이터 크기와 다운타임 허용 여부에 따라 고른다.
방법 1: Cloudflare R2 Migration 도구 사용 — Cloudflare 대시보드에서 S3 버킷을 R2로 직접 당겨오는 도구를 제공한다. 버킷 자격증명만 입력하면 복사가 시작된다. 원본 S3 버킷은 그대로 유지되므로 동기화 완료 후 트래픽만 바꾸면 된다.
방법 2: rclone 사용 — 오픈소스 스토리지 동기화 툴이다. S3와 R2를 각각 원격지로 설정하고 rclone sync를 실행한다.
rclone으로 S3 → R2 마이그레이션
# rclone 설치
brew install rclone
# ~/.config/rclone/rclone.conf 설정
# [s3-source]
# type = s3
# provider = AWS
# access_key_id = ...
# secret_access_key = ...
# region = ap-northeast-2
# [r2-dest]
# type = s3
# provider = Cloudflare
# access_key_id = R2_ACCESS_KEY_ID
# secret_access_key = R2_SECRET_ACCESS_KEY
# endpoint = https://ACCOUNT_ID.r2.cloudflarestorage.com
# 복사 (--dry-run으로 먼저 확인)
rclone copy s3-source:my-bucket r2-dest:my-r2-bucket --progress --dry-run
# 실제 실행
rclone copy s3-source:my-bucket r2-dest:my-r2-bucket --progress
# 이후 동기화 (새로 추가된 파일만)
rclone sync s3-source:my-bucket r2-dest:my-r2-bucket --progress
마이그레이션 후 트래픽 전환은 DNS나 애플리케이션 설정 변경으로 한다. S3 URL과 R2 URL은 형식이 다르기 때문에 코드에 S3 URL이 하드코딩된 경우 환경변수로 분리해 두면 전환이 쉽다.
마이그레이션 기간에 두 버킷을 동시에 운영하려면 이중 쓰기(양쪽에 업로드) 패턴을 쓴다. 코드 레벨에서 S3와 R2에 동시에 업로드하는 기간을 두고, 읽기를 R2로 천천히 전환한 뒤, S3 업로드를 제거하는 순서다.
한국 개발자가 알아야 할 것 | 청구·인증·지원
청구 통화: 두 서비스 모두 달러 청구다. 신용카드 결제 시 환율 수수료가 붙는다. 법인이라면 AWS Korea 또는 Cloudflare의 한국 파트너를 통해 원화 청구가 가능하다.
부가가치세: AWS는 한국 사업자에게 VAT 10%를 청구하고 세금계산서를 발행한다. Cloudflare도 마찬가지다. 개인 사업자라면 청구 정보에 사업자등록번호를 넣어야 세금계산서를 받을 수 있다.
데이터 위치: ISMS-P나 금융 데이터를 다루는 경우 데이터 저장 위치가 중요하다. S3는 서울 리전(ap-northeast-2)을 선택하면 데이터가 국내에 머문다. R2는 기본적으로 "Automatic" 설정이고 저장 위치가 고정되지 않는다. EU나 US jurisdiction을 고를 수 있지만 한국 단독 jurisdiction은 없다. 데이터 위치가 법적으로 중요하다면 S3 서울 리전이 명확하다.
고객 지원: AWS는 유료 Support 플랜(최소 월 $29~)으로 한국어 지원이 가능하다. Cloudflare는 무료 플랜은 커뮤니티, 유료 플랜(Pro 이상)은 티켓 지원이다. 둘 다 24시간 대응은 Enterprise 플랜 기준이다.
자주 묻는 질문
R2 이그레스 무료가 언제까지 유지되나요?
현재 Cloudflare 공식 정책은 이그레스 무료다. 별도 종료 공지는 없다. 다만 이는 Cloudflare의 정책 결정으로 언제든 바뀔 수 있다. 미션 크리티컬 서비스라면 이 점을 감안해 멀티 스토리지 구조나 전환 비용을 계산해 두는 것이 낫다.
Next.js Image Optimization과 R2를 같이 쓸 수 있나요?
쓸 수 있다. next.config.js의 images.remotePatterns에 R2 Public URL 도메인을 추가하면 된다. Cloudflare Workers와 R2를 함께 쓰면 Image Resizing을 Workers 레벨에서 처리하는 것도 가능하다. Vercel에서 배포하는 경우 Next.js Image Optimization이 Vercel CDN에서 처리되므로 R2 이그레스는 Vercel로만 나간다.
Presigned URL 만료 시간이 S3와 다른가요?
S3와 동일하게 최대 7일이다. R2 Presigned URL도 AWS SDK로 생성하면 되고, 만료 시간 설정 방법이 같다. 단, R2는 S3 SigV4 방식만 지원하고 SigV2는 지원하지 않는다. 레거시 SDK를 쓰는 경우 버전 확인이 필요하다.
S3와 R2를 동시에 쓰는 것도 가능한가요?
가능하다. 예를 들어 AWS Lambda와 강하게 결합된 처리 파이프라인은 S3에 두고, 최종 배포된 정적 파일이나 사용자 업로드 이미지는 R2에 두는 식으로 역할을 나눌 수 있다. 마이그레이션 기간에 이중 쓰기 패턴을 쓰는 것도 흔한 사례다.
R2 Versioning(버전 관리) 기능이 있나요?
있다. S3와 동일하게 버킷 레벨에서 버전 관리를 켤 수 있다. 활성화하면 덮어쓰기 시 이전 버전이 유지되고, 삭제 시 Delete Marker가 생긴다. 버전 관련 요청도 과금된다.
AWS 크레딧이 있으면 R2 대신 S3를 써야 하나요?
크레딧이 충분하다면 S3를 먼저 소진하는 것이 합리적이다. 특히 스타트업 AWS Activate 크레딧이 있으면 S3·CloudFront 이그레스 비용도 크레딧으로 커버된다. 크레딧이 소진될 시점에 R2 전환을 검토하는 것이 자연스러운 순서다.