테마 전환

무료 이미지 호스팅 고민 끝: Cloudflare R2 + PicGo로 안정적인 이미지 호스팅 구축하기

Easton editorial illustration: global cache relay

2023년에는 블로그 이미지를 GitHub에 올리고 jsDelivr CDN과 함께 사용했습니다. 한동안은 꽤 괜찮았습니다. 그런데 jsDelivr가 중국 내에서 차단되면서 블로그 이미지가 전부 깨진 이미지로 바뀌었습니다. 이후 무료 이미지 호스팅을 몇 가지 써봤지만, 어떤 곳은 이유 없이 이미지를 삭제했고 어떤 곳은 서비스가 중단되어 사라졌습니다. Qiniu Cloud나 Alibaba Cloud OSS는 안정적이지만, 중국 내 서비스라 도메인 ICP 등록이 필요하고 초과 과금 위험도 있습니다.

Cloudflare R2는 10GB 무료 저장 공간, 월 100만 회 업로드, 월 1000만 회 읽기 한도를 제공합니다. 핵심은 아웃바운드 트래픽이 완전히 무료라는 점입니다. 반년 동안 사용하면서 비용은 한 푼도 들지 않았고, 접근 속도도 나쁘지 않았습니다. PicGo와 함께 쓰면 한 번의 업로드로 이미지를 바로 올릴 수 있어 경험도 매끄럽습니다. 이 글에서는 왜 R2를 선택했는지, 공개 접근은 어떻게 설정하는지, PicGo를 R2에 어떻게 연결하는지까지 전체 구축 과정을 정리합니다. 30분이면 끝낼 수 있습니다.

10GB
무료 저장 공간
개인 블로그에 충분
100만
월 업로드 횟수
Class A 작업
1000만
월 읽기 횟수
Class B 작업
Source: R2 무료 한도

왜 R2를 이미지 호스팅으로 선택했을까?

R2를 쓰기로 결정하기 전에는 꽤 많은 방식을 비교했습니다. 먼저 여러 무료 이미지 호스팅 방식의 현실을 살펴보면, 제가 왜 최종적으로 R2를 선택했는지 이해하기 쉬울 것입니다.

다른 무료 이미지 호스팅 방식의 문제

GitHub + jsDelivr: 한때는 정말 매력적인 조합이었습니다. 하지만 지금은 더 이상 어렵습니다. jsDelivr가 중국 내에서 DNS 오염으로 차단되면서 블로그 이미지가 전혀 로드되지 않습니다. 솔직히 말하면 GitHub에 이미지를 저장하는 것 자체도 일종의 오용에 가깝습니다. 이미지를 업로드할 때마다 commit이 생겨 제출 기록이 지저분해지고, 혹시 계정이 차단되면 모든 이미지가 사라질 수 있습니다.

무료 공용 이미지 호스팅(예: SM.MS, 路过图床 등): 이런 서비스의 가장 큰 문제는 불안정성입니다. 어떤 서비스는 사용자 이미지를 이유 없이 삭제하고, 어떤 서비스는 그대로 종료되어 사라집니다. 이미지 호스팅 서비스가 중단되는 바람에 정성껏 쓴 글 전체가 깨진 이미지로 변한 블로그를 너무 많이 봤습니다. 무료 서비스는 확실히 매력적이지만, 블로그의 이미지 자산을 전부 그 위에 올려둘 수 있을까요?

중국 클라우드 서비스 제공사(Qiniu Cloud, Alibaba Cloud OSS, Tencent Cloud COS): 이런 서비스는 확실히 안정적입니다. Qiniu Cloud도 10GB 무료 한도를 제공합니다. 하지만 핵심 문제는 중국 내 클라우드 서비스가 모두 도메인 ICP 등록을 요구한다는 점입니다. 개인 블로그 입장에서는 등록 절차가 번거롭고, 초과 과금 위험도 있습니다. 비용 자체는 높지 않을 수 있습니다. 10GB를 넘으면 한 달에 몇 위안 정도일 수도 있습니다. 그래도 마음이 편하지 않습니다.

R2의 핵심 장점

비교해보면 Cloudflare R2는 현재 개인 이미지 호스팅의 최적해에 가깝습니다. 반년 동안 사용하며 정리한 핵심 장점은 다음과 같습니다.

1. 무료 한도가 매우 넉넉합니다

R2의 무료 한도는 다음과 같습니다.

  • 저장 공간: 10GB
  • 월 업로드 횟수: 100만 회, Class A 작업
  • 월 읽기 횟수: 1000만 회, Class B 작업

개인 블로그에는 이 한도가 충분하고도 남습니다. 제 블로그에는 글이 100편이 넘고 이미지가 약 500장 있는데, 전체 사용량은 2GB도 되지 않습니다. 이 속도라면 10GB로 몇 년은 사용할 수 있습니다. 설령 실제로 초과하더라도 비용은 저렴합니다. 저장 비용은 $0.015/GB/월이고, 환산하면 1GB당 월 0.1위안 정도입니다.

