# Cloudflare R2: 버킷, CORS 및 전달 R2 버킷을 만들고 업로드 및 재생용 CORS를 설정하세요. 맞춤 도메인이나 테스트용 r2.dev URL을 연결한 뒤 DRM-X 6.0에서 업로드를 확인합니다. 암호화된 동영상과 DRM 라이선스는 서로 다른 경로로 전달됩니다 CDN은 암호화된 동영상을 전달합니다. 백엔드가 접근 권한을 확인하고, DRM 라이선스 서비스가 호환 기기에서의 복호화를 승인합니다. - 01**스토리지 / CDN** 암호화된 미디어를 플레이어에 전달합니다. - 02**고객 백엔드** 시청 권한을 확인하고 DRM-X에 재생 승인을 요청합니다. - 03**DRM-X** 재생 승인 정보를 검증하고 DRM 라이선스 요청을 처리합니다. - 04**플레이어 + 기기** 기기의 DRM 시스템으로 라이선스를 받아 암호화된 미디어를 재생합니다. 귀하의 백엔드가 접근을 결정합니다. DRM-X는 서명 된 정책을 시행합니다. 암호화 된 미디어 및 DRM 라이센스는 별도의 배송 경로를 따릅니다. **새 버킷에서 업로드 확인까지** R2 버킷을 만들고 브라우저 CORS, 공개 HTTPS 전송 URL, DRM-X 연결을 설정합니다. 테스트 객체를 업로드한 뒤 가져와 확인하세요. 원본 동영상과 개인 문서는 이 전송 버킷 밖에 보관하고 암호화된 미디어와 공개하려는 파일만 게시하세요. 공개 전달을 통해 URL로 객체 바이트에 도달할 수 있습니다. DRM 올바르게 패키지된 미디어의 암호 해독을 제어합니다. CORS는 승인이 아닌 브라우저 호환성 규칙입니다. 이러한 실제 콘솔 스크린샷에는 계정 헤더와 개인 식별자가 제외되어 있습니다. 메뉴 문구는 변경될 수 있습니다. ## 1. R2 버킷 만들기[#](#create-bucket) - Cloudflare에 로그인하고 버킷을 소유할 계정을 선택하세요. - **Storage & databases → R2 Object Storage → Overview → Create bucket**를 엽니다. - `customer-drm-media-example`와 같은 고유한 버킷 이름을 입력합니다. 적절한 위치나 관할권을 선택하세요. 이 연습에서는 **Standard** 스토리지를 사용한 다음 버킷을 만듭니다. - 버킷의 **Settings**을 엽니다. 버킷 이름, Cloudflare account ID 및 **General → S3 API** 엔드포인트를 기록합니다. 기본 관할권의 경우 API 끝점은 `https://.r2.cloudflarestorage.com`입니다. Cloudflare에 관할권별 호스트 이름이 표시되면 정확한 호스트 이름을 사용하세요. DRM-X에 끝점을 입력할 때 후행 `/bucket-name`를 제거하세요. 버킷 이름에는 자체 필드가 ​​있습니다. 이 API 엔드포인트는 공개 재생 URL이 아닙니다. ## 2. 이 버킷에만 접근할 수 있는 자격 증명 만들기[#](#create-credentials) - R2 Overview로 돌아가서 **Manage API tokens**를 엽니다. R2 계정 토큰을 선택하거나 조직에서 요구하는 경우 사용자 토큰을 선택하세요. - **Create API token**를 선택하고 알아보기 쉬운 이름을 지정한 다음 **Object Read & Write**를 선택합니다. - **Apply to specific buckets only**을 선택하고 이 버킷을 선택합니다. 정책에 따라 만료를 구성합니다. 이 연습에서는 선택적 IP 필터링을 설정하지 않은 상태로 둡니다. 보안 정책에서 요구하는 경우 DRM-X 서버 액세스와 고객 브라우저 네트워크에서 직접 업로드를 모두 확인하세요. - 토큰을 생성하고 DRM-X에 대해 **Access Key ID** 및 **Secret Access Key**를 안전하게 기록합니다. ** S3 자격증명 쌍**을 사용하세요. 별도의 Cloudflare Token value는 S3 Secret Access Key가 아닙니다. DRM-X에는 계정 전체 관리 토큰이 필요하지 않습니다. CORS 및 도메인을 Cloudflare에서 직접 관리하세요. ## 3. 공개 전송 URL 선택하기[#](#public-delivery) ![R2 Settings: Custom Domains 아래에 추가하거나 Public Development URL 아래에 활성화합니다.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Production:** 사용자 정의 도메인을 추가합니다. **2 — 테스트:** 공개 개발 활성화 URL. ### 옵션 A: 프로덕션을 위해 도메인 연결 - 동일한 Cloudflare 계정에서 DNS 설정이 완료된 도메인을 보유하세요. `media.example.com`와 같은 하위 도메인을 선택하세요. - 버킷에서 **Settings → Custom Domains → Add**를 엽니다. 하위 도메인을 입력하고 DNS 변경 사항을 검토한 후 이 R2 워크플로를 사용하여 연결하세요. - 도메인과 HTTPS 인증서가 활성화될 때까지 기다립니다. 전송 Origin는 `https://media.example.com`입니다. r2.dev 주소를 가리키는 CNAME를 생성하지 마세요. R2의 Custom Domains 작업 흐름을 사용하세요. 맞춤 도메인이 연결되면 개발 URL이 비활성화된 상태로 유지될 수 있습니다. ### 옵션 B: 테스트를 위해 Cloudflare의 URL 활성화 - **Settings → Public Development URL → Enable**을 엽니다. - 공개 액세스 알림을 검토하고 요청 시 `allow`를 입력한 후 확인합니다. - Cloudflare에 표시된 실제 `https://pub-….r2.dev` URL를 복사합니다. 계정 ID 또는 버킷 이름으로 구성하지 마세요. r2.dev 엔드포인트는 속도가 제한되어 있으며 개발용입니다. 제작, 캐싱 및 Cloudflare 보안 기능을 위해 맞춤 도메인을 사용하세요. ## 4. 브라우저 업로드와 재생을 위한 CORS 설정하기[#](#configure-cors) ![R2 CORS Policy 편집, 허용된 출처, 메소드 및 헤더가 포함된 패널.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** 새 버킷에 대해 Add CORS policy를 선택하거나 편집을 선택합니다. **2:** 저장된 출처, 메소드, 헤더를 확인하세요. 이 스크린샷은 Console 전용 진단 규칙을 보여줍니다. 플레이어 웹사이트에 대해 아래의 완전한 두 가지 규칙 예를 사용하세요. - **Settings → CORS Policy → Add CORS policy**(또는 **Edit**)을 엽니다. - 아래 JSON를 에디터에 붙여넣으세요. `https://www.example.com`를 플레이어가 포함된 웹사이트의 출처로 바꿉니다. 원본에는 HTTPS 및 호스트 이름이 포함되지만 /watch와 같은 페이지 경로는 포함되지 않습니다. - 버킷에 이미 정책이 있는 경우 다른 필수 규칙을 유지한 다음 **Save**를 선택합니다. - 변경 사항이 반영될 때까지 기다린 뒤 업로드를 다시 시도하세요. 맞춤 도메인에 이전 CORS 헤더가 캐시되어 있다면 해당 경로의 캐시 응답을 삭제하고 다시 테스트하세요. ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` 첫 번째 규칙은 DRM-X Console에서 서명된 PUT 업로드를 허용합니다. 두 번째는 플레이어 웹사이트 및 DRM-X 테스트 페이지에서 GET/HEAD를 허용합니다. R2 사용자 정의 도메인은 버킷의 CORS 정책을 사용합니다. CORS는 익명 업로드 액세스를 허용하지 않습니다. ### CORS 및 일치하는 URL 필드를 생성합니다. 이 도구는 브라우저에서 실행됩니다. 공개 출처만 입력하세요. 액세스 키를 요구하지 않습니다. 플레이어 웹사이트 출처예를 바꿔보세요. 여러 개의 HTTPS 출처를 공백이나 쉼표로 구분하세요. 페이지 경로 없이 플레이어가 포함된 웹사이트를 사용하세요. DRM-X Console 및 Playback Lab는 자동으로 포함됩니다.공개 전송 Origin연결된 맞춤 도메인, 활성화한 r2.dev URL 또는 CloudFront Origin을 입력하세요. 여기에는 폴더 경로를 넣지 마세요.저장 폴더(옵션)구성 생성 CORS JSON 복사 ``` ``` Protected-content base path``Public URL prefix``객체 키 예시``완전한 URL 예시`` ## 5. DRM-X 6.0에서 R2를 연결하세요.[#](#connect-drmx) [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage)를 열고 **Cloudflare R2**를 선택합니다. | (주)에이치 | 입력할 내용 | | --- | --- | | Display name | Production R2처럼 알아보기 쉬운 이름입니다. | | Bucket name | URL 또는 폴더가 없는 정확한 버킷 이름입니다. | | Cloudflare account ID | 이 버킷을 소유한 계정의 ID입니다. | | S3 API endpoint | 기본 관할권을 공백으로 두거나 버킷 경로 없이 계정/관할권 엔드포인트를 입력하세요. | | Protected-content base path | `protected` 또는 버킷 루트 업로드의 경우 비어 있습니다. | | Public URL prefix | `https://media.example.com/protected` 또는 활성화된 `https://pub-….r2.dev/protected` URL. | | Access key ID / Secret access key | 2단계의 S3 자격 증명 쌍입니다. | 예제에서는 `protected`라는 폴더를 사용합니다. 버킷 이름은 자동으로 폴더가 아닙니다. 여기에 사용된 도메인-버킷 직접 매핑을 사용하면 동일한 스토리지 폴더를 공용 URL 접두사에 정확히 한 번 포함합니다. ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` 버킷 루트를 사용하려면 기본 경로를 비워두고 공개 접두사로 전달 원본만 입력합니다. 의도적으로 폴더로 사용하지 않는 한 버킷 이름을 추가하지 마세요. 이 매핑에서는 CloudFront Origin path를 비워 둡니다. 원하는 경우 **기본값으로 사용 CLI 업로드 대상**을 선택합니다. **Save and verify**를 선택하세요. 자격 증명은 저장 시 암호화되며 저장 후에는 반환되지 않습니다. 인증에 성공하더라도 실제 업로드 테스트를 계속 진행합니다. ## 6. 파일을 업로드하고 작동하는지 확인하세요.[#](#test-upload) - [Cloud Storage](https://6.drm-x.com/console/cloud-storage)를 열고 이 목적지를 선택한 다음 **Verify location**를 선택하세요. 성공은 DRM-X 서버가 버킷을 나열할 수 있음을 의미합니다. 쓰기 권한, 브라우저 CORS 또는 공개 전송을 설정하지 않습니다. - **Upload encrypted files**를 선택하고 기존 DRM-X 패키지에서 작은 암호화 세그먼트 하나를 선택합니다. 패키지가 없는 경우 아래 일회용 암호화 진단을 이용하세요. 원본 영상이나 개인 문서를 업로드하지 마세요. - 성공 메시지를 기다립니다. Cloud Storage에 파일 이름과 크기가 나타나는지 확인하세요. 공급자 콘솔의 `protected/` 아래에서 동일한 개체를 찾으세요. - **Preview URL**를 클릭하고 개인 브라우저 창에서 동일한 개체를 테스트하세요. AWS 또는 Cloudflare 로그인 없이 HTTP 200을 다운로드하거나 반환해야 합니다. 실제 객체를 테스트합니다. 객체 전달이 작동하는 경우에도 도메인의 루트가 403/404를 반환할 수 있습니다. - 플레이어 웹사이트에서 교차 Origin 전송을 확인하세요. 브라우저의 네트워크 패널에는 플레이어 페이지의 출처와 일치하는 `Access-Control-Allow-Origin`가 표시되어야 합니다. 직접 주소 표시줄 다운로드는 CORS를 테스트하지 않습니다. 아래 터미널 예제에서도 헤더를 확인합니다. - 완료되면 일회용 진단 개체만 제거하십시오. 그런 다음 [Desktop Packager 가이드](https://docs.drm-x.com/ko/packaging/desktop)에 따라 Package content에서 이 저장 대상을 선택한 다음 전체 암호화된 패키지를 업로드하세요. 파일을 수동으로 업로드하면 Published Content ID가 등록되지 않습니다. - [Universal Playback Lab](https://multi-drm.drm-x.com/ko/player) 및 자신의 플레이어 웹사이트에서 결과 Published 파일을 테스트합니다. 비디오, 오디오, 타임라인 탐색 및 필요한 장치를 확인하십시오. 성공적인 바이너리 다운로드는 DRM 재생의 증거가 아닙니다. 암호화된 샘플이 없나요? Windows에 일회용 테스트 파일을 만듭니다. 제어하는 ​​임시 폴더의 Windows PowerShell에서 이것을 실행하세요. 메모리에만 보관된 일회용 AES 키를 사용하여 짧은 비개인 메시지를 암호화합니다. 출력은 재생 가능한 미디어가 아닌 저장소 진단입니다. DRM 콘텐츠 키나 고객 데이터가 포함되어 있지 않습니다. ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` `drmx-storage-check.encrypted.bin`을 업로드하고 크기와 Preview URL을 확인한 뒤, 해당 테스트 객체를 버킷에서 삭제하세요. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` 두 URL을 모두 바꾸십시오. HTTP 200 및 플레이어 웹사이트와 일치하는 허용된 출처를 예상하세요. 범위 전달의 경우 `Range: bytes=0-15`가 포함된 GET 요청은 HTTP 206 및 유효한 Content-Range 헤더를 반환해야 합니다. 미디어 MIME 유형 유지: DASH 매니페스트는 application/dash+xml을 사용하고, HLS 재생 목록은 application/vnd.apple.mpegurl을 사용하며, 미디어 파일은 적절한 미디어 유형을 사용해야 합니다. ## 7. 결과 문제 해결[#](#troubleshooting) | 결과 | 액션 | | --- | --- | | Verify location은 성공하지만 브라우저 업로드가 실패함 | 브라우저 Console 및 네트워크 패널을 검사합니다. 정확한 Console 원점에서 PUT CORS 및 Content-Type를 허용합니다. 또한 연결을 확인하고 새로 서명된 URL을 다시 시도하세요. | | 업로드가 403을 반환합니다. | 객체 쓰기 권한, 버킷/폴더 범위, 엔드포인트, 지역, 요청 만료 및 시계를 확인하세요. 서명된 업로드 URL을 공유하지 마세요. | | 업로드가 성공했습니다. 공개 URL는 403을 반환합니다. | 공개 전송이 활성화되어 있고 도메인/배포판 배포가 완료되었는지 확인하세요. | | 공개 URL는 404를 반환합니다. | 전체 URL를 정확한 개체 키와 비교합니다. 누락되거나 중복된 폴더와 파일 이름 대소문자를 확인하세요. | | URL 바로 열립니다. 플레이어 가져오기 실패 | 플레이어 페이지 출처를 GET/HEAD CORS에 추가하세요. CDN 응답 헤더를 확인하고 영향을 받은 오래된 캐시 응답을 무효화합니다. | | 다운로드가 성공했습니다. 재생 실패 | 패키지 게시, 매니페스트 경로, MIME 유형 및 DRM 라이선스 인증을 확인하세요. [재생 문제 해결](https://docs.drm-x.com/ko/troubleshooting/playback)을 참조하세요. | ## 공식 참고자료[#](#references) - [ R2 버킷](https://developers.cloudflare.com/r2/buckets/create-buckets/) 만들기 - [R2 자격 증명 및 권한](https://developers.cloudflare.com/r2/api/tokens/) - [맞춤 도메인 및 r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS 및 캐시 동작](https://developers.cloudflare.com/r2/buckets/cors/) AWS를 사용하시나요? [Amazon S3 및 CloudFront 설정](https://docs.drm-x.com/ko/storage/amazon-s3)을 따르세요.