V VibeCoding 365
목록으로 에이전트

에이전트

Cloudflare R2 이그레스 | Hermes 홈과 파일 권한 분리

2026년 8월 요금. 이그레스 0달러는 저장과 Class A/B가 공짜라는 뜻이 아니다.

Cloudflare R2는 객체 저장과 두 종류의 연산으로 과금한다. 2026년 8월 Cloudflare 문서 기준으로 Standard 저장은 GB-월당 0.015달러, Class A는 100만 건당 4.50달러, Class B는 100만 건당 0.36달러이고, 인터넷으로 나가는 이그레스는 0달러다. 무료 티어는 매달 저장 10GB, Class A 100만, Class B 1,000만이다. 요금 페이지 갱신일은 2026-08-07이다.

이그레스가 무료인 것과 저장·연산이 무료인 것은 다르다. 문서 각주는 R2에서 직접 나가는 전송(Workers API, S3 API, r2.dev 포함)에는 데이터 전송 요금이 없다고 적으면서, 다른 종량제 서비스를 R2 버킷에 연결하면 그 서비스가 따로 청구할 수 있다고 밝힌다. Infrequent Access는 저장이 더 싸지만 검색(retrieval) 요금이 붙고, 무료 티어가 적용되지 않는다.

Hermes 홈, 파일, 이미지 서빙에 R2를 붙일 때는 요금표보다 공개 URL 경계가 본체다. 공개 put을 열어 두면 스팸 업로드가 먼저 온다. 공개 버킷과 비공개 원본 버킷을 나누면 실수로 올린 시크릿이 검색에 노출되는 사고를 줄인다. 커스텀 도메인과 캐시 규칙을 정한 뒤 올리면, URL이 바뀌어 본문 마크다운과 OG가 한꺼번에 깨지는 일을 줄인다.

요금 단위는 다음 과금 단위로 올림한다. 연산 100만 1건은 200만으로, 1.1GB-월은 2GB-월로 잡힌다. 콘솔 계산기와 이 문서의 숫자를 같은 날짜에 대조한다.

R2 비용 세 축
그림 1. 이그레스 0달러와 저장·Class A/B가 다른 축인 R2 요금 구조

이그레스 0달러

이그레스는 버킷에서 인터넷으로 나가는 바이트다. R2 문서가 0달러라고 적는 범위는 R2에서 직접 나가는 전송이다. Workers API, S3 API, r2.dev가 여기에 포함된다. 「트래픽 무제한」은 이 줄을 가리킨다. 저장 GB와 put/get 횟수는 다른 줄이다.

다른 종량제 서비스를 버킷에 붙이면 그 서비스가 따로 청구할 수 있다. 이미지 변환 워커, 로그 제품, 대역폭을 따로 파는 CDN 앞단이 그 예다. Hermes 홈 트래픽이 늘어도 R2 이그레스 줄은 0으로 보여도, 옆에 붙인 변환 워커는 따로 올라간다. Cloudflare 문서 각주가 바로 그 지점을 가리킨다.

권한이 없어 401로 거절된 요청은 과금하지 않는다고 문서 FAQ가 적는다. 반대로 공개 버킷에 익명 get을 열어 두면, 크롤러의 성공한 읽기는 Class B로 정상 과금된다. 스팸 put이 인증을 통과하면 Class A가 된다. 공개 읽기와 인증 쓰기를 같은 토큰으로 두지 않는 이유가 여기 있다.

공개 put 토큰과 익명 get이 한 자격 증명이면, 스팸이 인증을 통과하는 순간 A가 열린다. 읽기만 공개하고 쓰기는 업로더만 갖게 나누면 그 입구가 줄어든다.

방문자가 Hermes 홈을 열면 브라우저는 HTML을 받고, 그 HTML이 가리키는 이미지 URL로 get을 보낸다. 그 get이 R2에서 직접 나가면 이그레스 줄은 0달러다. 같은 get은 Class B 한 건이다. 이미지가 세 장이면 B 세 건이다. 저장 GB는 그 객체들이 버킷에 있는 동안 매달 쌓인다. 무료 티어 저장 10GB 안이면 저장 줄도 0에 가깝다. 「트래픽이 늘어도 청구가 없다」는 문장은 이그레스에만 맞다. 조회가 무료 Class B 1,000만을 넘으면 0.36달러/100만이 열린다. 자산 호스팅 예의 104.40달러가 그 줄이다.

핵심 포인트: 「트래픽 무제한」은 이그레스 이야기이지 저장과 put/get이 공짜라는 뜻이 아니다. 무료 티어를 넘는 순간 Class B 읽기만으로도 월 청구가 커진다.

Class A와 Class B