2. 아웃바운드 트래픽이 완전히 무료입니다

이것이 R2가 AWS S3와 비교해 가장 크게 앞서는 지점입니다. S3나 Alibaba Cloud OSS 같은 전통적인 클라우드 스토리지는 아웃바운드 트래픽에 비용을 청구합니다. GB당 몇 마오에서 몇 위안까지 다양합니다. 블로그 방문자가 많아지면 이 비용이 저장 비용보다 더 커질 수도 있습니다.

반면 R2의 아웃바운드 트래픽은 완전히 무료입니다. 이미지가 몇 번 열리든, 몇 번 다운로드되든 추가 비용이 발생하지 않습니다. Cloudflare가 자체 글로벌 CDN 네트워크, 즉 100개 이상 국가와 275개 도시의 네트워크를 활용해 콘텐츠를 배포하기 때문입니다. 트래픽이 내부 네트워크를 타므로 별도 비용을 부과하지 않습니다.

3. 대형 서비스의 안정성을 기대할 수 있습니다

Cloudflare는 세계 최대 CDN 서비스 제공사 중 하나이며 시가총액도 수백억 달러 규모입니다. 이런 서비스를 쓰면 적어도 갑자기 사라지거나 이미지를 임의로 삭제할 걱정은 줄어듭니다. 게다가 Cloudflare는 개인 사용자에게 특히 우호적인 서비스가 많아 좋은 평판을 얻고 있습니다.

4. S3 API와 호환되어 나중에 이전하기 쉽습니다

R2는 AWS S3 API 표준과 완전히 호환됩니다. 즉, 나중에 MinIO나 Alibaba Cloud OSS처럼 S3 프로토콜을 지원하는 다른 서비스로 옮기고 싶다면 설정만 조금 바꾸면 됩니다. 코드나 도구를 다시 작성할 필요가 없습니다. 이런 유연성 덕분에 특정 업체에 묶일 걱정이 줄어듭니다.

5. ICP 등록 없이 바로 사용할 수 있습니다

R2는 국제 서비스라서 자신의 도메인을 연결해도 중국 내 ICP 등록이 필요 없습니다. Cloudflare 계정을 만들고 R2를 활성화한 뒤 설정을 끝내는 데 전체 30분이면 충분합니다. 개인 블로그 운영자에게는 정말 편한 조건입니다.

작은 주의사항

R2에서 유일하게 주의할 점은 서비스를 활성화할 때 신용카드나 PayPal을 연결해야 한다는 것입니다. 이는 신원 확인용일 뿐 자동 결제되지 않습니다. 저도 처음에는 잠깐 망설였지만, 연결 후 실제로 확인용이라는 것을 알았습니다. 반년 동안 사용하면서 비용은 1센트도 발생하지 않았습니다. 그래도 걱정된다면 가상 신용카드를 쓰거나 중국 내 PayPal을 연결해도 됩니다.

이제 장점을 충분히 봤으니 실제 구축을 시작해보겠습니다.

Cloudflare R2 + PicGo 이미지 호스팅 전체 구축 과정

R2 등록부터 PicGo 원클릭 업로드 설정까지, 30분 안에 완전히 무료에 가까운 개인 이미지 호스팅을 구축하는 단계별 가이드

Estimated time: PT30M

  1. 1

    Step 1: 단계 1: R2 서비스 가입 및 활성화

    Cloudflare 계정을 만든 뒤 왼쪽 사이드바에서 R2 Object Storage를 찾아 서비스를 활성화합니다.
  2. 2

    Step 2: 단계 2: 버킷 생성

    오른쪽 위의 버킷 생성을 클릭하고 blog-images처럼 식별하기 쉬운 이름을 입력합니다. 이름은 전역에서 고유해야 합니다.
  3. 3

    Step 3: 단계 3: 공개 접근 설정, 핵심 단계

    방법 1, 테스트용:
  4. 4

    Step 4: 단계 4: API 토큰 생성

    R2의 Overview 페이지로 돌아가 Manage R2 API Tokens → Create API Token을 클릭합니다.
  5. 5

    Step 5: 단계 5: PicGo와 S3 플러그인 설치

    PicGo 다운로드:
  6. 6

    Step 6: 단계 6: PicGo S3 이미지 호스팅 파라미터 설정

    이미지 호스팅 설정 → Amazon S3를 클릭하고 다음 파라미터를 입력합니다.
  7. 7

    Step 7: 단계 7: 업로드 테스트

    테스트 순서:
  8. 8

    Step 8: 단계 8: 최적화 설정, 선택 사항

    캐시 규칙 설정:

R2 이미지 호스팅 구축 상세 단계

이제 실전으로 들어가겠습니다. 각 단계를 분명하게 설명할 테니 그대로 따라 하면 됩니다.

