R2 공개 URL 비용R2까지 간 읽기만 사용량으로 셉니다
한눈에 보기
공개 URL 요청이 모두 비용이 되지는 않습니다. R2까지 도달한 읽기만 사용량 1건으로 세고, 그 사용량이 무료·약정 범위를 넘을 때 비용이 생깁니다.
일반 사용자가 열면 비용이 생기나요?
R2까지 간 읽기 1건이 사용량 1건입니다. 그 사용량이 무료·약정 범위를 넘을 때 비용이 생깁니다.
어떻게 세나
R2? 요금은 저장량과 작업 수로 정합니다. 공개 주소로 파일을 읽으면 Class B? 작업 1건입니다.
- 인터넷으로 나가는 전송(egress?)은 요금이 없습니다.
- 셀프 서브 요금은 매달 Class B 1,000만 건이 무료이고, 넘는 부분부터 100만 건당 $0.36입니다(Standard 저장소).
- Enterprise 계약에 R2가 들어 있으면 계약에서 정한 약정량과 정산 방식을 따릅니다.
«세어진다»는 사용량에 잡힌다는 뜻입니다. 범위 안이면 추가 비용은 없습니다.
무엇이 세어지고 무엇이 안 세어지나요?
캐시에서 끝나거나 엣지에서 막힌 요청은 세지 않습니다. R2까지 간 읽기는 결과와 관계없이 셉니다.
한 줄 정리
| 경우 | R2 사용량 |
|---|---|
| WAF 차단·Managed Challenge | 세지 않음 |
| 커스텀 도메인? 캐시 HIT | 세지 않음 |
| 캐시 MISS·캐시 대상 아님 | 1건씩 셈 |
| r2.dev? 공개 주소 | 요청마다 셈 |
| 없는 파일(404) | 1건씩 셈 |
| 권한 없음(401) | 세지 않음(공식 문서) |
실제로 재 봤나요?
네. 우리 랩 계정에서 시나리오 11종을 5번씩 보내고 R2가 센 작업 수를 대조했습니다.
2026-10-15 랩 실측
| 시나리오 | 엣지 응답 | R2 작업(5번 중) |
|---|---|---|
| r2.dev GET·HEAD | 200 | 각 5 |
| r2.dev 없는 파일 | 404 | 5 |
커스텀 도메인 .txt | 200 DYNAMIC | 5 |
커스텀 도메인 .png 반복 | MISS 1·HIT 4 | 1 |
커스텀 도메인 없는 .png | 404 MISS 1·HIT 4 | 1 |
| 부분 요청(Range) | 206 | 5 |
?v= 값을 매번 바꿈 | MISS 5 | 5 |
| WAF 차단 | 403 | 0 |
| Managed Challenge | 403 | 0 |
| 서명 없는 S3 API 요청 | 400 | 0 |
청구서 금액이 아니라 R2가 기록한 작업 수입니다. 랩 계정은 무료 범위 안이라 청구 금액은 0입니다.
함정: 흔한 오해: 실패한 요청은 공짜다
없는 파일 요청(404)도 읽기 1건으로 셉니다.
랩에서 없는 파일을 5번 요청하자 GetObject 404가 5건 잡혔습니다. 공식 문서가 면제라고 밝힌 것은 권한 없음(401)뿐입니다.
- 봇이 없는 경로를 훑어도 사용량이 늘어납니다.
- 커스텀 도메인 뒤라면 404 응답도 캐시되어 첫 1건만 셌습니다.
한눈에 보기
서비스에 쓰는 공개는 커스텀 도메인으로 붙여 캐시와 WAF를 앞에 둡니다. 집계된 사용량은 무료 사용량이나 계약 약정량을 넘는 부분부터 비용이 됩니다.
r2.dev 주소를 그대로 써도 되나요?
개발용입니다. 캐시·WAF·봇 관리가 없어 요청 수가 그대로 사용량이 됩니다.
r2.dev 와 커스텀 도메인
| 항목 | r2.dev | 커스텀 도메인 |
|---|---|---|
| 캐시 | 없음 | 존의 캐시 |
| WAF·봇 관리 | 없음 | 존의 룰 적용 |
| 속도 제한 | 걸려 있음 | 존 설정을 따름 |
| 용도 | 개발·시험 | 서비스 |
R2 › 버킷 › Settings › Custom Domains
커스텀 도메인은 같은 계정의 존이어야 합니다. Enterprise 존은 zone hold를 먼저 풉니다.
캐시는 어떻게 붙이나요?
커스텀 도메인에 캐시 규칙을 둡니다. 기본으로는 이미지 같은 일부 확장자만 캐시합니다.
기본 캐시와 규칙
랩에서 .png는 첫 요청 뒤 HIT였고 .txt는 매번 DYNAMIC으로 R2까지 갔습니다.
- Rules › Cache Rules에서 버킷 호스트를 조건으로 규칙을 만듭니다.
- Cache eligibility를 Eligible for cache로 둡니다.
- R2 가까운 데이터센터를 상위 캐시로 쓰도록 Smart Tiered Cache를 켭니다.
도메인 › Caching › Cache Rules
비용은 언제 생기나요?
집계된 사용량이 무료 사용량이나 계약 약정량을 넘을 때입니다. 넘는 부분만 과금됩니다.
셀프 서브 요금(Standard 저장소)
| 항목 | 매달 무료 | 넘으면 |
|---|---|---|
| Class B? 읽기 | 1,000만 건 | 100만 건당 $0.36 |
| Class A? 쓰기 | 100만 건 | 100만 건당 $4.50 |
| 저장량 | 10GB-월 | GB-월당 $0.015 |
| 외부 전송 | 제한 없음 | 무료 |
Enterprise 계약은 계약에 정한 약정량과 단가를 따릅니다. 약정량에서 어떻게 차감하는지는 공개 문서에 없어 계약서로 확인합니다.
함정: 흔한 실수: r2.dev를 끄지 않기
r2.dev를 켜 둔 채 WAF를 걸면 뒷문이 남습니다.
커스텀 도메인에 WAF나 Access를 걸어도 r2.dev 주소가 켜져 있으면 버킷은 그 주소로 여전히 공개됩니다. 그 경로의 요청은 캐시도 차단도 없이 매번 사용량이 됩니다.
R2 › 버킷 › Settings › Public Development URL › Disable
한눈에 보기
엣지에서 차단·챌린지된 요청은 R2 작업이 0입니다. 반대로 쿼리 문자열로 캐시를 우회하면 요청마다 R2까지 가니 캐시 키?에서 쿼리를 뺍니다.
WAF로 막으면 R2 사용량이 줄어드나요?
줄어듭니다. 랩에서 차단과 Managed Challenge를 받은 요청은 R2 작업이 0이었습니다.
엣지에서 끝나는 요청
차단(403)과 챌린지(403) 각 5건 모두 R2 작업 기록이 없었습니다. 서명 없는 S3 API 요청(400)도 0이었습니다.
- 봇 차단은 원본 부하뿐 아니라 R2 읽기 사용량도 직접 줄입니다.
- 엣지가 요청을 받은 사실은 그대로 남습니다. R2 사용량과 존 요청 수는 따로 봅니다.
봇이 주소 뒤에 ?v=랜덤을 붙이면요?
캐시 키가 매번 달라져 전부 MISS가 되고 전부 셉니다. 캐시 규칙에서 쿼리 문자열을 무시합니다.
쿼리 문자열 무시
랩에서 같은 .png에 ?v= 값만 바꿔 5번 보내자 MISS 5건, R2 작업 5건이었습니다.
- Cache Rules에서 버킷 호스트를 조건으로 둡니다.
- Cache Key 설정에서 Ignore query string을 고릅니다(모든 플랜).
- 버전 관리가 필요하면 쿼리 대신 파일 이름에 버전을 넣습니다.
"cache_key": { "custom_key": { "query_string": { "exclude": { "all": true } } } }
어떻게 측정했나요?
시나리오마다 객체 이름을 달리 하고 GraphQL로 작업 수를 객체별로 나눠 봤습니다.
R2 작업 수 조회
r2OperationsAdaptiveGroups로 버킷의 작업 수를 나눠 봅니다. 랩에서는 반영까지 약 5분 걸렸습니다.
objectName· 시나리오별 객체를 가른다actionType· GetObject, HeadObject 같은 작업 종류responseStatusCode,actionStatus· 응답 코드와 결과(success, userError)
r2OperationsAdaptiveGroups(limit: 200, filter: { bucketName: $b, datetime_geq: $s, datetime_leq: $e }) {
sum { requests }
dimensions { objectName actionType responseStatusCode actionStatus }
}
없는 파일 요청은 GetObject · 404 · userError로 잡혔습니다.
함정: 이 실측의 한계
잰 것은 작업 수이고 청구서 금액이 아닙니다.
작업 수가 과금 기준이라는 것은 공식 요금 문서를 근거로 합니다. 랩 계정은 무료 범위 안이라 청구 금액으로는 확인하지 않았습니다.
- 캐시 만료(TTL)와 Tiered Cache 구성에 따라 MISS 횟수는 늘 수 있습니다.
- 커스텀 도메인 요청이 존 요청 수에 어떻게 잡히는지는 이번 측정 범위 밖입니다.
이 문서의 용어
- 캐시 키
- Cache key · 엣지 캐시가 «같은 파일»을 가리는 기준. 기본값에는 쿼리 문자열이 들어갑니다.
- 커스텀 도메인
- Custom domain · 같은 계정의 존 아래 이름으로 버킷을 공개하는 방법. 그 존의 캐시·WAF·봇 관리가 앞에 섭니다.
- Class A
- Class A operations(쓰기 작업) · 상태를 바꾸는 작업. 업로드(PutObject)가 여기에 듭니다.
- Class B
- Class B operations(읽기 작업) · 기존 객체를 읽는 작업. GET·HEAD가 여기에 듭니다.
- egress
- Egress(외부 전송) · 저장소에서 인터넷으로 나가는 데이터. R2는 이 전송에 요금을 매기지 않습니다.
- R2
- Cloudflare R2 · 객체 저장소. 파일을 버킷에 담고 API나 공개 주소로 꺼냅니다.
- r2.dev
- Public Development URL(공개 개발 주소) · Cloudflare가 버킷마다 주는 개발용 공개 주소. 캐시·WAF가 없고 속도 제한이 걸려 있습니다.