---
title: "Dolby Hybrik DRM 연동 가이드"
description: "본 문서는 도브러너 CPIX API를 이용해 Dolby Hybrik 인코더 제품에서 DRM 암호화 패키징을 연동하는 방법을 설명합니다."
---
> For the complete documentation index, see [llms.txt](/llms.txt).

![](/img/content-security/dolby-hybrik-logo.png)

본 문서는 도브러너 CPIX API를 이용해 Dolby Hybrik 인코더 제품에서 DRM 암호화 패키징을 연동하는 방법을 설명합니다.

CPIX API는 DASH 산업 포럼에서 정의한 [Content Protection Information Exchange Format (CPIX) 표준 가이드](https://dashif.org/docs/CPIX2.1/HTML/Index.html)에 따라 구현된 API로, 미디어 콘텐츠의 패키징 과정에서 멀티 DRM을 적용하는데 필요한 키를 연동하는 규격을 정의합니다.

Hybrik 인코더와 도브러너 CPIX API에 대한 자세한 사항은 아래 링크들을 참고하시기 바랍니다.

- [Dolby Hybrik 온라인 문서](https://docs.hybrik.com/)
- [도브러너 CPIX API 가이드](/content-security/multi-drm/packaging/cpix-api/)

## 요구 사항

본 문서의 안내를 따라하려면 다음과 같은 사항이 준비되어야 합니다.

- Dolby Hybrik 계정
- 클라우드 스토리지 (아마존 S3 또는 구글 클라우드 스토리지)
- 도브러너 서비스 계정
- 일반적인 HTTP API 이용에 필요한 기본 지식

> DRM 연동에 대한 Hybrik JSON 예제는 [다운로드 페이지](/content-security/multi-drm/getting-started/downloads/)에서 다운받을 수 있습니다.

## 1단계: DRM 암호화 키 생성

Hybrik을 통한 DRM 콘텐츠 암호화를 수행하려면 우선 암호화에 사용될 키를 생성해야 합니다. 다음과 같이 도브러너 CPIX API를 호출해 각 DRM 별 암호화 키와 관련 데이터를 생성합니다.

:::note 

아래 가이드는 [Postman](https://www.postman.com/)과 같은 API 테스트 툴을 이용해 도브러너 CPIX API를 호출하는 방식으로 작성되어 있습니다. Java 등 서버 프로그래밍을 통해 CPIX API를 호출하기 원하는 경우에는 [해당 연동 샘플](https://github.com/inka-pallycon/pallycon-cpix-api-client)과 [가이드 문서](/content-security/multi-drm/packaging/cpix-api/)를 참고하시기 바랍니다.

:::

### Widevine/PlayReady 키 요청

API 테스트 툴 또는 서버 애플리케이션에서 [도브러너 CPIX API 가이드](/content-security/multi-drm/packaging/cpix-api/)에 명시된 대로 다음과 같은 도브러너 KMS 서버 URL을 호출합니다. URL의 `{enc-token}` 부분은 도브러너 서비스 계정에 발급된 KMS 토큰 값으로 바꾸어야 합니다. (`도브러너 콘솔` > `멀티DRM` > `DRM 세팅` 화면에서 확인)

```shell
https://drm-kms.doverunner.com/v2/cpix/doverunner/getKey/{enc-token}
```

위 URL 호출 시 HTTP Body(Content) 부분은 아래와 같은 XML을 입력합니다. `<cpix:CPIX id=` 부분의 `your-content-id` 값은 실제 패키징할 콘텐츠의 고유 ID(CID) 값으로 바꾸어야 합니다.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="your-content-id" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
    xmlns:speke="urn:aws:amazon:com:speke">
    <cpix:ContentKeyList>
        <cpix:ContentKey kid="key1" />
    </cpix:ContentKeyList>
    <cpix:DRMSystemList>
        <cpix:DRMSystem kid="key1" systemId="9a04f079-9840-4286-ab92-e65be0885f95" />
        <cpix:DRMSystem kid="key1" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" />
    </cpix:DRMSystemList>
</cpix:CPIX>
```

:::note 

`kid` 입력 값은 멀티키 패키징 시 각 트랙 별로 발급될 키를 구분하기 위해 사용되며, 싱글키 패키징의 경우에는 위 예제와 같이 동일한 임의의 값을 입력할 수 있습니다.<br/>
`systemId` 입력 값에는 예제와 같이 PlayReady와 Widevine에 해당하는 고유한 DRM System ID를 입력합니다.

:::

KMS 토큰과 XML Body가 정상적으로 입력된 경우, 해당 HTTP POST 요청에 대해 다음과 같은 응답이 생성됩니다.

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="your-content-id" xmlns:cpix="urn:dashif:org:cpix" xmlns:enc="http://www.w3.org/2001/04/xmlenc#"
    xmlns:speke="urn:aws:amazon:com:speke" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <cpix:ContentKeyList>
        <cpix:ContentKey explicitIV="N2Nyb2FobXRoY2hleDR6MA==" kid="f1d127a8-acfb-6fd2-dfa3-4d1af96770dc">
            <cpix:Data>
                <pskc:Secret>
                    <pskc:PlainValue>MITtRBJYxy1Z7UVCQFLHvA==</pskc:PlainValue>
                </pskc:Secret>
            </cpix:Data>
        </cpix:ContentKey>
    </cpix:ContentKeyList>
    <cpix:DRMSystemList>
        <cpix:DRMSystem kid="f1d127a8-acfb-6fd2-dfa3-4d1af96770dc" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
            <cpix:ContentProtectionData>CAESEPHRJ6is+2/S36NNGvlncNwaDGlua2FlbnR3b3JrcyIKdGVzdC1jaWQtMQ==
            </cpix:ContentProtectionData>
            <cpix:PSSH>
                AAAATnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAC4IARIQ8dEnqKz7b9Lfo00a+Wdw3BoMaW5rYWVudHdvcmtzIgp0ZXN0LWNpZC0x
            </cpix:PSSH>
        </cpix:DRMSystem>
        <cpix:DRMSystem kid="f1d127a8-acfb-6fd2-dfa3-4d1af96770dc" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
            <cpix:ContentProtectionData>
                cgIAAAEAAQBoAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADIALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAFMAPgA8AEsASQBEACAAQQBMAEcASQBEAD0AIgBBAEUAUwBDAFQAUgAiACAAQwBIAEUAQwBLAFMAVQBNAD0AIgBrAHUAcQBZAG8AMQBOAEkAbwBvADgAPQAiACAAVgBBAEwAVQBFAD0AIgBxAEMAZgBSADgAZgB1AHMAMABtAC8AZgBvADAAMABhACsAVwBkAHcAMwBBAD0APQAiAD4APAAvAEsASQBEAD4APAAvAEsASQBEAFMAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGkAYwBlAG4AcwBlAC4AcABhAGwAbAB5AGMAbwBuAC4AYwBvAG0ALwByAGkALwBsAGkAYwBlAG4AcwBlAE0AYQBuAGEAZwBlAHIALgBkAG8APAAvAEwAQQBfAFUAUgBMAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=
            </cpix:ContentProtectionData>
            <cpix:PSSH>
                AAACknBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAnJyAgAAAQABAGgCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMgAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAUwA+ADwASwBJAEQAIABBAEwARwBJAEQAPQAiAEEARQBTAEMAVABSACIAIABDAEgARQBDAEsAUwBVAE0APQAiAGsAdQBxAFkAbwAxAE4ASQBvAG8AOAA9ACIAIABWAEEATABVAEUAPQAiAHEAQwBmAFIAOABmAHUAcwAwAG0ALwBmAG8AMAAwAGEAKwBXAGQAdwAzAEEAPQA9ACIAPgA8AC8ASwBJAEQAPgA8AC8ASwBJAEQAUwA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAGUAbgBzAGUALgBwAGEAbABsAHkAYwBvAG4ALgBjAG8AbQAvAHIAaQAvAGwAaQBjAGUAbgBzAGUATQBhAG4AYQBnAGUAcgAuAGQAbwA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==
            </cpix:PSSH>
        </cpix:DRMSystem>
    </cpix:DRMSystemList>
</cpix:CPIX>
```

> 위 응답과 요청 예제 데이터의 세부 항목들에 대한 설명은 [해당 가이드 문서](https://docs.doverunner.com/ko/content-security/multi-drm/packaging/cpix-api/#%EC%98%88%EC%A0%9C---vod-dash-%EC%BD%98%ED%85%90%EC%B8%A0)를 참고하시기 바랍니다.

### FairPlay 키 요청

PlayReady/Widevine 키 요청과 마찬가지 방법으로 아래와 같은 요청 데이터를 KMS 서버로 전송합니다.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX id="your-content-id" xmlns:cpix="urn:dashif:org:cpix" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:speke="urn:aws:amazon:com:speke">
 <cpix:ContentKeyList>
     <cpix:ContentKey kid="key1"></cpix:ContentKey>
 </cpix:ContentKeyList>
 <cpix:DRMSystemList>
    <cpix:DRMSystem kid="key1" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2" />
 </cpix:DRMSystemList>
</cpix:CPIX>
```

:::note 

위 예제의 `systemId` 값은 FairPlay DRM에 대한 system ID입니다. (고정값)

:::

위 요청 데이터 예제에 대한 응답은 다음과 같습니다.

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cpix:CPIX id="your-content-id" xmlns:cpix="urn:dashif:org:cpix" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" xmlns:speke="urn:aws:amazon:com:speke" xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <cpix:ContentKeyList>
        <cpix:ContentKey explicitIV="N2Nyb2FobXRoY2hleDR6MA==" kid="cfb7a0e1-c5c5-62df-6e32-dcaebcc8739b">
            <cpix:Data>
                <pskc:Secret>
                    <pskc:PlainValue>olwzn1wU8oHCxjWY1C6oyQ==</pskc:PlainValue>
                </pskc:Secret>
            </cpix:Data>
        </cpix:ContentKey>
    </cpix:ContentKeyList>
    <cpix:DRMSystemList>
        <cpix:DRMSystem kid="cfb7a0e1-c5c5-62df-6e32-dcaebcc8739b" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
            <cpix:HLSSignalingData>I0VYVC1YLUtFWTpNRVRIT0Q9U0FNUExFLUFFUyxVUkk9c2tkOi8vejdlZzRjWEZZdDl1TXR5dXZNaHptdz09</cpix:HLSSignalingData>
            <cpix:HLSSignalingData playlist="master">I0VYVC1YLVNFU1NJT04tS0VZOk1FVEhPRD1TQU1QTEUtQUVTLFVSST1za2Q6Ly96N2VnNGNYRll0OXVNdHl1dk1oem13PT0=</cpix:HLSSignalingData>
            <cpix:URIExtXKey>c2tkOi8vejdlZzRjWEZZdDl1TXR5dXZNaHptdz09</cpix:URIExtXKey>
        </cpix:DRMSystem>
    </cpix:DRMSystemList>
</cpix:CPIX>
```

이제 PlayReady, Widevine, FairPlay 콘텐츠 패키징에 필요한 암호화 키 정보가 준비되었으므로 다음 단계로 진행합니다.

## 2단계: Hybrik 인코딩 JSON 생성

1단계에서 생성한 암호화 키와 관련 정보를 이용해 Hybrik에서 인코딩/패키징 작업에 사용할 JSON 데이터를 설정합니다.

아래 내용은 DRM 암호화에 필요한 설정만을 설명하고 있으며, DASH와 HLS 패키징을 처리하는 전체 작업 설정은 [다운로드 페이지](/ko/content-security/multi-drm/getting-started/downloads/)의 예제 JSON 파일을 참고하시기 바랍니다.

### DASH 패키징 암호화 (PlayReady, Widevine)

[Hybrik API 문서](https://docs.hybrik.com/api/v1/HybrikAPI.html?#dash)를 참고해 DASH 패키징 작업에 대한 JSON 데이터를 생성합니다. 이때 PlayReady와 Widevine을 해당 DASH 콘텐츠에 적용하기 위해 아래와 같은 `encryption` 설정을 추가합니다.

```json
"encryption": {
    "enabled": true,
    "schema": "aes-128-cbc",
    "drm": [ 
        "widevine",
        "playready"
    ],
    "key_id": "f1d127a8acfb6fd2dfa34d1af96770dc",
    "key": "3084ed441258c72d59ed45424052c7bc",
    "widevine_pssh": "CAESEPHRJ6is+2/S36NNGvlncNwaDGlua2FlbnR3b3JrcyIKdGVzdC1jaWQtMQ==",
    "playready_pssh": "AAACknBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAAnJyAgAAAQABAGgCPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMgAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAUwA+ADwASwBJAEQAIABBAEwARwBJAEQAPQAiAEEARQBTAEMAVABSACIAIABDAEgARQBDAEsAUwBVAE0APQAiAGsAdQBxAFkAbwAxAE4ASQBvAG8AOAA9ACIAIABWAEEATABVAEUAPQAiAHEAQwBmAFIAOABmAHUAcwAwAG0ALwBmAG8AMAAwAGEAKwBXAGQAdwAzAEEAPQA9ACIAPgA8AC8ASwBJAEQAPgA8AC8ASwBJAEQAUwA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAGUAbgBzAGUALgBwAGEAbABsAHkAYwBvAG4ALgBjAG8AbQAvAHIAaQAvAGwAaQBjAGUAbgBzAGUATQBhAG4AYQBnAGUAcgAuAGQAbwA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA=="
}
```

위 `encryption` 설정의 암호화 키 관련 값들은 1단계에서 준비한 PlayReady/Widevine 용 CPIX API 응답의 XML 데이터를 이용해 아래와 같이 입력합니다.

- `key_id`: `<cpix:ContentKey kid` 파라미터의 UUID 값에서 `-` 문자를 제거한 32비트 문자열
- `key`: `<pskc:PlainValue>` 태그의 값(Base64 문자열)을 소문자 hexstring으로 변환한 값 ([참고 링크](https://base64.guru/converter/decode/hex))
- `widevine_pssh`: Widevine systemId(`edef8ba9-79d6-4ace-a3c8-27dcd51d21ed`)의 `<cpix:ContentProtectionData>` 태그 값 (`PSSH` 태그 값에서 헤더를 제거한 부분)
- `playready_pssh`: PlayReady systemId(`9a04f079-9840-4286-ab92-e65be0885f95`)의 `<cpix:PSSH>` 태그 값

### HLS 패키징 암호화 (FairPlay)

DASH 패키징 암호화와 마찬가지로 HLS 패키징 작업의 JSON에 다음과 같이 FairPlay 암호화 설정을 추가합니다.

```json
"encryption": {
    "enabled": true,
    "schema": "sample-aes",
    "drm": [
        "fairplay"
    ],
    "key_id": "cfb7a0e1c5c562df6e32dcaebcc8739b",
    "key": "a25c339f5c14f281c2c63598d42ea8c9",
    "iv": "3763726f61686d746863686578347a30",
    "fairplay_uri": "skd://z7eg4cXFYt9uMtyuvMhzmw=="
}
```

암호화 관련 설정 값은 FairPlay 용 CPIX API 응답의 XML 데이터를 이용해 아래와 같이 입력합니다.

- `key_id`: `<cpix:ContentKey kid` 파라미터의 UUID 값에서 `-` 문자를 제거한 32비트 문자열
- `key`: `<pskc:PlainValue>` 태그의 값(Base64 문자열)을 소문자 hexstring으로 변환한 값 ([참고 링크](https://base64.guru/converter/decode/hex))
- `iv`: `<cpix:ContentKey explicitIV` 파라미터 값을 소문자 hexstring으로 변환한 값
- `fairplay_uri`: `<cpix:URIExtXKey>` 태그의 값을 Base64 디코딩한 문자열

## 3단계: Hybrik을 통한 패키징 수행

2단계에서 생성한 JSON 설정을 사용하여 Hybrik 웹 콘솔과 REST API를 통해 패키징을 수행합니다. Hybrik REST API에 대한 자세한 정보는 [해당 가이드](https://docs.hybrik.com/api/v1/HybrikAPI.html)를 참고하시기 바랍니다.

Hybrik 패키징을 통해 DRM이 적용된 DASH/HLS 콘텐츠를 재생하려면 DRM 라이선스를 연동해야 합니다. [라이선스 연동 가이드](/content-security/multi-drm/license/)와 [클라이언트 연동 가이드](/content-security/multi-drm/clients/)를 참고해 이후 과정을 진행하시기 바랍니다.