1단계: R2 서비스 가입 및 활성화

먼저 Cloudflare 계정이 필요합니다. 아직 없다면 Cloudflare 공식 사이트에서 무료로 가입하세요. 이메일과 비밀번호만 입력하면 되므로 간단합니다.

가입 후 로그인하면 왼쪽 사이드바에서 R2 Object Storage를 찾을 수 있습니다. 처음 사용하는 경우 서비스 활성화를 안내합니다.

핵심은 여기입니다: R2를 활성화하려면 결제 수단, 즉 신용카드나 PayPal을 연결해야 합니다.

이 부분은 꼭 설명하고 싶습니다. 많은 사람이 이 단계에서 물러서고, 저도 처음에는 망설였습니다. 하지만 이는 신원 확인용일 뿐 자동으로 결제되지 않습니다. Cloudflare의 무료 한도는 실제로 무료이며, 사용자가 한도를 초과하고 유료 사용을 직접 확인한 경우에만 비용이 청구됩니다.

연결할 수 있는 수단은 다음과 같습니다.

  • 해외 결제를 지원하는 신용카드, Visa나 MasterCard 모두 가능
  • PayPal, 중국 내 PayPal도 지원
  • 가상 신용카드, 보안이 걱정된다면 이 방법도 가능

연결을 마친 뒤 R2 서비스 활성화를 클릭하면 몇 초 만에 완료됩니다.

2단계: 버킷 생성

R2를 활성화한 뒤 오른쪽 위의 버킷 생성 버튼을 클릭합니다.

버킷 이름: blog-images, my-pics처럼 구분하기 쉬운 이름을 정합니다. 이 이름은 전역에서 고유해야 하므로 이미 사용 중이면 다른 이름으로 바꿔야 합니다.

위치 선택: 여기에는 작은 팁이 있습니다.

많은 튜토리얼은 별 고민 없이 아시아 태평양(APAC)을 추천합니다. 중국과 가까워 속도가 빠르다는 이유입니다. 하지만 반드시 그런 것은 아닙니다. 두 위치를 모두 써보니 차이는 이랬습니다.

  • 아시아 태평양: 중국 내 접근은 확실히 조금 빠르지만 국제 접근 속도는 제한될 수 있습니다.
  • 북미 서부(WNAM): Cloudflare CDN과 함께 쓰면 전 세계 접근 속도가 비교적 균형적이고, 중국 내 속도도 받아들일 만합니다.

저는 개인적으로 북미 서부를 선택했습니다. 블로그에 해외 독자가 있을 수도 있어서 전체 경험이 더 낫다고 판단했습니다. 자신의 독자층에 맞게 선택하면 됩니다.

스토리지 클래스: Standard를 선택하면 됩니다.

그다음 Create를 클릭하면 몇 초 후 버킷이 생성됩니다.

3단계: 공개 접근 설정, 핵심 단계

버킷을 만든 뒤 버킷 설정 페이지로 들어갑니다. 다음 단계가 매우 중요합니다. 많은 사람이 여기에서 막힙니다.

R2는 기본적으로 비공개입니다. 이미지를 공개적으로 접근 가능하게 만들려면 두 가지 방식이 있습니다.

방법 1: r2.dev 하위 도메인 활성화, 테스트에 적합

가장 간단한 방식이며 처음 테스트할 때 적합합니다.

  1. 버킷 설정 페이지에서 아래로 내려 R2.dev 하위 도메인을 찾습니다.
  2. Allow Access를 클릭합니다.
  3. 확인 창에 allow를 입력한 뒤 확인합니다.

완료되면 Cloudflare가 공개 접근 URL을 생성합니다. 형태는 다음과 비슷합니다.

https://pub-xxxxx.r2.dev

하지만 여기에는 중요한 함정이 있습니다: r2.dev 하위 도메인에는 접근 속도 제한이 있습니다. 개발과 테스트에는 적합하지만, 블로그 방문자가 많아지면 제한에 걸려 이미지 로딩이 실패할 수 있습니다. Cloudflare도 운영 환경에서는 커스텀 도메인을 사용하라고 명확히 안내합니다.

저도 처음 설정할 때 이 점을 놓쳤습니다. 블로그 방문량이 조금 늘자 이미지 로딩이 실패했고, 나중에야 커스텀 도메인으로 바꿨습니다. 꽤 뼈아픈 경험이었습니다.

방법 2: 커스텀 도메인 연결, 운영 환경 권장

자신의 도메인이 있다면 이 방식을 강력히 권장합니다. 속도 제한이 없고 캐시, 핫링크 방지 같은 고급 기능도 설정할 수 있습니다.

전제 조건: 도메인이 이미 Cloudflare에 위임되어 있어야 합니다. 즉, 도메인의 DNS 서버를 Cloudflare로 바꾼 상태여야 합니다. 아직 아니라면 Cloudflare 콘솔에서 도메인을 추가하고 안내에 따라 DNS 서버를 수정하면 됩니다. 무료입니다.

