Skip to main content
Cloudflare R2

내 R2 버킷에서 영상을 바로 서빙할 수 있습니다. 다만 R2 혼자서는 못 합니다.

오브젝트 스토리지는 바이트를 보관합니다. 재생에는 화질 사다리, 캐시가 붙는 도메인, 그리고 스트림을 제한할 방법이 더 필요합니다. 이 문서는 함께 맞물려 동작하는 네 조각, Cloudflare 공개 가격 기준의 각 비용, 그리고 실제 시청자가 들어온 뒤 깨지는 여섯 가지 지점을 정리합니다.

네 가지 질문에 먼저 답합니다

약관상 허용되나요?
2026-08-27에 Cloudflare 자체서비스 구독 약관을 직접 다시 읽었습니다. 사람들이 여전히 인용하는 그 조항은 현행 약관에 없습니다. 근거와 링크는 아래에 있습니다.
R2가 인코딩을 해 주나요?
아닙니다. 오브젝트 스토리지에는 인코더가 없습니다. 버킷에 도달하기 전에 다른 무언가가 화질별 파일과 매니페스트를 만들어야 합니다.
만료되는 재생 링크를 만들 수 있나요?
S3 presigned URL로는 안 됩니다. HLS는 세그먼트마다 별도 요청을 보내고 매니페스트에는 경로가 평문으로 들어 있어서, URL 하나에 서명해 봐야 의미 있는 것이 서명되지 않습니다.
실제로 얼마가 드나요?
저장 GB당 월 0.015달러, egress 0달러, 그리고 캐시를 놓친 세그먼트 요청에 붙는 Class B 오퍼레이션. 세 번째 항목은 계산해 보면 오히려 작습니다.

2026-08-27 NULX 엔지니어링팀 확인. 이 페이지의 모든 가격은 1차 출처로 연결됩니다.

경계

R2가 하는 일과, 끝내 해 주지 않는 일

실패하는 시도는 대부분 버킷을 영상 서비스로 착각하면서 시작합니다. R2는 경제성이 뛰어난 버킷입니다.

R2가 하는 일

  • 원본과 HLS 결과물을 GB당 월 0.015달러로 보관합니다.
  • 내 도메인과 Cloudflare 캐시를 앞에 두고 그 객체들을 전송합니다.
  • 몇 번을 재생하든 직접 인터넷 egress에는 비용을 물리지 않습니다.
  • S3 호환 API를 제공하므로 기존 업로드·수명주기 도구가 대체로 그대로 동작합니다.

R2가 하지 않는 일

  • 인코딩. 오브젝트 스토리지에는 인코더가 들어 있지 않습니다.
  • HLS·DASH 패키징. 세그먼트와 매니페스트는 이미 만들어진 채로 도착해야 합니다.
  • 재생 세션 제한. presigned URL은 객체 하나에 서명하는 것이지 스트림에 서명하는 것이 아닙니다.
  • r2.dev으로 실서비스 트래픽 처리. Cloudflare가 이 서브도메인에 속도 제한을 걸고 개발 전용이라고 문서에 적어 두었습니다.

동작하는 구성

네 조각, 이 순서대로

하나라도 빠지면 알아보기 쉬운 특정 증상이 나옵니다. 어떤 증상인지는 아래 실패 표에 있습니다.

  1. 1. 비공개 버킷

    버킷은 비공개로 둡니다. Cloudflare 문서가 직접 밝히듯 공개 r2.dev 접근은 속도 제한이 걸린 개발용이고, 캐시·접근 관리·봇 관리를 쓰려면 커스텀 도메인이 필요합니다. 취향 문제가 아니라 제품의 한계입니다.

  2. 2. HLS를 써 넣는 인코더

    업로드 전에 화질 사다리를 만듭니다. 흔한 출발점은 1080p 약 5Mbps, 720p 약 2.8Mbps, 480p 약 1.4Mbps에 6초 세그먼트입니다. 스케일된 해상도는 2로 나누어떨어져야 하고 원본보다 키우면 안 됩니다.

  3. 3. 앞에 세우는 내 도메인

    버킷에 커스텀 도메인을 붙입니다. 세그먼트 요청을 캐시 적중으로 바꿔 주는 단계가 바로 이것이고, 캐시 적중이 오퍼레이션 수와 지연 시간을 동시에 눌러 줍니다.

  4. 4. 플레이어, 그리고 인가하는 엣지

    hls.js나 네이티브 HLS 플레이어가 매니페스트를 읽습니다. 재생을 제한해야 한다면 버킷 앞의 Worker가 세그먼트를 내주기 전에 요청을 인가합니다. 공개된 예제 대부분이 TODO로 비워 두는 조각이 이것입니다.

산수

겁내기 전에 계산부터 해 봅니다

HLS는 영상 하나를 수천 개의 작은 객체로 쪼개고, 그 하나를 가져올 때마다 백만 요청당 0.36달러인 Class B 오퍼레이션이 발생합니다. 6초 세그먼트면 시청 1시간·화질 하나당 세그먼트 요청이 약 600회입니다. 화질 하나로 1,000 시청시간을 채웠을 때 그것이 얼마인지 봅니다.

구성 R2까지 도달하는 요청 Class B 비용
커스텀 도메인, 캐시 적중 90% 약 60,000 약 0.02달러
커스텀 도메인, 롱테일 적중 50% 약 300,000 약 0.11달러
앞에 캐시 없음 (r2.dev) 약 600,000 약 0.22달러, 그리고 속도 제한
그래서 오퍼레이션 요금은 문제가 아닙니다

캐시가 전혀 안 먹는 줄조차 0.25달러가 안 됩니다. 진짜 비용은 그 뒤에 둘 있습니다. 첫째는 저장입니다. 8Mbps 원본 1시간이 약 3.6GB이고 1080/720/480 사다리가 약 4.2GB를 더하므로, 둘 다 보관하면 영상 1시간당 월 0.12달러 언저리입니다. 둘째는 가용성입니다. 커스텀 도메인을 건너뛰면 돈을 더 내는 게 아니라 속도 제한에 걸립니다. 캐시를 생략하는 것은 요금 위험이 아니라 장애 위험입니다.

사람들이 실제로 찾는 비교

1시간짜리 영상, 1,000 시청시간 기준입니다. R2에서는 저장 약 0.12달러, egress 0달러, 최악의 경우 오퍼레이션 약 0.22달러로 대략 0.34달러입니다. Cloudflare Stream은 전송 1,000분당 1달러이므로 1,000 시청시간은 60,000분, 즉 60달러이고 저장 0.30달러가 더 붙습니다. 반올림 차이가 아니고, 이 구조가 계속 다시 만들어지는 이유 전부가 여기 있습니다.

세그먼트당 요청 1회, 화질 1종 가정입니다. 세션이 실제로 오가는 화질 수만큼 곱하세요. R2 무료 티어가 매달 Class B 1,000만 요청까지 흡수하므로, 소규모 파일럿은 청구서가 0으로 나오고 그 다음에 무슨 일이 생기는지는 알려 주지 못합니다.

developers.cloudflare.com/r2/pricing · developers.cloudflare.com/stream/pricing · developers.cloudflare.com/r2/buckets/public-buckets

제한된 재생

HLS에서 presigned URL이 통하지 않는 이유

직접 구축한 사례 글 대부분이 여기까지 와서 멈춥니다.

  • presigned URL은 정확히 객체 하나를 정해진 시간 동안 인가합니다. 반면 HLS 세션은 매니페스트 하나에 수백 개의 개별 세그먼트 객체입니다.
  • 매니페스트는 세그먼트 경로를 평문으로 나열합니다. 매니페스트에만 서명하면 그것이 가리키는 세그먼트는 전부 열려 있고, 세그먼트마다 서명하려면 시청자마다 세션마다 매니페스트를 다시 써야 합니다.
  • 실제로 쓰이는 방식은 엣지에서 인가하는 것입니다. 플레이어가 수명이 짧은 토큰을 들고 다니고, 버킷 앞의 Worker가 요청마다 검사하며, 버킷 자체는 계속 비공개로 둡니다.
  • 이 결정은 공개 전에 하세요. 공개 객체로 운영하다 나중에 인가 재생으로 옮기면, 이미 나간 URL은 전부 유출된 것으로 취급해야 합니다.

아무도 답하지 않는 질문

R2로 영상을 서빙하면 Cloudflare 약관 위반인가요?

이 질문의 검색 결과는 묻는 사람만 가득하고 확인한 사람이 없어서, 저희가 직접 확인했습니다. 2026-08-27 기준 cloudflare.com/terms에 게시된 자체서비스 구독 약관은 2025-09-12 발효본이며, 2절은 2.1 서비스 접근, 2.2 서비스 이용, 2.3 자격증명, 2.4 구독 조건, 2.5 고객 콘텐츠와 네트워크 데이터, 2.6 무료·체험 서비스, 2.7 허용 이용으로 구성됩니다. 포럼에서 아직도 인용되는 비HTML 콘텐츠 전송 제한 조항은 그 안에 없습니다.

  • R2는 GB·오퍼레이션 단위 가격이 공개된 유료 제품이고, Cloudflare의 R2 문서 자체가 실서비스 트래픽에 커스텀 도메인을 붙이라고 안내합니다.
  • 2.7 허용 이용 조항은 그대로 적용됩니다. 영상이 무엇이고 어떻게 확보한 것인지는 여전히 그 조항의 대상입니다.
  • 약관은 바뀌고 이 페이지는 특정 시점의 기록입니다. 이 구조로 가기 전에 약관을 직접 열어 발효일과 2절을 확인하세요.

Cloudflare 자체서비스 구독 약관

명시된 날짜에 읽은 내용의 기록이며, 법률 자문이 아닙니다.

실패 유형

여섯 가지 증상과 실제 원인

보이는 증상 실제 원인
나는 잘 되는데 남들은 429를 받는다 실서비스에 r2.dev을 썼습니다. Cloudflare가 속도 제한을 걸고 개발 전용이라고 문서에 적어 둔 경로입니다.
매니페스트는 내려오는데 재생이 안 된다 Content-Type 누락입니다. .m3u8은 application/vnd.apple.mpegurl, .ts는 video/mp2t가 필요하고, 뭉뚱그린 octet-stream은 대부분의 플레이어를 멈춥니다.
브라우저에서만 실패한다 버킷 도메인에 CORS 헤더가 없습니다. hls.js는 XHR로 세그먼트를 가져와 CORS의 적용을 받지만, 같은 파일을 가리키는 네이티브 video 요소는 받지 않습니다.
원본 .mp4에서 탐색이 느리거나 깨진다 프로그레시브 MP4는 HTTP range 요청과 앞쪽에 놓인 moov atom이 필요합니다. mp4를 버킷에 그냥 올린 경우 여기서 걸립니다.
오퍼레이션 수가 예상보다 훨씬 많다 캐시가 한 번도 동작하지 않았습니다. 트래픽이 커스텀 도메인으로 들어오는지, 캐시 규칙이 매니페스트만이 아니라 세그먼트 경로까지 잡는지 확인하세요.
화질별 파일 해상도가 이상하거나 원본보다 커진다 ffmpeg scale 필터에 2의 배수 보정과 원본 해상도 상한이 없습니다.

선택

직접 만들기, 관리 계층만 사기, 버킷을 아예 건너뛰기

셋 다 합리적인 선택입니다. 되느냐 마느냐가 아니라 무엇을 직접 운영하느냐가 다릅니다.

R2 위에 직접 구축 내 R2 위의 NULX Cloudflare Stream
인코더는 누가 만드나 직접 NULX 포함됨
파일은 누가 갖고 있나 내가 내가 Cloudflare
1,000 시청시간 비용 약 0.34달러 약 0.34달러 + 플랜 요금 약 60달러
제한된 재생 직접 만든 Worker 기본 제공 서명 URL
첫 재생까지 걸리는 시간 며칠에서 몇 주 반나절 몇 분
NULX가 답이 아닌 경우
  • 이미 인코더와 세그먼트를 인가하는 Worker를 운영하고 있다면, NULX는 이미 다 만든 편의를 파는 셈입니다.
  • Stream은 실제로 더 단순합니다. API 하나, 버킷 없음, 화질 사다리 고민 없음. 세그먼트를 다시는 생각하고 싶지 않다면 그 60달러가 그것을 삽니다.
  • NULX는 현재 공식 가동률 SLA와 크레딧을 제공하지 않습니다. 계약상 그것이 필요하다면 아직 맞는 제품이 아닙니다.

자주 찾는 질문

사람들이 실제로 검색하는 질문

Cloudflare R2 버킷에서 영상을 바로 스트리밍할 수 있나요?
HLS 결과물이 이미 버킷에 있고 앞에 커스텀 도메인이 있다면 됩니다. R2는 매니페스트와 세그먼트를 다른 객체와 똑같이 전송합니다. R2가 하지 않는 일은 그 객체들을 만드는 것이므로, 업로드 전에 인코더가 돌아야 합니다.
Cloudflare R2는 영상 트래픽 비용을 받나요?
받지 않습니다. Cloudflare 공개 가격 기준 R2의 직접 인터넷 egress는 0달러입니다. 저장은 GB당 월 0.015달러, 오퍼레이션은 백만 요청 단위로 과금되며, 둘 다 재생 횟수에 따라 늘어나지 않습니다.
HLS 재생에 presigned URL을 왜 못 쓰나요?
presigned URL은 객체 하나를 인가합니다. HLS 세션은 매니페스트 하나에 수백 개의 세그먼트 객체이고 그 경로는 매니페스트에 평문으로 들어 있습니다. 재생을 제한하려면 요청마다 엣지에서 인가해야 하며, 보통 수명이 짧은 토큰을 Worker가 검사하는 방식입니다.
영상 용도로 R2가 Cloudflare Stream보다 저렴한가요?
전송이 많은 라이브러리라면 상당히 저렴합니다. 1시간 영상 1,000 시청시간 기준으로 R2는 저장과 오퍼레이션을 합쳐 약 0.34달러이고 egress 요금이 없는 반면, 전송 1,000분당 1달러인 Stream은 약 60달러입니다. 대신 Stream에는 직접 돌려야 할 인코딩과 패키징이 포함돼 있습니다.
R2로 영상을 서빙하려면 Cloudflare Workers가 꼭 필요한가요?
제한된 재생에만 필요합니다. 공개 영상이라면 커스텀 도메인과 캐시 규칙이면 됩니다. Worker는 세그먼트를 내주기 전에 요청을 인가해야 할 때 등장합니다.

내 라이브러리 기준 숫자를 확인하세요

계산기에 보유 영상 시간과 예상 시청량을 넣으면 Cloudflare가 직접 청구하는 몫과 NULX가 청구하는 몫을 나눠서 보여 줍니다. 무료 플랜은 인코딩 2시간을 포함하고, 이미 갖고 있는 버킷에 연결합니다.