R2는 저장량과 연산 두 축으로 나눈다. Class A는 상태를 바꾸는 쪽에 가깝고, Class B는 기존 상태를 읽는 쪽에 가깝다.

Class A에는 PutObject, ListObjects, CopyObject, 멀티파트 완료 같은 쓰기가 들어간다. Class B에는 GetObject, HeadObject 같은 읽기가 들어간다. DeleteObject와 DeleteBucket, AbortMultipartUpload는 무료 연산으로 적혀 있다.

목록 페이지가 매 요청마다 객체를 나열하면 ListObjects가 Class A로 쌓인다. Hermes 홈이 이미지 몇 장뿐이라도, 디렉터리를 매번 훑으면 쓰기 쪽 요금이 먼저 티어를 넘는다. 썸네일을 반복 get하면 Class B가 먼저 티어를 넘는다. 작은 객체를 자주 put하면 Class A가 본체가 된다.

문서의 자산 호스팅 예는 이 차이를 숫자로 보여 준다. 평균 100KB 파일 10만 개를 쓰고 하루 1,000만 번 읽으면, 저장은 무료 티어 안이라 0달러에 가깝고 Class A도 공제 안이다. Class B는 하루 1,000만 × 30일에서 무료 1,000만을 뺀 2억 9,000만 건이 과금되어 104.40달러가 된다. Hermes 홈 이미지가 「이그레스 무료」여도, 조회가 많으면 읽기 연산이 본체가 된다.

그 104.40달러는 이렇게 열린다. 하루 1,000만 읽기 × 30일이면 3억 건이다. 무료 티어 Class B는 매달 1,000만이다. 3억에서 1,000만을 빼면 2억 9,000만 건이다. Class B는 100만 건당 0.36달러이므로 290 × 0.36이 104.40이다. 저장 쪽은 10만 개 × 100KB가 약 10GB라 무료 저장 10GB 안이다. put 10만은 무료 Class A 100만 안이다. 이그레스 줄은 0달러로 남는다. 「트래픽이 많다」가 가리키는 청구는 이 B 줄이다.

표준 저장 예는 1GB 객체 1,000개다. 합이 1,000GB이고 무료 10GB를 빼면 990GB-월이다. Standard 저장 0.015달러 × 990이 14.85달러다. 각 객체를 1,000번 읽으면 Class B 100만 건이라 무료 1,000만 안이다. 큰 객체를 적게 읽으면 저장이 본체다. 작은 객체를 자주 put하면 A가 본체다. 홈 썸네일처럼 작게 자주 get하면 B가 본체다.

표준 저장 예에서는 1GB 객체 1,000개를 한 달 보관하고 각 1,000번 읽어도 저장 14.85달러(990GB-월)가 거의 전부고, A/B는 무료 티어 안이다.

Super Slurper와 Sippy 같은 이전 도구는 도구 자체는 무료로 적혀 있으나, R2 쪽 Class A와 원본 버킷 과금은 남는다. 100MiB 미만은 단일 Class A, 그 이상은 멀티파트로 여러 Class A가 발생한다. Hermes 홈을 다른 스토리지에서 옮길 때 「이전이 공짜」로 읽으면 안 된다.

Standard vs Infrequent Access

Infrequent Access에는 데이터 검색(processing) 요금이 붙는다. 어느 저장 클래스든 인터넷 이그레스 자체는 무료로 적혀 있다.

항목StandardInfrequent Access
저장0.015달러 / GB-월0.01달러 / GB-월
Class A4.50달러 / 100만 요청9.00달러 / 100만 요청
Class B0.36달러 / 100만 요청0.90달러 / 100만 요청
데이터 검색없음0.01달러 / GB
이그레스(인터넷)무료무료
최소 보관없음30일
무료 티어적용적용 안 함

무료 티어는 Standard에만 적용된다. Infrequent Access로 옮기면 매달 저장 10GB, Class A 100만, Class B 1,000만 공제가 사라진다. Infrequent에 넣은 객체는 30일이 지나기 전에 지워도 30일분 저장으로 잡힌다. 검색 요금은 객체를 읽을 때 GB당 0.01달러다. 홈 이미지가 매일 열리면 그 읽기가 검색 줄과 Class B 줄을 같이 올린다. Standard에서는 검색 줄이 없다. Class B만 0.36달러/100만이고 무료 1,000만이 있다. 저장만 비교하면 Infrequent의 0.01달러/GB-월이 싸 보인다. 읽기 빈도까지 넣으면 Standard가 본문에 맞는 쪽이다.