설정 단계:

  1. 버킷 설정 페이지에서 Custom Domains를 찾습니다.
  2. Add를 클릭합니다.
  3. 사용하려는 하위 도메인을 입력합니다. 예: img.yourdomain.com
  4. Continue를 클릭합니다.
  5. Cloudflare가 DNS 레코드에 CNAME 레코드를 자동으로 추가합니다.
  6. Connect Domain을 클릭합니다.

몇 분 동안 DNS가 적용되기를 기다리면 커스텀 도메인을 사용할 수 있습니다. 이후 이미지 URL은 다음과 같은 형태가 됩니다.

https://img.yourdomain.com/path/to/image.png

저도 커스텀 도메인을 사용하고 있습니다. 뒤에서 설명할 캐시 전략과 함께 쓰면 안정적이고 빠릅니다.

4단계: API 토큰 생성

공개 접근 설정을 마쳤다면 API 키를 생성해야 합니다. 그래야 PicGo가 R2에 연결해 이미지를 업로드할 수 있습니다.

  1. R2의 Overview 페이지로 돌아갑니다.
  2. 오른쪽 위의 Manage R2 API Tokens를 클릭합니다.
  3. Create API Token을 클릭합니다.
  4. 토큰 이름을 정합니다. 예: PicGo-Upload
  5. 권한은 Object Read & Write를 선택합니다.
  6. Create API Token을 클릭합니다.

매우 중요합니다! 생성이 완료되면 Cloudflare가 세 가지 정보를 표시합니다.

  • Access Key ID
  • Secret Access Key
  • S3 API endpoint, 예: https://xxxxx.r2.cloudflarestorage.com

이 세 정보는 한 번만 표시됩니다. 페이지를 닫으면 다시 볼 수 없습니다. 반드시 즉시 복사해 안전한 곳에 저장하세요. 비밀번호 관리자나 로컬 암호화 파일이 좋습니다.

실수로 닫았다면 토큰을 삭제하고 다시 생성할 수밖에 없습니다. 저도 처음에는 손이 빨라서 닫아버렸고, 결국 다시 만들었습니다. 제 실수는 따라 하지 마세요.

작은 팁: S3 API endpoint는 Overview → Use R2 with S3 API에서도 찾을 수 있습니다. HTTPS로 시작하는 그 URL입니다.

이제 R2 쪽 설정은 끝났습니다. 다음은 PicGo 설정입니다.

PicGo 설정 실전

PicGo는 오픈소스 이미지 업로드 도구이며 여러 이미지 호스팅 서비스를 지원합니다. 설정을 마치면 이미지를 드래그해 업로드하고 Markdown 형식의 이미지 링크를 자동으로 만들 수 있어 매우 편합니다.

1단계: PicGo와 S3 플러그인 설치

PicGo 다운로드

PicGo 공식 사이트 또는 GitHub Release 페이지에서 운영체제에 맞는 설치 파일을 다운로드합니다.

  • Windows: .exe 파일 다운로드
  • macOS: .dmg 파일 다운로드
  • Linux: .AppImage 파일 다운로드

설치는 간단합니다. 안내에 따라 다음 단계로 진행하면 됩니다.

고급 사용자에게 추천: PicList

더 많은 기능이 필요하다면 PicGo의 2차 개발 프로젝트인 PicList를 추천합니다. PicGo 기반에 다음 기능이 추가되어 있습니다.

  • 이미지 관리 기능, 업로드한 이미지를 확인하거나 삭제 가능
  • 이미지 압축, 손실 및 무손실 지원
  • 형식 변환, WebP 변환 등
  • 워터마크 추가

저는 지금 PicList를 사용하고 있습니다. 기능이 더 완성도 높습니다. 설치 방법은 PicGo와 같습니다.

S3 플러그인 설치

PicGo는 기본적으로 S3 프로토콜을 지원하지 않으므로 플러그인을 설치해야 합니다.

  1. PicGo를 열고 왼쪽의 플러그인 설정을 클릭합니다.
  2. 검색창에 s3를 입력합니다.
  3. 몇 가지 플러그인이 나오며, picgo-plugin-s3 또는 s3-lls 설치를 권장합니다. 둘 다 사용할 수 있고 기능도 비슷합니다.
  4. Install을 클릭하고 설치가 끝날 때까지 기다립니다.

주의: 플러그인 설치에는 Node.js 환경이 필요합니다. 설치에 실패한다면 원인은 다음 중 하나일 수 있습니다.

  • 네트워크 문제, 플러그인을 GitHub에서 내려받기 때문에 중국 내에서는 느릴 수 있습니다.
  • Node.js 환경이 없음. Node.js 공식 사이트에서 내려받아 설치하세요.
  • 권한 문제. Windows 사용자는 관리자 권한이 필요할 수 있습니다.

