목차
R2 커스텀 도메인 · 월간클로드 5회에서 다룬 내용
사진 주소도 내 도메인으로, R2 사진 창고에 `img.` 주소 붙이기
R2 커스텀 도메인으로 사진 주소를 pub-….r2.dev 에서 img.내도메인 으로 — 버킷 설정, Cloudflare가 넣는 CNAME 한 줄, 초기화 중에서 활성까지, 사이트 사진 주소 바꾸기와 확인을 실제 화면으로 따라간다.
이 장을 하기 전에
| 있어야 할 것 | 왜 |
|---|---|
사이트 사진이 들어 있는 Cloudflare R2 버킷 — 사진 주소가 https://pub-….r2.dev/… 로 시작한다 | 이 장은 그 주소를 내 도메인으로 바꾸는 순서다 |
| R2 버킷과 같은 Cloudflare 계정에 연결된 내 도메인 | 다른 계정의 도메인은 붙지 않는다(5.2절). 도메인을 사고 연결하는 순서는 2장 |
| 사이트를 만든 폴더를 Claude Code 로 열 수 있다 | 사이트 코드의 사진 주소는 Claude Code가 고치고 다시 올린다(5.5절) |
걸리는 시간은 Cloudflare 화면에서 2~3분, 사이트 코드를 고쳐 다시 올리는 데
몇 분입니다. 이 장의 예시 사이트는 monhuncodi.com — 게임 코디 사진을 모아 둔
사이트이고, 사진 창고(버킷) 이름은 monhuncodi-img 입니다.
새 도메인을 구글 · 네이버 검색에 등록하는 절차는 이 장에서 다시 쓰지 않습니다 — 1장에 있습니다.
5.1 사진 주소는 왜 따로 바꾸나
사이트 주소를 내 도메인으로 바꾸고 나서 사진 하나를 오른쪽 클릭해 주소를 보면, 여전히 이런 모양입니다.
https://pub-(번호).r2.dev/사진이름.jpg
사진이 사이트와 다른 곳에 들어 있기 때문입니다.
📖 R2 · 버킷
R2 는 Cloudflare의 파일 창고입니다. 사진처럼 크고 많은 파일을 사이트 밖에 따로 넣어 둡니다. 창고 안의 칸 하나를 버킷이라고 부릅니다. 버킷 하나에 사이트 하나의 사진을 담는 식입니다.
버킷을 처음 공개하면 Cloudflare가 임시 주소 pub-(번호).r2.dev 를 붙여 줍니다. 그런데
바로 그 주소 칸 아래에 이렇게 적혀 있습니다(2026-10-15 화면).
이 URL은 속도가 제한되므로 프로덕션에는 권장하지 않습니다. 액세스 및 캐싱과 같은 Cloudflare 기능은 사용할 수 없습니다. 사용자 설정 도메인을 버킷에 연결하여 프로덕션 워크로드를 지원하십시오.
「프로덕션」 은 실제로 사람들이 쓰는 사이트라는 뜻입니다. 임시 주소는 만들어 보는 동안 쓰는 주소이고, 사람들이 오는 사이트에는 내 도메인을 붙이라는 안내입니다. Cloudflare 문서도 이 주소를 「개발용, 실제 방문용이 아님」 으로 적어 둡니다.
💡 사이트 주소와 사진 주소는 따로다
사이트(Worker)에 내 도메인을 붙여도, 사진은 사진 창고의 주소로 옵니다. 집 주소를 바꿔도 창고 주소는 그대로인 것과 같습니다. 그래서 창고에도 따로 문패를 답니다.
| 번호 | 지금 | 이 장을 하고 나면 |
|---|---|---|
| 사이트 주소 | monhuncodi.com (2장에서 바꿈) | 그대로 |
| 사진 주소 | pub-(번호).r2.dev/… — 임시 주소 · 속도 제한 | img.monhuncodi.com/… |
5.2 버킷 설정에서 「사용자 설정 도메인」 추가
왼쪽 메뉴 스토리지 및 데이터베이스 → R2 객체 스토리지 → 내 버킷을 누르고, 위 탭에서 「설정」 으로 갑니다.

⚠️ 여기서 막힙니다 — 사이트(Worker)의 「도메인」 탭으로 간다
사이트에 도메인을 붙일 때는 Workers 및 Pages → 내 사이트 → 「도메인」 탭 이었습니다(2장). 사진은 거기가 아닙니다. R2 → 버킷 → 「설정」 입니다. 사진 창고에는 창고 쪽에서 문패를 답니다.
그림 5-1의 ③ 「공개 개발 URL」 이 이미 켜져 있어서, 이걸로 다 된 줄 알기 쉽습니다. 그건 임시 주소입니다. 붙일 곳은 그 위 ② 사용자 설정 도메인입니다. + 추가를 누르면 오른쪽에 창이 열립니다.