Infrequent 예에서는 같은 1,000개를 5일만 두고 지워도 최소 30일 때문에 저장 10달러, A 9달러, B 0.90달러, 검색 10달러로 29.90달러가 된다. 짧은 보관용으로 Infrequent를 고르면 검색 요금과 최소 기간이 오히려 더 비쌀 수 있다. Hermes 홈 이미지는 자주 읽히므로 Standard가 본문에 맞는 쪽이다.

29.90달러는 저장 클래스만 바꿔서 나온 합이다. 1,000개 × 1GB는 1,000GB다. Infrequent 저장 0.01달러/GB-월에 최소 30일이 붙으면, 5일만 둬도 30일분 10달러다. 검색은 읽을 때 GB당 0.01달러라 1,000GB를 한 번 꺼내면 10달러다. Class A는 Infrequent에서 100만 건당 9.00달러, Class B는 100만 건당 0.90달러다. 문서 예의 A 9달러와 B 0.90달러가 그 줄이다. Standard 같은 1,000개를 한 달 보관하고 각 1,000번 읽으면 저장 14.85달러가 거의 전부고 A/B는 무료 티어 안이다. 홈 이미지처럼 매일 get이 나는 객체는 Infrequent의 검색 줄과 비싼 B가 본체가 된다.

r2.dev

r2.dev는 Cloudflare가 버킷에 붙여 주는 기본 공개 호스트다. 문서 각주가 이그레스 무료 범위에 r2.dev를 포함한다. 다만 이 호스트는 운영 도메인이 아니다. 본문 마크다운과 OG에 r2.dev URL을 박으면, 나중에 커스텀 도메인으로 옮길 때 글을 일괄 치환해야 한다.

커스텀 도메인 DNS와 인증서가 준비되기 전에 임시 URL을 본문에 박지 않는다. 본문이 퍼지면 임시 URL을 일괄 치환해야 한다. 버전 prefix(예: /2026-08/)를 쓰면 교체가 쉽다. URL이 바뀌면 본문 마크다운과 OG 이미지가 한꺼번에 깨진다.

r2.dev는 테스트와 내부 확인용으로 두고, 공개 홈은 커스텀 도메인이 Active된 뒤에 올린다. 캐시 규칙도 그 도메인에 붙인다. 임시 호스트에 긴 TTL을 걸어 두면, 옮긴 뒤에도 옛 URL이 한동안 살아 있다.

커스텀 도메인의 캐시 키와 r2.dev의 캐시 키는 호스트가 다르면 별 객체처럼 남는다. 본문만 커스텀 도메인으로 바꿔도, 북마크와 OG 카드가 r2.dev를 붙잡고 있으면 Class B가 두 호스트에 갈린다. 문서 각주는 r2.dev get도 이그레스 0달러 범위에 넣는다. 운영 도메인이 아닌 호스트에 트래픽이 남는 상태일 뿐이다. Facebook과 카카오 디버거 재수집이 카드를 바꾸려면 HTML의 og:image가 이미 커스텀 도메인이어야 한다.

방문자가 r2.dev 링크를 북마크하면, 커스텀 도메인으로 옮긴 뒤에도 그 북마크는 옛 호스트를 부른다. r2.dev get은 이그레스 0달러이고 Class B다. 운영 도메인이 아닌 호스트에 트래픽이 남는 상태다. OG 카드가 r2.dev를 가리키면 플랫폼 캐시가 그 URL을 붙잡는다. 본문만 치환해도 카드는 한동안 옛 호스트다. Facebook과 카카오 디버거 재수집이 그 카드를 바꾸려면, HTML의 og:image가 이미 커스텀 도메인이어야 한다.

공개 버킷

Hermes 홈에 올리는 변환 이미지와, 에이전트가 분석할 원본 로그는 같은 공개 prefix에 두면 안 된다. 한 버킷에 섞으면 캐시 헤더와 권한 실수가 커진다.

경계공개 정적비공개 원본
누가 읽나웹 방문자, 크롤러서명 URL, 서버만
예홈 OG, 본문 webp업로드 원본, 분석 덤프
캐시TTL을 길게 또는 버전 prefix캐시하지 않거나 짧게
사고URL이 퍼지면 삭제만으로 안 끝남키 유출이 검색 노출로 번지지 않음

이미지와 문서/바이너리도 헤더가 다르다. 업로드 API 경로와 공개 읽기 경로는 별 객체다. 브라우저는 짧은 수명의 서명 URL만 받게 두고, 업로드 API는 서버에서만 서명하는 구성이 실수 면적이 작다. 공개 put을 열어 두면 스팸이 먼저 온다.

「이 객체는 누가 읽어도 되는가」에 답이 모호하면 비공개로 둔다. 공개로 올리는 순간 URL은 통제 밖으로 나가기 시작한다. Hermes 홈 에셋만 공개 prefix를 쓰고, 분석용 원본은 분리한다.

공개 정적은 웹 방문자와 크롤러가 읽는다. 캐시를 길게 두면 Class B가 줄어들 수 있으나, 잘못된 파일이 오래 남는다. 비공개 원본은 서명 URL이나 서버만 읽는다. 캐시를 짧게 두거나 안 둔다. 키 유출이 있어도 검색 노출로 바로 번지지 않는 쪽이 이 경계다. 한 버킷에 섞으면 캐시 헤더 실수 한 번에 원본이 공개 TTL을 받는다.

공개 CDN과 비공개 원본
그림 2. 공개 CDN prefix와 비공개 원본 버킷을 나누는 이유

prefix

인증된 업로더만 put 가능하게 하고, 콘텐츠 타입, 크기 상한, 경로 prefix를 고정한다. 업로드 스크립트를 만능으로 만들지 않는다. 공개 홈 에셋용과 내부 분석 파일용이 같은 스크립트·같은 자격 증명이면, 실수 한 번에 내부 파일이 공개 prefix로 간다. 주체를 나누는 번거로움이 사고 비용보다 싸다.

배포 파이프라인 마지막에 공개 버킷 prefix를 나열해, env, 로그, 키 파일 확장자가 없는지 검사한다. 검사가 없으면 업로드 실수가 프로덕션에 그대로 간다. 실패 시 배포를 멈추게 두는 편이 사고 뒤에 지우는 것보다 싸다.

버전 prefix는 파일 이름이 같아도 경로가 달라지게 한다. /images/hero.webp를 덮어쓰면 캐시와 본문이 엇갈린다. /2026-08/hero.webp처럼 달이면, 새 파일을 올려도 옛 URL은 옛 바이트를 유지한다. Hermes 홈 이미지가 드물게 바뀌면 TTL을 길게, 자주 바뀌면 버전 prefix가 무효화보다 단순할 때가 많다.

월말에만 비용을 보지 않는다. 객체 수와 운영 요청 급증 알림을 걸고, 급증이면 put을 잠시 닫는 한 줄을 남긴다. R2라서 걱정 없다는 문장은 운영 문장이 아니다. 업로드 스크립트 실수 하룻밤이면 객체 수가 튄다.

이미지 변환본과 원본 보관 정책을 처음에 정하면 청구가 덜 흔들린다. 원본은 비공개에 짧게 두고, 공개 버킷에는 변환본만 두는 방식이 실수 면적이 작다. 「원본은 비공개에 짧게, 공개에는 변환본만」이 반대로 적히면 원본이 검색된다.

prefix는 경로의 앞부분이다. home/와 internal/를 나누면, 홈 업로더는 home/만 put할 수 있게 제한한다. 게이트웨이 프로세스가 internal/만 쓰면 대화 로그가 홈 CDN에 안 올라간다. 확장자 검사만으로 env와 키 파일을 걸러 내지 못하면, .env와 .pem이 home/에 섞인다. 배포 마지막 나열이 그 실수를 막는 그물이다. 콘텐츠 타입을 image/webp로 고정하면, 텍스트 로그가 그 prefix로 가기 어렵다. 크기 상한은 원본 덤프가 공개 홈에 들어오는 일을 줄인다.

월말에만 비용을 보지 않는 이유와 같다. 객체 수가 하룻밤에 튀면 Class A가 먼저 티어를 넘는다. 급증 알림이 없으면 이그레스 0달러 화면만 보고 안심한다.

퍼지

파일 URL이 본문과 SNS 카드에 퍼지면 버킷 정리만으로 끝이 아니다. 예전 경로를 북마크한 사용자와 크롤러가 남고, 캐시가 남으면 삭제 후에도 한동안 내용이 보인다. 민감 객체를 올렸다면 삭제, 캐시 퍼지, 객체 키 폐기를 한 세트로 적는다.

첫 배포 직후 작은 파일을 교체해 무효화가 반영되는 시간을 잰다. 한 번도 안 해 보면 잘못된 파일이 CDN에 남는 사고를 늦게 발견한다. Cloudflare Cache Purge 문서가 이 구간의 1차 출처다.

퍼지는 URL 단위로 고르는 편이 안전하다. 버킷 전체를 비우면 홈 이미지가 한꺼번에 다시 받아진다. Class B가 그 순간에 튄다. 민감 객체만 지우고 그 URL만 purge한다. 키 폐기는 서명에 쓰던 자격 증명을 폐기하는 일이다. 객체를 지워도 옛 키가 살아 있으면 같은 prefix에 다시 put할 수 있다.

삭제만 하면 버킷의 객체는 없어진다. 앞단 캐시와 브라우저 캐시와 SNS 카드 캐시는 별이다. Cache Purge는 앞단 캐시를 지운다. 버전 prefix를 쓰면 새 URL은 새 캐시 키라 퍼지 없이도 새 바이트가 나간다. 옛 URL은 옛 바이트를 유지하므로, 민감 내용이 옛 경로에 있으면 삭제와 퍼지와 키 폐기가 여전히 필요하다. 첫 배포 직후 작은 파일로 시간을 재는 이유는, TTL을 추측으로 두지 않기 위해서다.

삭제 한 세트
그림 3. 삭제만으로 끝나지 않는 공개 URL. 퍼지와 키 폐기가 한 세트다

Hermes 홈 경로

공개 CDN URL을 프롬프트에 넣으면 외부에서도 같은 파일을 볼 수 있다. 내부 분석용 원본은 서명 URL이나 서버 로컬 마운트로만 읽고, 공개 홈 이미지만 CDN 경로를 쓴다. 업로드 주체를 나누면 실수로 로그가 공개 prefix로 들어가는 일을 줄인다.

Hermes가 파일을 읽어 후속 작업을 할 때는, 에이전트에게 준 경로가 공개 CDN인지 내부 경로인지 프롬프트에 명시한다. 구분하지 않으면 모델이 공개 URL을 로그에 반복해 남길 수 있다. 메시징 게이트웨이는 한 백그라운드 프로세스이므로, 그 프로세스에 공개 prefix 쓰기 권한이 있으면 대화 한 줄이 곧 업로드가 된다.

Workers, 커스텀 도메인, 이미지 변환 워커처럼 R2 옆에 붙는 종량제 상품은 이그레스 무료와 별개다. 홈페이지 트래픽이 늘어도 R2 이그레스 줄은 0으로 보여도, 변환 워커나 로그 제품은 따로 올라간다.

과금 단위 올림도 운영 숫자에 영향을 준다. 연산 100만 1건은 200만으로, 저장 1.1GB-월은 2GB-월로 잡힌다. 작은 객체를 자주 put하면 Class A가, 썸네일을 반복 get하면 Class B가 먼저 티어를 넘는다.

Hermes Agent docs와 messaging gateway 문서가 게이트웨이 프로세스의 위치를 설명한다. 그 프로세스의 자격 증명이 공개 prefix put을 포함하면, 대화 한 줄이 객체 하나가 된다. 홈 에셋 업로더와 게이트웨이 자격 증명을 나누는 구성이 그 입구를 줄인다.

게이트웨이는 메시징 입구에서 오는 파일을 다음 작업에 넘긴다. 그 파일이 홈 OG인지 분석 덤프인지는 모델이 경로 문자열만으로는 가리지 못한다. 프롬프트에 「이 URL은 공개 CDN이다」 또는 「이 경로는 서명 읽기만 된다」를 적지 않으면, 후속 턴이 공개 URL을 다시 인용한다. 인용은 로그에 남고, 로그가 공개 prefix로 올라가면 원본이 검색된다. 내부 마운트는 그 인용이 바깥 URL이 되지 않게 한다.

Super Slurper와 Sippy

다른 스토리지에 있던 Hermes 홈 이미지를 R2로 옮길 때 Super Slurper와 Sippy가 등장한다. 문서가 도구 자체를 무료로 적더라도, R2 쪽 Class A와 원본 버킷 과금은 남는다. 100MiB 미만은 단일 Class A다. 그 이상은 멀티파트로 여러 Class A가 발생한다. 「이전이 공짜」로 읽으면 청구가 이그레스 줄에만 있다고 오해한다. 이그레스는 0달러여도 옮기는 연산은 A다.

원본 버킷이 S3나 다른 제공자면 그쪽 이그레스와 요청 요금이 따로 나온다. R2 문서 각주가 「다른 종량제 서비스를 연결하면 그 서비스가 따로 청구할 수 있다」고 밝히는 지점과 같다. 이전 전후에 객체 수와 Class A 그래프를 같은 날짜에 대조한다. 한 번에 대량 put을 열면 무료 티어 100만을 넘는 속도가 빨라진다. 급증이면 put을 잠시 닫는 한 줄을 남긴다.

Super Slurper는 원본을 읽어 R2에 쓴다. 읽는 쪽이 S3면 그쪽 이그레스가 붙고, 쓰는 쪽이 R2면 Class A가 붙는다. 도구 UI가 무료여도 양쪽 청구는 남는다. 100MiB 경계는 파일이 아니라 객체다. 홈 이미지 한 장이 그 아래면 단일 A, 원본 영상이 넘으면 멀티파트 A가 여러 줄이다. Sippy는 점진 이전이다. 일부 키만 R2에 두고 나머지는 원본에 두면, 애플리케이션 get이 어느 버킷을 치는지가 청구를 가른다. 이전 중 ListObjects로 진행률을 보면 그 목록 자체가 Class A다.