정말 설치가 되지 않는다면 오프라인 설치를 시도하거나 다른 네트워크 환경을 사용해보세요.

2단계: S3 이미지 호스팅 파라미터 설정

플러그인 설치가 끝나면 왼쪽의 이미지 호스팅 설정을 클릭하고 Amazon S3, 또는 AWS S3 항목으로 들어가 설정합니다.

이 부분이 중요합니다. 각 파라미터를 정확히 입력해야 하므로 하나씩 설명하겠습니다.

Access Key ID

앞서 R2에서 API 토큰을 만들 때 저장한 Access Key ID를 입력합니다.

Secret Access Key

Secret Access Key를 입력합니다.

이 두 값을 뒤바꾸지 않도록 주의하세요. ID는 비교적 짧은 문자열이고, Secret은 더 긴 문자열입니다.

Bucket Name

R2에서 만든 버킷 이름을 입력합니다. 예: blog-images

주의할 점은 버킷 이름이지 ARN도 URL도 아니라는 것입니다. 버킷을 만들 때 입력한 바로 그 이름입니다.

Upload Path

이 값은 업로드한 이미지가 버킷 안에서 어떻게 정리될지를 결정합니다. 추천 형식은 다음과 같습니다.

  • {year}/{month}/{md5}.{extName} - 연월별로 분류하고 파일명은 MD5를 사용해 중복을 피합니다.
  • PicGo/{fullName} - 모두 PicGo 폴더 아래에 두고 원래 파일명을 유지합니다.
  • {year}/{month}/{fullName} - 연월별로 분류하고 원래 파일명을 유지합니다.

저는 첫 번째 방식을 사용합니다. 파일명 중복을 피할 수 있고 시간 기준 관리도 편합니다.

중요한 주의사항: 경로 앞에 /를 붙이지 마세요. 바로 {year}/{month}/...처럼 쓰면 됩니다. 앞에 /를 붙이면 업로드 실패나 경로 오류가 생길 수 있습니다.

Endpoint

앞서 저장한 S3 API endpoint를 입력합니다. 형식은 https://xxxxx.r2.cloudflarestorage.com입니다.

반드시 https://를 포함해야 합니다. 빠뜨리지 마세요.

Custom Domain

여기에는 공개 접근 도메인을 입력합니다. 앞서 선택한 방식에 따라 다릅니다.

  • 커스텀 도메인을 사용한다면: https://img.yourdomain.com
  • r2.dev를 사용한다면: Public Bucket URL을 입력합니다. R2 버킷 설정에서 볼 수 있으며 https://pub-xxxxx.r2.dev와 비슷합니다.

이 도메인은 최종 생성되는 이미지 링크를 결정하므로 정확히 입력해야 합니다.

기타 파라미터

  • Region: 아무 값이나 입력해도 됩니다. 예: auto 또는 us-east-1. R2는 이 값을 중요하게 보지 않습니다.
  • 업로드 방식: Path Style을 선택합니다.

3단계: 업로드 테스트

설정을 마쳤다고 바로 실사용하지 말고 먼저 테스트하세요.

  1. 확인을 클릭해 설정을 저장합니다.
  2. 기본 이미지 호스팅으로 지정합니다. 이후 업로드가 자동으로 R2를 사용합니다.
  3. 왼쪽의 업로드 영역을 클릭합니다.
  4. 테스트 이미지를 드래그하거나 이미지 선택을 클릭해 업로드합니다.

설정이 올바르면 몇 초 후 업로드 성공 안내가 나오고 이미지 링크가 자동으로 클립보드에 복사됩니다.

링크 확인: 링크를 브라우저에 붙여 넣고 이미지가 정상적으로 표시되는지 확인합니다. 이미지가 보이면 성공입니다.

흔한 오류와 해결 방법

업로드에 실패했다면 다음 항목을 확인하세요.

  1. Access Denied 또는 403 오류
    • API 키가 올바른지 확인합니다. ID와 Secret을 뒤바꾸지 마세요.
    • API 토큰 권한에 Object Read & Write가 포함되어 있는지 확인합니다.
    • 버킷 이름이 정확한지 확인합니다.
  2. 이미지 업로드는 성공했지만 접근할 수 없음
    • 공개 접근을 켰는지 확인합니다. r2.dev 또는 커스텀 도메인입니다.
    • 커스텀 도메인을 정확히 입력했는지 확인합니다. https://를 포함해야 합니다.
    • 몇 분 기다립니다. DNS가 아직 적용되지 않았을 수 있습니다.
  3. 업로드 속도가 매우 느리거나 타임아웃됨
    • 네트워크 문제일 수 있습니다. R2는 해외에 있어 업로드가 조금 느릴 수 있습니다.
    • 이미지가 너무 크면 먼저 압축하세요. PicList에는 압축 기능이 내장되어 있습니다.
  4. 파일 경로 오류 또는 이상한 디렉터리 생성
    • 파일 경로 앞에 /를 붙였는지 확인하고 제거합니다.
    • 경로 형식이 올바른지 확인합니다.