📖 하위 주소(하위 도메인)
내 도메인 앞에 이름을 하나 더 붙인 주소.
img.monhuncodi.com은monhuncodi.com안의 방 하나입니다. 도메인을 새로 사지 않고 얼마든지 만들 수 있습니다.
왜 img. 인가. 사이트는 이미 monhuncodi.com 에 붙어 있습니다. 사진 창고에
같은 주소를 붙일 수는 없으니, 앞에 img. 를 붙여 사진 전용 방을 하나 냅니다.
img 는 이미지의 줄임말로 흔히 쓰는 이름입니다. photo. 나 cdn. 처럼 다른 이름도
됩니다.
| 번호 | 할 일 | 됐으면 |
|---|---|---|
| 1 | R2 객체 스토리지 → 내 버킷 → 설정 탭 | 그림 5-1 |
| 2 | 「사용자 설정 도메인」 칸의 + 추가 | 오른쪽에 창이 열린다 |
| 3 | 도메인 칸에 img.내도메인 을 넣고 계속 | 「DNS 레코드 미리 보기」(5.3절) |
창 아래의 「최소 TLS 버전(고급)」 은 건드리지 않습니다.
5.3 주소록 한 줄은 Cloudflare가 넣는다
계속을 누르면 「DNS 레코드 미리 보기」 가 나옵니다. 주소록(DNS)에 이런 줄을 더하겠다고 미리 보여 주는 화면입니다.

📖 CNAME
주소록(DNS)의 줄 종류 하나. 「이 이름으로 오면 저기로 가라」 고 적는 줄입니다. 여기서는 「
img로 오면 사진 창고monhuncodi-img로」 입니다.
이 줄을 직접 적을 일은 없습니다. 도메인이 같은 Cloudflare 계정에 있으면 Cloudflare가 주소록을 알아서 고칩니다. 화면을 보고 도메인 연결만 누릅니다.
5.4 「초기화 중」 → 「활성」 — 몇 분 기다린다
연결을 누르면 목록에 새 주소가 한 줄 생기고, 상태가 「초기화 중」 입니다.

monhuncodi.com 은 1~2분 뒤 새로고침하자 「활성」 이 됐습니다. Cloudflare
문서도 「몇 분 안에」 라고 적어 둡니다.

⚠️ 여기서 막힙니다 — 바로 안 열린다고 지운다
「초기화 중」 일 때 새 주소로 사진을 열면 안 열립니다. 「활성」 이 된 직후에도
monhuncodi.com은 처음 1분쯤 403(「들어갈 수 없음」 이라는 응답 번호)이 나오다가 열렸습니다. 지우고 다시 만들지 말고, 몇 분 기다렸다 새로고침합니다.
이제 사진 하나를 새 주소로 열어 봅니다. 옛 주소의 https://pub-(번호).r2.dev 부분만
https://img.내도메인 으로 바꿔 주소창에 넣습니다. 사진이 뜨면 창고 쪽은 끝입니다.
| 번호 | 할 일 | 됐으면 |
|---|---|---|
| 1 | 도메인 연결 | 목록에 한 줄 · 「초기화 중」 |
| 2 | 1~2분 뒤 새로고침 | 「활성」 |
| 3 | 사진 하나를 새 주소로 열어 본다 | 사진이 뜬다 (403이면 1분쯤 더 기다린다) |
5.5 사이트 코드의 사진 주소 바꾸기
창고에 문패를 달았지만, 사이트는 아직 옛 주소로 사진을 부릅니다. 사이트 코드에
pub-….r2.dev 가 적혀 있기 때문입니다. 이걸 Claude Code가 고칩니다. 사이트 폴더를
Claude Code로 열고 이렇게 부탁합니다.
사진 주소를 https://img.내도메인 으로 바꿔 줘.
지금은 pub-….r2.dev 로 되어 있어. 주소를 정해 둔 곳이 한 곳인지도 봐 줘.
고친 곳을 보여 주고, 내가 확인하면 배포해 줘.
부탁 끝의 「한 곳인지도 봐 줘」 에는 까닭이 있습니다.
💡 주소는 한 곳에서 정해 둔다
사진 주소를 페이지마다 따로 적어 두면, 바꿀 때 모든 페이지를 뒤져야 합니다. 하나라도 빠뜨리면 그 사진만 옛 주소로 남습니다.
주소 앞부분을 한 곳에 한 번만 정해 두고 모든 페이지가 거기서 가져다 쓰게 하면, 바꿀 때 한 줄입니다.
monhuncodi.com 은 사진 주소의 앞부분을 사이트 코드 한 곳에 정해 두었습니다.
Claude가 바꾼 것은 그 한 줄, 그리고 사진 목록을 만드는 작은 프로그램 안의 한 곳이
전부였습니다. 「배포해」 라고 하자 3분쯤 뒤 사이트에 반영됐습니다.
Claude가 「주소가 여러 곳에 흩어져 있다」 고 하면, 이번 기회에 한 곳으로 모아 달라고 같이 부탁합니다.
5.6 확인 — 사이트의 사진이 새 주소에서 오나
배포가 끝나면 사이트를 열고 사진 하나에서 오른쪽 클릭 → 「이미지 주소 복사」 를
누릅니다. 메모장에 붙여 보아 https://img.내도메인/… 으로 시작하면 됐습니다.
사진이 많으면 하나씩 볼 수 없습니다. Claude에게 맡깁니다.
배포된 사이트의 페이지를 사이트맵에서 전부 읽어서,
사진 주소가 전부 img.내도메인 인지, 그리고 전부 열리는지 확인해 줘.
옛 주소(r2.dev)가 남은 곳이 있으면 목록으로 보여 줘.
monhuncodi.com 은 사이트맵에 올린 34쪽에 실린 사진 448장이 전부
img.monhuncodi.com 에서 열렸습니다(2026-10-15).
| 번호 | 확인 | 됐으면 |
|---|---|---|
| 1 | 사진 하나 → 오른쪽 클릭 → 이미지 주소 복사 | https://img.내도메인/… |
| 2 | Claude에게 전체 확인 부탁 | 옛 주소가 남은 곳 0 · 안 열리는 사진 0 |
5.7 정리
- 사이트 주소를 바꿔도 사진 주소는 따로다. 사진은 R2 창고의 주소로 온다
- 임시 주소
pub-….r2.dev는 화면에도 「프로덕션에는 권장하지 않습니다」 — 속도 제한이 있다 - 붙이는 곳은 R2 → 버킷 → 설정 → 사용자 설정 도메인 → + 추가. 사이트의 「도메인」 탭이 아니다
- 이름은 내 도메인 앞에
img.— 사이트 주소와 겹치지 않는 사진 전용 방 - 주소록(DNS) 한 줄(CNAME)은 Cloudflare가 넣는다. 도메인 연결만 누른다
- 「초기화 중」 → 「활성」 은 몇 분. 그동안 403이 나도 지우지 않는다
- 사이트 코드의 사진 주소는 Claude Code에게 — 주소는 한 곳에서 정해 둔다
- 확인은 이미지 주소 복사 하나, 그리고 Claude에게 전체
이 장에서 나온 말
| 말 | 쉬운 뜻 |
|---|---|
| R2 | Cloudflare의 파일 창고. 사진처럼 크고 많은 파일을 사이트 밖에 둔다 |
| 버킷 | R2 창고 안의 칸 하나. 사이트 하나의 사진을 담는다 |
| 공개 개발 URL(r2.dev) | 버킷에 붙는 임시 주소. 속도 제한이 있고 개발용이다 |
| 사용자 설정 도메인 | 버킷에 붙이는 내 도메인. 문서 이름은 Custom Domains |
| 하위 주소(하위 도메인) | 내 도메인 앞에 이름을 더 붙인 주소. img.monhuncodi.com |
| CNAME | 주소록(DNS)의 「이 이름으로 오면 저기로」 줄 |
| 403 | 「들어갈 수 없음」 응답 번호. 막 연결한 직후 잠깐 나올 수 있다 |
5.8 안 될 때
| 증상 | 이렇게 |
|---|---|
| 「+ 추가」 를 찾을 수 없다 | 사이트(Worker) 화면에 있는 겁니다. R2 객체 스토리지 → 버킷 → 설정으로 갑니다(5.2절) |
| 도메인을 넣었는데 연결이 안 된다 | 그 도메인이 버킷과 같은 Cloudflare 계정에 있는지 봅니다. 다른 계정의 도메인은 붙지 않습니다 |
| 「초기화 중」 에서 안 바뀐다 | 몇 분 기다리고 새로고침합니다. 그래도 그대로면 줄 오른쪽 「…」 → Retry connection |
| 「활성」 인데 새 주소가 403 | 1분쯤 더 기다렸다 다시 엽니다 |
| 배포했는데 사진이 여전히 r2.dev 에서 온다 | 주소가 다른 곳에도 적혀 있습니다. Claude에게 사이트 코드에서 r2.dev 가 남은 곳을 전부 찾아줘 |
| 화면이 뭘 말하는지 모르겠다 | 화면을 캡처해서 Claude에게 붙이고 이 화면에서 뭘 봐야 돼? |
이 장에서 다루지 않는 것
도메인을 사고 연결하는 일(2장), 새 도메인의 검색 등록(1장)은 이 장에서 다시 쓰지 않습니다. 임시 주소(r2.dev) 끄기도 다루지 않습니다 — 이 장에서는 켜진 채로 둡니다. Cloudflare 문서는 접근 제한 같은 보호 기능을 쓸 때는 끄라고 안내합니다 (안 끄면 그 주소로는 그대로 공개됩니다). 사진 캐시 규칙, 이미 올린 글 속에 박힌 옛 사진 주소를 한꺼번에 바꾸는 일, 사진 크기 줄이기도 이 장 밖입니다. 이 장은 새로 부르는 사진이 내 도메인에서 오는 데까지입니다.
더 읽을 곳 (공식 문서)
| 번호 | 주소 |
|---|---|
| Cloudflare — R2 공개 버킷 · 사용자 설정 도메인 | https://developers.cloudflare.com/r2/buckets/public-buckets/ |