ListObjects가 Class A인 이유

목록 페이지가 매 요청마다 버킷을 훑으면 ListObjects가 Class A로 쌓인다. Hermes 홈이 이미지 몇 장뿐이라도, 디렉터리 나열이 쓰기 쪽 요금이 된다. Class A는 상태를 바꾸는 쪽에 가깝다고 문서가 적지만, ListObjects는 목록을 만드는 연산이라 A에 들어간다. GetObject와 HeadObject만 B다. 홈 HTML에 객체 키를 박아 두고 get만 하면 B다. 방문마다 버킷을 나열하면 A다.

목록이 한 페이지에 안 끝나면 ContinuationToken으로 다음 ListObjects를 보낸다. 그 다음 호출도 Class A다. 홈이 이미지 세 장이어도, 방문마다 버킷을 나열하면 A가 방문 수만큼 쌓인다. HTML에 home/2026-08/hero.webp처럼 키를 박아 두고 GetObject만 하면 B다. CopyObject와 멀티파트 완료도 A다. PutObject 한 건이 작은 파일이면 A 한 건이다. 100MiB 이상은 멀티파트로 여러 A가 발생한다. DeleteObject와 DeleteBucket, AbortMultipartUpload는 무료 연산으로 적혀 있다. 지우는 일이 공짜여도 다시 올리는 put은 A다.

썸네일을 반복 get하면 Class B가 먼저 티어를 넘는다. 문서의 자산 호스팅 예가 그 숫자다. 평균 100KB 파일 10만 개를 쓰고 하루 1,000만 번 읽으면, 저장은 무료 티어 안이라 0달러에 가깝고 Class A도 공제 안이다. Class B는 하루 1,000만 × 30일에서 무료 1,000만을 뺀 2억 9,000만 건이 과금되어 104.40달러다. 이그레스 줄은 0이다. 조회가 많은 홈에서 「트래픽 무제한」만 읽고 청구를 무시하면, 읽기 연산이 본체가 된다.

표준 저장 예는 1GB 객체 1,000개를 한 달 보관하고 각 1,000번 읽는 경우다. 저장 990GB-월이 14.85달러에 가깝고 A/B는 무료 티어 안이다. 큰 객체를 적게 읽으면 저장이 본체다. 작은 객체를 자주 put하면 Class A가 본체다.

과금 단위 올림

요금 단위는 다음 과금 단위로 올림한다. 연산 100만 1건은 200만으로 잡힌다. 저장 1.1GB-월은 2GB-월로 잡힌다. 콘솔 계산기와 문장 속 숫자를 같은 날짜에 대조한다. 요금 페이지 갱신일은 2026-08-07이다.

무료 티어 저장 10GB를 넘는 순간 Standard 저장 줄이 0.015달러/GB-월로 열린다. Class A 100만을 넘는 순간 4.50달러/100만이다. Class B 1,000만을 넘는 순간 0.36달러/100만이다. Infrequent로 옮기면 이 공제가 없다. Class A는 9.00달러/100만, Class B는 0.90달러/100만, 검색은 0.01달러/GB다. 최소 보관 30일이라 5일만 두고 지워도 30일분 저장으로 잡힌다. Infrequent 예에서 같은 1,000개를 5일만 두면 저장 10달러, A 9달러, B 0.90달러, 검색 10달러로 29.90달러다. 짧은 보관용으로 Infrequent를 고르면 검색과 최소 기간이 오히려 더 비쌀 수 있다. Hermes 홈 이미지는 자주 읽히므로 Standard가 본문에 맞는 쪽이다.

401로 거절된 요청은 과금하지 않는다고 문서 FAQ가 적는다. 공개 버킷의 성공한 익명 get은 Class B로 정상 과금된다. 스팸 put이 인증을 통과하면 Class A다. 공개 읽기 토큰과 인증 쓰기 토큰을 나누지 않으면 그 스팸이 A가 된다. DeleteObject, DeleteBucket, AbortMultipartUpload는 무료 연산으로 적혀 있다. 지우는 일이 공짜여도, 다시 올리는 put은 A다.

서명 URL과 공개 get