저는 처음 설정할 때 Key ID와 Secret을 뒤바꾸는 바람에 한참을 헤맸습니다. 문제가 생기면 먼저 각 파라미터를 차분히 확인하세요. 대부분은 설정값을 잘못 입력해서 생깁니다.

최적화와 고급 팁

여기까지 오면 기본적인 이미지 호스팅 기능은 이미 사용할 수 있습니다. 하지만 더 안정적이고 빠르고 마음 편하게 쓰려면 몇 가지 최적화 팁을 알아두면 좋습니다.

캐시 전략 설정, 강력 추천

커스텀 도메인을 사용한다면 반드시 캐시 규칙을 설정하세요. 이렇게 하면 세 가지 장점이 있습니다.

  • R2 요청 횟수를 줄여 무료 한도를 초과할 가능성을 낮춥니다.
  • 이미지 로딩 속도가 빨라집니다. CDN 캐시에서 바로 반환됩니다.
  • 악의적인 트래픽 남용을 어느 정도 막을 수 있습니다.

설정 방법:

  1. Cloudflare 콘솔에 들어가 자신의 도메인을 선택합니다.
  2. 왼쪽에서 Rules → Page Rules 또는 Cache Rules를 클릭합니다.
  3. 새 규칙을 만들고 URL을 img.yourdomain.com/*로 매칭합니다. 자신의 도메인으로 바꾸세요.
  4. 다음과 같이 설정합니다.
    • 캐시 수준: 모든 콘텐츠 캐시
    • Edge Cache TTL: 1개월에서 1년 사이, 6개월 권장
    • Browser Cache TTL: 1개월

설정 후에는 이미지가 처음 열릴 때만 R2에서 읽히고, 이후에는 Cloudflare CDN 캐시에서 반환됩니다. 사실상 R2 읽기 횟수를 거의 사용하지 않게 됩니다.

저는 6개월 캐시를 설정해두었습니다. 꽤 오래 사용했지만 실제 R2 요청 횟수는 수천 회뿐이고, 무료 한도 안에 완전히 들어옵니다.

수천 회
실제 요청 횟수
Source: 6개월 캐시 전략 적용 후

중국 내 접근 가속, 선택 사항

Cloudflare CDN의 중국 내 속도는 지역에 따라 다소 운에 맡겨지는 느낌이 있습니다. 어떤 지역은 괜찮고 어떤 지역은 느릴 수 있습니다. 블로그가 주로 중국 내 사용자를 대상으로 한다면 다음 가속 방식을 고려할 수 있습니다.

방법 1: Tencent Cloud EdgeOne

Tencent Cloud가 제공하는 해외판 CDN입니다. 무료이며 ICP 등록 없이 R2 가속에 사용할 수 있습니다.

  • 장점: 중국 내 접근 속도가 빠르고 무료 한도도 충분합니다.
  • 단점: Tencent Cloud 계정을 따로 만들어야 하며 설정이 약간 복잡합니다.

방법 2: WebP Cloud

이미지 프록시와 최적화에 특화된 서비스입니다. 이미지를 자동으로 WebP 형식으로 변환하고 캐시할 수 있습니다.

  • 장점: 이미지를 자동 압축해 트래픽을 절약합니다.
  • 단점: 요청 횟수 제한이 있고 초과하면 유료입니다.

방법 3: 국내외 분리

rclone 도구로 R2 이미지를 중국 내 클라우드, 예를 들어 Tencent Cloud COS에 동기화합니다. 중국 내 사용자는 중국 이미지 호스팅을, 해외 사용자는 R2를 보게 하는 방식입니다.

  • 장점: 중국 내외 모두 빠릅니다.
  • 단점: 어느 정도 기술 역량이 필요하고 유지 비용이 높습니다.

솔직히 저는 가장 간단한 방법인 커스텀 도메인 + 캐시 규칙을 사용합니다. 가장 빠른 방식은 아니지만 중국 내 로딩 속도도 받아들일 만합니다. 대략 1-3초 정도입니다. 개인 블로그에는 충분합니다. 속도 요구가 정말 높다면 그때 가속 방식을 고려해도 됩니다.

보안과 보호

이미지 호스팅을 구축한 뒤에는 남용을 막는 것도 중요합니다.

r2.dev 접근 비활성화

이미 커스텀 도메인을 설정했다면 r2.dev의 공개 접근을 꺼두는 것이 좋습니다. 그렇지 않으면 누군가 r2.dev 도메인을 통해 핫링크 방지 같은 규칙을 우회할 수 있습니다.

방법: 버킷 설정 → R2.dev 하위 도메인 → Disallow Access를 클릭하고 disallow를 입력해 확인합니다.

핫링크 방지 설정

Cloudflare의 WAF(Web Application Firewall)를 사용하면 자신의 사이트에서만 이미지를 참조하도록 제한할 수 있습니다.

간단한 설정:

  1. Cloudflare 콘솔 → Security → WAF
  2. 커스텀 규칙 생성
  3. 조건: Referer에 yourblog.com이 포함되어 있지 않음
  4. 동작: 차단 또는 챌린지

이렇게 하면 다른 사이트가 당신의 이미지 링크를 마음대로 가져다 쓰기 어렵습니다.

사용량 모니터링

초과 사용을 막기 위해 R2 사용량을 정기적으로 확인하세요.

R2 콘솔에서는 다음 항목을 볼 수 있습니다.

  • 저장 공간 사용량
  • 월 요청 횟수, Class A 및 Class B

사용량이 비정상적으로 늘어난다면 누군가 트래픽을 과도하게 발생시키는지 즉시 확인해야 합니다.

결론

여기까지 하면 R2 이미지 호스팅 구축이 모두 끝납니다.

우리가 한 일을 다시 정리하면 다음과 같습니다.

  1. Cloudflare R2에 가입하고 활성화해 10GB 무료 저장 공간을 확보했습니다.
  2. 버킷을 만들고 공개 접근을 설정했습니다. 커스텀 도메인 또는 r2.dev 방식입니다.
  3. PicGo 연결을 위한 API 토큰을 생성했습니다.
  4. PicGo를 설치하고 설정해 이미지를 한 번에 업로드할 수 있게 했습니다.
  5. 캐시와 보안 전략을 설정해 이미지 호스팅을 더 안정적으로 만들었습니다.

이제 이미지 호스팅 서비스가 이미지를 삭제하거나, 갑자기 사라지거나, 예상치 못한 비용을 청구할 걱정을 크게 줄일 수 있습니다. 블로그를 쓸 때 이미지를 PicGo에 끌어다 놓으면 자동으로 업로드되고 링크가 생성됩니다. 그 링크를 Markdown에 붙여 넣으면 됩니다. 전체 흐름이 아주 매끄럽습니다.

솔직히 R2 이미지 호스팅을 구축한 것은 지난 2년 동안 제가 한 가장 좋은 결정 중 하나였습니다. 처음 설정할 때는 시간이 조금 걸렸습니다. 주로 함정을 밟았기 때문입니다. 하지만 사용하기 시작한 뒤로는 정말 편합니다. 지금까지 반년 넘게 안정적으로 운영했고, 이미지 500장 이상을 저장했으며, 비용은 한 푼도 들지 않았고 장애도 겪지 않았습니다.

이미지 호스팅 문제로 고민하고 있다면 R2를 꼭 한 번 시도해보길 권합니다. 이 글의 단계대로 따라 하면 30분이면 충분합니다. 문제가 생겨도 당황하지 마세요. 대부분은 설정 파라미터를 잘못 입력한 경우라 한 번 꼼꼼히 확인하면 해결됩니다.

마지막으로 한 가지를 다시 상기합니다. 설정을 마친 뒤 API 키를 잘 저장해두세요. 나중에 다시 설정하거나 컴퓨터를 바꿔야 할 때 기존 키를 바로 사용할 수 있고, 새로 만들 필요가 없습니다.

이제 당신만의 무료 이미지 호스팅을 구축해보세요. 문제가 있으면 댓글로 남겨주세요. 확인하면 답변하겠습니다.

FAQ

Cloudflare R2의 무료 한도는 얼마인가요?
R2 무료 한도는 다음과 같습니다.
• 저장 공간 10GB
• 월 100만 회 업로드, 즉 Class A 작업
• 월 1000만 회 읽기, 즉 Class B 작업
• 아웃바운드 트래픽 완전 무료

개인 블로그 이미지 500장은 보통 2GB도 되지 않아 몇 년은 충분히 사용할 수 있습니다.

초과 시 비용:
• 저장 비용: $0.015/GB/월, 1GB당 월 0.1위안 정도
• 작업 비용: Class A $4.50/백만 회, Class B $0.36/백만 회
R2는 다른 이미지 호스팅 방식보다 어떤 장점이 있나요?
핵심 장점은 다음과 같습니다.
1) 아웃바운드 트래픽이 완전히 무료입니다. S3처럼 GB당 몇 마오에서 몇 위안씩 내지 않아도 되며, 이것이 가장 큰 장점입니다.
2) Cloudflare라는 대형 서비스의 안정성을 기대할 수 있습니다. Cloudflare는 세계 최대 CDN 서비스 제공사 중 하나입니다.
3) S3 API와 호환되어 이전이 쉽습니다. 나중에 다른 S3 프로토콜 서비스로 옮길 수 있습니다.
4) 중국 내 ICP 등록 없이 바로 사용할 수 있습니다. 국제 서비스라 30분이면 설정이 끝납니다.
5) 전 세계 CDN 배포를 지원합니다. 100개 이상 국가, 275개 도시의 네트워크를 활용합니다.

다른 방식의 문제:
• GitHub + jsDelivr: 중국 내에서 차단됨
• 무료 공용 이미지 호스팅: 불안정함
• 중국 클라우드 서비스: ICP 등록 필요
R2의 공개 접근은 어떻게 설정하나요?
방법 1, 테스트용:
• 버킷 설정에서 R2.dev 하위 도메인을 찾습니다.
• 접근 허용을 클릭하고 allow를 입력해 확인합니다.
• 주의: r2.dev에는 접근 속도 제한이 있으므로 운영 환경에서는 반드시 커스텀 도메인을 사용해야 합니다.

방법 2, 운영 환경 권장:
• 전제: 도메인이 이미 Cloudflare에 위임되어 있어야 합니다.
• 커스텀 도메인에 하위 도메인, 예를 들어 img.yourdomain.com을 입력합니다.
• Cloudflare가 CNAME 레코드를 자동으로 추가하므로 DNS 적용을 기다리면 됩니다.
PicGo는 R2에 연결하려면 어떻게 설정하나요?
설치 단계:
1. PicGo와 S3 플러그인, 예를 들어 picgo-plugin-s3 또는 s3-lls를 설치합니다.
2. 이미지 호스팅 설정 → Amazon S3에서 설정합니다.

핵심 파라미터:
• Access Key ID
• Secret Access Key
• Bucket Name
• 파일 경로, 예: {year}/{month}/{md5}.{extName}. 앞에 /를 붙이지 마세요.
• Endpoint, https:// 포함
• Custom Domain, 커스텀 도메인 또는 r2.dev URL
• Region, auto처럼 아무 값이나 입력 가능
• 업로드 방식, Path Style

테스트 업로드가 성공하면 바로 사용할 수 있습니다.
R2 이미지 호스팅의 성능과 비용은 어떻게 최적화하나요?
최적화 팁:
1) 캐시 규칙 설정:
• Cloudflare 콘솔 → 규칙 → 캐시 규칙
• img.yourdomain.com/* 매칭
• Edge Cache TTL 6개월, Browser Cache TTL 1개월
• 실제로 요청 수가 수만 회에서 수천 회로 줄었습니다.

2) 커스텀 도메인을 이미 사용한다면 r2.dev 접근을 비활성화합니다.

3) 핫링크 방지 WAF 규칙을 설정합니다. Referer에 yourblog.com이 없으면 차단합니다.

4) 초과 사용을 막기 위해 사용량을 정기적으로 모니터링합니다.

중국 내 접근 속도 개선이 필요하면 Tencent Cloud EdgeOne 또는 WebP Cloud를 선택적으로 고려할 수 있습니다.
R2를 활성화할 때 신용카드를 연결하면 비용이 청구되나요?
자동으로 청구되지 않습니다.

R2를 활성화하려면 신용카드나 PayPal을 연결해야 하지만, 이는 신원 확인용일 뿐 자동 결제되지 않습니다.

Cloudflare의 무료 한도는 실제로 무료이며, 한도를 초과하고 유료 사용을 직접 확인한 경우에만 비용이 발생합니다.

연결 가능한 수단:
• 해외 결제를 지원하는 신용카드, Visa 또는 MasterCard
• PayPal, 중국 내 PayPal도 지원
• 가상 신용카드

실제로 반년 동안 사용하면서 1센트도 비용이 발생하지 않았습니다.
PicGo 업로드 실패 시 흔한 오류는 어떻게 해결하나요?
흔한 오류와 해결 방법:

1) Access Denied 또는 403 오류:
• API 키를 올바르게 입력했는지 확인합니다. ID와 Secret을 뒤바꾸지 마세요.
• API 토큰 권한에 객체 읽기 및 쓰기가 포함되어 있는지 확인합니다.
• 버킷 이름이 정확한지 확인합니다.

2) 이미지 업로드는 성공했지만 접근할 수 없음:
• 공개 접근을 켰는지 확인합니다. r2.dev 또는 커스텀 도메인입니다.
• 커스텀 도메인을 정확히 입력했는지 확인합니다. https://를 포함해야 합니다.
• DNS 적용을 기다립니다.

3) 업로드가 매우 느리거나 타임아웃됨:
• 네트워크 문제일 수 있습니다. R2는 해외에 있습니다.
• 이미지가 너무 크면 먼저 압축합니다.

4) 파일 경로 오류:
• 경로 앞에 /를 붙였는지 확인하고 제거합니다.

대부분의 문제는 설정 파라미터를 잘못 입력해서 생기므로 차분히 확인하면 해결됩니다.

3분 읽기 · 게시일: 2025년 11월 30일 · 수정일: 2026년 10월 21일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog