Dolby Hybrik DRM 연동 가이드

개요

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

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

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

요구 사항

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

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

DRM 연동에 대한 Hybrik JSON 예제는 다운로드 페이지에서 다운받을 수 있습니다.

1단계: DRM 암호화 키 생성

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

아래 가이드는 Postman과 같은 API 테스트 툴을 이용해 PallyCon CPIX API를 호출하는 방식으로 작성되어 있습니다. Java 등 서버 프로그래밍을 통해 CPIX API를 호출하기 원하는 경우에는 해당 연동 샘플을 참고하시기 바랍니다.

Widevine/PlayReady 키 요청

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

https://kms.pallycon.com/v2/cpix/pallycon/getKey/{enc-token}

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

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

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

<?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>

위 응답과 요청 예제 데이터의 세부 항목들에 대한 설명은 해당 가이드 문서를 참고하시기 바랍니다.

FairPlay 키 요청

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

<?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>
위 예제의 systemId 값은 FairPlay DRM에 대한 system ID입니다. (고정값)

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

<?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 패키징을 처리하는 전체 작업 설정은 다운로드 페이지의 예제 JSON 파일을 참고하시기 바랍니다.

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

Hybrik API 문서를 참고해 DASH 패키징 작업에 대한 JSON 데이터를 생성합니다. 이때 PlayReady와 Widevine을 해당 DASH 콘텐츠에 적용하기 위해 아래와 같은 encryption 설정을 추가합니다.

"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으로 변환한 값 (참고 링크)
  • 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 암호화 설정을 추가합니다.

"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으로 변환한 값 (참고 링크)
  • iv: <cpix:ContentKey explicitIV 파라미터 값을 소문자 hexstring으로 변환한 값
  • fairplay_uri: <cpix:URIExtXKey> 태그의 값을 Base64 디코딩한 문자열

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

2단계에서 생성한 JSON 설정을 사용하여 Hybrik 웹 콘솔과 REST API를 통해 패키징을 수행합니다. Hybrik REST API에 대한 자세한 정보는 해당 가이드를 참고하시기 바랍니다.

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

이전