공개 get은 버킷 권한이나 커스텀 도메인 앞에서 익명이 객체를 받는 경로다. 성공하면 Class B다. 크롤러가 같은 URL을 반복해도 성공한 읽기는 매번 B다. 401로 거절되면 과금하지 않는다. 그래서 비공개 원본은 익명 get을 닫아 둔다. 분석 덤프를 공개 prefix에 두면 크롤러의 성공한 get이 B로 쌓이고, URL은 검색에 남는다.

서명 URL은 서버가 짧은 수명으로 만든 읽기 주소다. 브라우저는 그 주소만 받고, 업로드 API는 서버에서만 서명한다. 이미지와 문서, 바이너리는 Content-Type 헤더가 다르다. 업로드 경로와 공개 읽기 경로는 별 객체다. 한 스크립트가 둘을 같은 자격 증명으로 다루면, 내부 파일이 공개 prefix로 간다. 주체를 나누는 번거로움이 사고 비용보다 싸다.

비공개 원본의 사고는 키 유출이 검색 노출로 번지지 않는 쪽에 가깝다. 공개 정적의 사고는 URL이 퍼지면 삭제만으로 안 끝나는 쪽에 가깝다. 「이 객체는 누가 읽어도 되는가」에 답이 모호하면 비공개로 둔다. 공개로 올리는 순간 URL은 통제 밖으로 나가기 시작한다. Hermes 홈 OG와 본문 webp만 공개 prefix를 쓰고, 업로드 원본과 분석 덤프는 서명 또는 로컬 마운트다.

Workers API와 S3 API, r2.dev로 R2에서 직접 나가는 전송은 이그레스 0달러다. 이미지 변환 워커처럼 옆에 붙는 종량제는 따로 청구될 수 있다. 홈 트래픽이 늘어도 R2 이그레스 줄은 0으로 보여도 변환 워커와 로그 제품은 따로 올라간다. 문서 각주가 그 경계를 가리킨다.

커스텀 도메인 캐시와 버전 prefix

r2.dev는 테스트와 내부 확인용이다. 문서 각주가 이그레스 무료 범위에 r2.dev를 포함한다. 본문 마크다운과 OG에 이 호스트를 박으면, 나중에 커스텀 도메인으로 옮길 때 글을 일괄 치환해야 한다. 커스텀 도메인 DNS와 인증서가 Active되기 전에 임시 URL을 본문에 넣지 않는다. 본문이 퍼지면 치환이 본문이 된다.

커스텀 도메인 앞단 캐시가 TTL을 길게 잡고 있으면, 버킷에서 객체를 지워도 한동안 내용이 보인다. 퍼지가 삭제와 한 세트인 이유다. /images/hero.webp를 덮어쓰면 캐시 키와 본문이 엇갈릴 수 있다. /2026-08/hero.webp처럼 달이면 새 파일은 새 URL이고, 옛 URL은 옛 바이트를 유지한다. Hermes 홈 이미지가 드물게 바뀌면 TTL을 길게 두는 편이 단순하다. 자주 바뀌면 버전 prefix가 무효화보다 단순할 때가 많다.

첫 배포 직후 작은 파일을 교체해 무효화가 반영되는 시간을 잰다. 한 번도 안 해 보면 잘못된 파일이 CDN에 남는 사고를 늦게 발견한다. 버킷 전체를 비우면 홈 이미지가 한꺼번에 다시 받아져 Class B가 튄다. 민감 객체만 지우고 그 URL만 purge한다. 키 폐기는 서명에 쓰던 자격 증명을 폐기하는 일이다. 객체를 지워도 옛 키가 살아 있으면 같은 prefix에 다시 put할 수 있다.

배포 파이프라인 마지막에 공개 prefix를 나열해 env, 로그, 키 파일 확장자가 없는지 검사한다. 실패 시 배포를 멈춘다. 객체 수와 운영 요청 급증 알림을 걸고, 급증이면 put을 잠시 닫는 한 줄을 남긴다. 월말에만 비용을 보면 업로드 스크립트 실수 하룻밤을 늦게 발견한다.

게이트웨이 프로세스가 객체를 만드는 경로

메시징 게이트웨이는 한 백그라운드 프로세스다. Hermes Agent docs와 messaging gateway 문서가 그 위치를 설명한다. 그 프로세스에 공개 prefix 쓰기 권한이 있으면 대화 한 줄이 곧 업로드가 된다. 홈 에셋 업로더와 게이트웨이 자격 증명을 나누면 그 입구가 줄어든다. 프롬프트에 넣는 경로가 공개 CDN인지 내부인지를 명시하지 않으면, 모델이 공개 URL을 로그에 반복해 남길 수 있다. 내부 분석용 원본은 서명 URL이나 서버 로컬 마운트로만 읽는다.

공개 put을 열어 두면 스팸이 먼저 온다. 인증된 업로더만 put 가능하게 하고, 콘텐츠 타입, 크기 상한, 경로 prefix를 고정한다. 업로드 스크립트를 만능으로 만들지 않는다. CopyObject와 멀티파트 완료도 Class A다. PutObject 한 건이 작은 파일이면 A 한 건이다. 100MiB 이상 이전은 멀티파트로 여러 A가 발생한다. Super Slurper와 Sippy가 도구 자체는 무료여도, 이 A와 원본 버킷 과금은 남는다.

저장 클래스를 고를 때는 읽기 빈도가 본체다. Hermes 홈 이미지는 방문마다 get이 난다. Standard Class B는 100만 건당 0.36달러이고 무료 티어 1,000만이 있다. Infrequent Class B는 100만 건당 0.90달러이고 무료 티어가 없으며 검색 0.01달러/GB가 붙는다. 자주 읽는 홈 에셋을 Infrequent에 두면 저장 0.01달러/GB-월이 싸 보여도, 읽기와 검색이 본체가 된다. 적용 직전 콘솔 계산기와 공식 요금 페이지가 기준이다. 요금 페이지 갱신일은 2026-08-07이다.

마무리

앞에서 다룬 Cloudflare R2와 Hermes 홈·파일 서빙의 핵심만 짧게 정리한다.

  • Standard 저장 0.015달러/GB-월, Class A 4.50달러/100만, Class B 0.36달러/100만, 이그레스 0달러(2026년 8월 문서).
  • 무료 티어 저장 10GB, Class A 100만, Class B 1,000만은 Standard에만 적용된다.
  • Infrequent Access는 검색 요금과 30일 최소 보관이 있고 무료 티어가 없다.
  • 다른 종량제 서비스를 붙이면 그 서비스가 따로 청구할 수 있다.
  • 공개 버킷과 비공개 원본, 업로드 경로와 읽기 경로를 나눈다.
  • 공개 URL이 퍼진 뒤에는 삭제, 퍼지, 키 폐기가 한 세트다.
  • 요금 숫자는 적용 직전 콘솔과 공식 문서로 대조한다.

「이그레스 무료는 저장과 put이 공짜라는 뜻이 아니다」 누가 읽어도 되는지 모호하면 비공개로 둔다. Hermes 프롬프트에 넣는 경로가 공개 CDN인지 내부인지가 사고의 시작이다.

출처와 링크

조사 기준: 2026년 8월. 요금표와 공개/비공개 경계는 설정 직전 공식 문서를 다시 본다.

FAQ

자주 묻는 질문

R2면 트래픽 비용이 항상 0인가?

인터넷 이그레스 줄은 문서상 0달러다. 저장과 Class A/B는 별 축이다. Workers나 변환 워커처럼 다른 종량제 서비스를 버킷에 연결하면 그 서비스가 따로 청구할 수 있다.

무료 티어 10GB면 홈 이미지 운영이 끝나는가?

저장 10GB와 Class A 100만, Class B 1,000만은 Standard에만 적용된다. 문서 자산 호스팅 예는 하루 1,000만 읽기면 Class B만으로 월 104.40달러가 된다.

Infrequent Access가 홈 이미지에 맞는가?

저장 단가는 더 싸지만 검색 요금과 30일 최소 보관이 있고 무료 티어가 없다. 자주 읽히는 홈 에셋은 Standard가 보통 맞다. 짧은 보관용으로 고르면 최소 기간 때문에 더 비쌀 수 있다.

이미지와 문서 버킷을 반드시 나누는가?

캐시 헤더와 공개 범위, 수명 정책이 달라지기 쉽다. 한 버킷에 섞으면 권한 실수가 커진다. 공개 변환본과 비공개 원본을 나누는 편이 사고 면적이 작다.

민감 파일을 공개 prefix에 올렸다면 삭제만으로 끝나는가?

끝나지 않는다. 북마크와 크롤러, CDN 캐시가 남는다. 삭제와 캐시 퍼지, 객체 키 폐기를 한 세트로 둔다. 공개 URL이 퍼졌다고 가정한다.

Hermes 프롬프트에 CDN URL을 넣어도 되는가?

그 URL은 외부에서도 같은 파일을 본다. 내부 분석 원본은 서명 URL이나 로컬 마운트가 맞다. 게이트웨이 프로세스에 공개 prefix 쓰기가 있으면 대화 한 줄이 업로드가 된다.

임시 r2.dev URL을 본문에 먼저 넣어도 되는가?

커스텀 도메인과 캐시 규칙이 정해지기 전에 넣으면 본문이 퍼진 뒤 일괄 치환이 된다. 버전 prefix를 정한 뒤 올리는 순서가 안전하다.