AWS 기술 블로그

AWS Elemental MediaPackage및 Amazon CloudFront를 활용한 미디어 콘텐츠의 보안 강화 전략 – Part1: Live Streaming

최근 미디어 산업의 발전으로 수 많은 미디어 컨텐츠들이 다양한 플랫폼과 디바이스로 시청자에게 전달이 되고 있습니다. 유료 미디어 컨텐츠를 제공하는 OTT 사업자나 다양한 유료 컨텐츠 제공 사업자의 경우 미디어 컨텐츠의 입수부터 시청자에게 제공하기까지 컨텐츠를 보호하기 위해 많은 노력을 해야 합니다. 만약 민감한 미디어 컨텐츠가 유출되거나 불법적으로 복제가 될 경우 가입자의 수가 줄거나 고객의 신뢰가 하락하고 성장이 둔화되며 이로 인하여 매우 큰 규모의 금전적인 손실이 발생될 수 있습니다.

컨텐츠의 유출이나 불법적인 복제를 방지하기 위해서는 DRM(Digital Rights Management) 솔루션을 활용하여 컨텐츠 암호화하여 보호하거나, 승인된 시청자만을 위해 엑세스를 세부적으로 제어하고 접근 권한을 설정하여 미디어 컨테츠를 제공해야 합니다.

AWS Media Service 와 Amazon CloudFront 의 Signed URL 과 Signed Cookie 를 활용하게 되면 다양한 방법으로 컨텐츠를 보호할 수 있으며 시청자에게 안전하게 미디어 서비스를 제공할 수 있습니다. AWS Media Services는 클라우드에서 안정적으로 브로드캐스트 품질의 라이브 및 온 디맨드(On-demand) 등의 최적화된 미디어를 생성할 수 있도록 사용이 되는 관리형 서비스 그룹입니다.

AWS Elemental MediaPackage는 라이브나 비디오 온 디맨드(VOD)를 패키징하는 서비스 이며, 스트리밍 콘텐츠를 안전하고 안정적으로 시청자에게 전달할 수 있습니다. MediaPackage 를 활용하게 되면 복잡한 컨텐츠 보호를 위한 기능을 굉장히 손쉽게 DRM 솔루션과 연동해서 제공할 수 있습니다. Amazon CloudFront 는 콘텐츠 전송 네트워크 (CDN) 서비스로써 AWS Elemental MediaPackage와 연동이 되어 세계 각국에 있는 사용자들에게 짧은 지연 시간과 빠른 전송 속도로 미디어 콘텐츠를 제공 할 수가 있습니다. 또한 Signed URL과 Signed Cookie를 사용하여 프라이빗 콘텐츠를 제공, 지리적 배포 제한, S3 Origin에 대한 접근 권한 제어, HTTPS 사용 등 다양한 기능으로 보안을 강화 할 수 있습니다.

미디어 서비스의 보안을 강화하는 다양한 방법이 있는데, 이 게시물에서는 주로 라이브 환경에서 AWS Elemental MediaPackage를 활용하여 DRM 솔루션과의 연동을 통한 콘텐츠 자체에 대한 보안 강화 방법과 Amazon CloudFront의 Access control 을 활용하여 보안을 강화하는 방법을 설명 합니다. 이를 통해 사용자는 미디어 콘텐츠를 보호하고 안전하게 전달할 수 있는 솔루션을 구축 하실 수 있습니다.

솔루션 개요

AWS Elemental MediaPackage를 활용하여 DRM 솔루션과 연동을 하여 콘텐츠 자체에 대한 보안을 설정 할 수 있고 CDN authorization 기능을 활용하여 콘텐츠에 대한 접근 권한을 제어 할 수 있습니다. Amazon CloudFront에서 Signed URL 및 Signed Cookie를 기능을 활성화 하여 콘텐츠에 대한 접근 권한을 제어 할 수 있습니다. Signed URL을 활용하는 과정에서 컨텐츠 제생을 위한 디바이스가 토큰(이 포함이 manifest 파일 및 비디오 스트림 영상 데이터의 쿼리 스트링을 유지하지 못하는 경우가 있는데 이런 문제를 해결하는 방안에 대해서도 설명 드립니다. 다음 단계에서는 콘텐츠에 대한 접근 권한 및 콘텐츠 자체에 대한 보안 강화 방안을 다루고 있어 미디어 콘텐츠의 보안강화 방안을 확인 하실 수 있습니다.

단계 요약

  • AWS Elemental MediaPackage에서 CDN Authorization 설정하기
    • 단계1: Amazon CloudFront에서 사용자 지정 header 정보 구성
    • 단계2: AWS Secrets Manager에서 보안 암호로 헤더 값 설정
    • 단계3: Secrets Manager에 대한 MediaPackage 액세스를 위한 IAM 정책 및 역할 생성
    • 단계4: AWS Elemental MediaPackage CDN authorization 권한 활성화
  • Amazon CloudFront를 활용한 Access control 설정하기
    • 단계 1: 키 페어 설정
    • 단계 2: CloudFront Signed URL 또는 Signed Cookie 설정
    • 단계 3: CloudFront Signed UR 설정
    • 단계4: Signed URL 활용하는 과정에서 토큰이 포함이 된 쿼리 스트링을 유지하도록 설정하는 방법
    • 단계3: Signed Cookie를 활용한 콘텐츠 보호
  • AWS Elmental MediaPackage에서 DRM 연동하기
    • 단계1: DRM 공급자를 활용한 콘텐츠 키 준비 및 관리
    • 단계2: SPEKE IAM Role 권한 생성
    • 단계3: AWS Elemental MediaPackage Encryption 설정
    • 단계4: 라이선스 토큰 생성 및 DRM 콘텐츠 재생

사전 준비사항

솔루션을 배포하기 위해서는 아래와 같은 사항을 준비 해야 합니다.

AWS Elemental MediaPackage에서 CDN Authorization 설정하기

CDN(컨텐츠 전송 네트워크) 인증을 구성하게 되면 MediaPcakage 와 CDN 간의 인증된 재생요청을 이행하기 때문에 CDN을 우회하여 MediaPckage의 원본 컨텐츠에 직접 접근하는것을 방지 할 수 있습니다.
[Figure 1]

단계 1 : Amazon CloudFront에서 사용자 지정 header 정보 구성

CloudFront Origin Settings(오리진 설정)에서 필드를 완료합니다. Secrets Manager에서 시크릿에 이와 동일한 값을 사용하게 됩니다.

Header Name(헤더 이름)에 X-MediaPackage-CDNIdentifier를 입력합니다.

Value에 값을 입력합니다. 36자 문자열을 생성하는 UUID 버전 4 형식을 사용하는 것이 좋습니다. UUID 버전 4 형식을 사용하지 않는 경우 값은 8-128자여야 합니다. (예, “X-MediaPackage-CDNIdentifier: 9ceebbe7-9607-4552-8764-876e47032660”)
[Figure 2]

단계 2 : AWS SecretsManager에서 보안 암호로 헤더 값 설정

Store a new secret(새 보안 암호 저장)을 선택하고 암호 유형에서는 다른 유형의 암호를 선택합니다. 키/값 쌍의 경우 키와 값 정보를 입력합니다. 왼쪽 상자에 MediaPackageCDNIdentifier를 입력하고 오른쪽 상자에 사용자 지정 오리진 HTTP 헤더에 대해 구성한 값을 입력합니다. (예: 9ceebbe7-9607-4552-8764-876e47032660)

보안 암호 이름의 경우 MediaPackage에 사용되는 보안 암호임을 알 수 있도록 MediaPackage/로 접두사를 붙이는 것이 좋습니다. (예: MediaPackage/cdn_auth_us-west-2.)
[Figure 3]

자동 교체 구성 섹션에서 기본 자동 교체 비활성화 설정을 유지합니다. Secret ARN에는”arn:aws:secretsmanager:ap-northeast-2:xxxxxxx:secret:MediaPackage/xxxxxx”와 비슷한 값이 있습니다. 해당 ARN을 복사하여 4단계: MediaPackage CDN authorization 권한 활성화 설정 과정에서 MediaPackage 에 대한 CDN 승인을 구성할 때 사용합니다.

단계 3 : Secrets Manager에 대한 MediaPackage 액세스를 위한 IAM 정책 및 역할 생성

SecretsManager 매니저에 대한 MediaPackage 읽기 권한을 부여하는 IAM 정책 및 역할을 생성합니다. MediaPackage 에서 Cloudfront 로부터 재생 요청을 받으면 저장된 보안 암호 값이 사용자 지정 HTTP 헤더의 값과 일치하는지 확인합니다.

IAM 역할을 생성합니다. 예: mediapackage-secret-role

Policies에서 정책을 생성해야 합니다. 예: mediapackage-secret-policy

다음과 같이 json을 복사하여 입력하시고, secretmanager의 Action에 대한 Resource는 2단계에서 생성한 secretmanager의 Secret ARN의 값으로 대체하시고 IAM의 Action에 대한 Resource는 생성한 역할의 Instance profile ARN 값으로 대체하시면 됩니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecrets",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": [
                "arn:aws:secretsmanager:ap-northeast-2:xxxxxxxxxx:secret:MediaPackage/axxx"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::xxxxxxxxxx:instance-profile/xxxxxxxxxx"
        }
    ]
}

policy의 최종결과는 다음의 예를 참조 하시길 바랍니다.
[Figure 4]

Trust Relationships에서 service 항목을 mediapackage 제어 권한으로 수정이 필요합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "mediapackage.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Trusted entities 최종결과는 다음의 예를 참조하시길 바랍니다.
[Figure 5]

단계 4 : AWS Elemental MediaPackage CDN authorization 권한 활성화

채널 생성 이후 해당 채널에서 manage endpoint를 클릭합니다. 또는 기존에 사용하셨던 endpoint가 있으시다면 수정을 클릭합니다.

Access control settings 항목에서 Use CDN authorization 기능을 클릭하여 활성화 합니다. 그리고 Secrets role ARN 상자에는 3단계에서 생성한 IAM의 ARN를 복사하여 입력하고, CDN identifier secret ARN 상자에는 2단계에서 생성한 secretsManager의 ARN를 복사하여 입력합니다.

[Figure 6]

결과 :

MediaPackage CDN Authorization 설정하기전에는 Endpoint URL 및 CloudFront URL 허용이 됩니다.

[Figure 7]

그러나 MediaPackage CDN Authorization 활성화가 되면 Endpoint URL 접속은 불가능하고 CloudFront URL에서만 접속이 가능하게 됩니다. 이를 통해 사용자가 직접 원본 소스로 접속하는 경로를 차단하게 됨으로써 서비스의 부하를 줄일 뿐만 아니라 보안을 강화할수가 있습니다.
[Figure 8]

Amazon CloudFront를 활용한 Access control 설정하기

Amazon CloudFront에서 제공하는 Signed URL 및 Signed Cookie를 사용하여 권한 있는 사용자들에게만 미디어 콘텐츠를 제공 동영상을 제공하는 방법 즉 프라이빗 콘텐츠에 엑세스하도록 설정할수가 있습니다. 이 과정에서 플레이어는 오리진 서버에 직접 콘텐츠에 액세스하는 URL이 아닌 CloudFront URL을 사용하여 콘텐츠에 액세스 합니다. Signed URL의 경우 일반적인 컨텐츠 및 RTMP 서비스 사용시 권장 드리고 Signed Cookie의 경우는 DASH 그리고 HLS와 같은 manifest file을 사용하는 미디어 재생 서비스에 권장 합니다.

단계 1 : 키 페어 생성

CloudFront의 Signed URL 또는 Signed Cookie의 작성에 사용할 각 서명자는 공개 키와 비밀 키의 페어를 가지고 있어야 합니다. 다음과 같은 방법으로 빠르게 키 페어를 작성합니다.

openssl 패키지를 설치합니다. 명령어: brew install openssl 또는 sudo yum install -y openssl

RSA 알고리즘을 이용한 private key를 생성합니다. 명령어: openssl genrsa -out private_key.pem

그리고 해당 private key를 이용해 public key를 생성합니다.

단계 2 : CloudFront Signed URL 또는 Signed Cookie 설정

생성한 public_key.pem의 내용을 다음과 같이 복사하여 붙여넣고 퍼블릭키를 생성합니다. 해당 ID는 추후 Signed URL 또는 Signed Cookie의  쿼리 문자열 파라미터 (Key-Pari-Id) 에 사용이 됩니다.
[Figure 9]

윗 단계에서 생성한 media 퍼블릭 키를 기반으로 다음과 같이 키 그룹을 생성합니다. 그리고 해당 키 그룹은 뷰어 액세스 제한에 사용이 될 예정입니다.
[Figure 10]

테스트하고자 하는 MediaPackage 배포로 이동하여 동작을 변경합니다. 원본의 뷰어 액세스 제안 항목을 활성화하고 위 단계에서 생성한 키 그룹을 지정하여 배포를 업데이트 합니다.
[Figure 11]

배포가 완료된 이후 기존에 동일한 url로 접속한 경우 다음가 같이 콘텐츠를 플레이 되지 않고, Error Log로는 Missing Key-Pair-ID query parameter or cookie value 나오는것을 확인할수 있습니다.

결과: Access Error 발생


[Figure 12]

이를 해결하기 위해 CloudFront Signed URL로 접속하거나 또는 현재의 URL를 변경하지 않은 상태에서 Client에서 프라이빗 콘텐츠 접속 관련 인증 토큰에 필요한 쿠키 정보를 세팅할수가 있습니다. 다음 단계에선 각각 CloudFront Signed URL 그리고 Signed Cookie를 사용하여 프라이빗 콘텐츠를 재생하는 방법에 대해서 알아보겠습니다.

단계 3 : CloudFront Signed URL 설정

Signed URL은 크게 두가지가 종류가 있습니다. 파일 1개의 사용을 제한하는 Canned Policy를 사용한 방법과 파일 여러 개의 사용을 제한하는 Custom Policy를 사용한 Signed URL이 있습니다. Custom Policy는 Canned Policy와 다르게 URL에 정책의 내용이 포함이 되어 URL 길이가 깁니다. 블로그에서는 Custom Policy를 사용하여 문제를 해결하도록 합니다. Local 환경에 다음과 같이 policy를 생성합니다.

resource는 MediaPackage에서의 endpoint의 CloudFront URL을 입력합니다. EpochTime은 EpochTime 확인 싸이트를 통해서 만료될 시간을 입력 합니다.

{
    "Statement": [
        {
            "Resource": "https://d2852lpqdokte2.cloudfront.net/out/v1/fb91910d92da4bf48beb35fa703fba8d/*",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1679758614
                }
            }
        }
    ]
}

custom policy를 활용한 Signed URL를 생성하기 위해 필요한 필드값으로는 3가지가 필요한데 각각 Policy, Signature, Key-Pari-Id 값입니다.

  • 구조 : <resource값>?Policy=<생성한 Policy 값>&&Signature=<생성한 서명 값>&Key-Pair-Id=<Cloudfront 퍼블릭 키 ID>
  • Policy : 파일 사용 제한을 정의하는 정책 파일의 내용을 BASE64로 인코딩한 값이고 다음과 같은 명령어를 통해 확인 할 수가 있습니다. 명령어cat policy | tr -d “\n” | tr -d ” \t\n\r” | openssl base64 -A | tr — ‘+=/’ ‘-_~’
  • Signature : 파일 사용 제한을 정의하는 정책 파일의 내용을 CloudFront 개인 키로 서명한 해시(hash) 값이고 다음과 같은 명령어를 통해 확인 할 수가 있습니다. 명령어: cat policy | tr -d “\n” | tr -d ” \t\n\r” | openssl sha1 -sign private_key.pem | openssl base64 -A | tr — ‘+=/’ ‘-_~’
  • Key-Pair-Id : CloudFront 전용 키페어의 액세스키 입니다. CloudFront 키 관리 페이지, 단계1 에서 생성한 퍼블릭 키 ID


[Figure 13]

위의 Signed URL에 접속하면 m3u8 manifest 파일에 정상적으로 접속하는 것을 확인할수가 있습니다. 하지만 하위 manifest인 플레이리스트파일 그리고 세그먼트 ts 파일에 대해서는 Signed URL로 CloudFront에 요청하지 않기에 오류가 발생하는 것을 확인할수가 있습니다.

단계 4 : Signed URL를 활용하는 과정에서 토큰이 포함이 된 쿼리 스트링을 유지하도록 설정하는 방법

생성한 public_key.pem의 내용을 다음과 같이 복사하여 붙여 넣고 퍼블릭 키를 생성합니다. 해당 ID는 추후 Signed URL 또는 Signed Cookie의  쿼리 문자열 파라미터 (Key-Pari-Id) 에 사용이 됩니다.

이를 해결하기 위해선 player 레벨에서 토큰이 포함된 쿼리 스트링을 항상 유지시키도록 구현하는 것이 필요 합니다. 플레이어별로 각각 구현해야 하는 부분에 어려움이 있으셔서 서버단에서의 처리를 고민 할 수가 있지만 장기적으로 볼 때, CloudFront Function 등으로 인증을 구현하는 것은, 비용/성능/트러블슈팅 면에서 모두 불리합니다.

아래는 javascript를 이용하여 간단하게 크롬 브라우저에서 요청에 쿼리 스트링을 유지할 수 있습니다.

var query = 'Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMjg1MmxwcWRva3RlMi5jbG91ZGZyb250Lm5ldC9vdXQvdjEvZmI5MTkxMGQ5MmRhNGJmNDhiZWIzNWZhNzAzZmJhOGQvKiIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY3OTc1ODYxNH19fV19&Signature=CX3~dmGIy1Qy5f0gTVnsuhDT2kTQBV8Dlk5CjASln-QVPhMK0rnKNhBxWEg9JZ0xS5VcuVIdY~sZgblRsecMubCvSTFc2Q8aZHDd810GYdyG~mfNzvG9zBxof5Wd0gWbmQZpxPjyGQp-Eja~wdWlWhgbTb5Cxc78I44m2hZkWL8r6HZ3H21piQxWEeos~GXxlQT92cLF7DazR9-VMU8x1hV5tZCrvV6I8Nhb9~QKx8mCy1sO3pFn~6YElAZDT7lUS04q6Zl6e7Vl5sxlLAGWFkVzRC~UoNqGQb4zIzI2rc~1TsHIvTzcBVrbjnTrBIfiXMT-6s2kahckoRWf8oWzOA__&Key-Pair-Id=K10AXDHBSC5YVQ';
var originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
if (arguments[1].includes('.ts')||arguments[1].includes('.m3u8')){
arguments[1] = arguments[1] + '?' + query;
}
originalOpen.apply(this, arguments);
}

해당 소스를 기반으로 CloudFront에 요청하는 m3u8 및 ts 파일에 대해서 쿼리 스트링을 추가하여 Signed URL로 변환하면 정상적으로 프라이빗 콘텐츠가 재생이 되는 것을 확인할 수 있습니다.


[Figure 14]

단계 5 : Signed Cookie를 활용한 콘텐츠 보호

또 다른 방법으론 서버 클라이언트에 쿠키를 사용하고 플레이어는 쿠키를 가지고 콘텐츠를 요청할수가 있습니다. Signed Cookies는 다음과 같은 세 가지로 구성이 됩니다. CloudFront-Policy, CloudFront-Signature, CloudFront-Key-Pair-Id입니다. 크롬 브라우저에서 header 정보를 강제적으로 설정하기 위해서 크롬의 ModHeaher 플러그인을 설치 합니다. 해당 플러그인을 설치하면 우측상단 도구모음에 아이콘이 생기게 되고 Request Header 를 지정해서 넣을 수 있습니다.

단계 3을 통해서 생성된 policy, signature 및 key-pair-id 값을 기반으로 CloudFront-Policy, CloudFront-Signature, CloudFront-Key-Pair-Id를 설정합니다. Set-Cookie : CloudFront-Policy=<policy>; CloudFront-Signature=<signature>; Cloudfront-Key-Pair-Id=<Key-Pair-Id>

ModHeader 플러그인을 클릭하시고 다음과 같이 Request Headers를 추가합니다.


[Figure 15]

CloudFront에 요청하는 파일은 header정보에 ‘Cookie’ 항목이 세팅이 되고 이를 통해서 미디어 콘텐츠가 정상적으로 동작이 되는 것을 확인할 수가 있습니다.


[Figure 16]

AWS Elemental MediaPackage에서 DRM 연동하기

AWS Elemental Elemental은 AWS보안 패키지 및 인코더 키 교환 (SPEKE) API를 MediaPackage 사용하여 DRM 공급자의 콘텐츠 암호화 및 암호 해독을 용이하게 합니다. DRM 공급자는 SPEKE를 사용하여 SPEKE API를 MediaPackage 통해 암호화 키를 제공합니다. 또한 DRM 공급자는 지원되는 미디어 플레이어에 암호 해독을 위한 라이선스를 제공합니다. 블로그에서는 Pallycon DRM을 활용하여 콘텐츠를 패키징하고 토큰을 활용하여 DRM 콘텐츠를 재생하는 방법을 확인하겠습니다.

단계 1 : DRM 공급자를 활용한 콘텐츠 키 준비 및 관리

PallyCon 웹 사이트에 접속하셔서 무료 체험으로 아이디를 생성합니다.

로그인 정보를 입력하고 DRM Setting 탭을 클릭하여 MediaPackage에서 DRM 콘텐츠키 설정에 필요한 KMS Token, Site Credentials 등과 같은 정보들을 확인 합니다. 자세한 내용은 단계3에서 좀 더 알아보겠습니다.

단계 2 : SPEKE IAM Role 권한 생성

IAM 콘솔로 이동합니다. Roles 탭에 들어가서 MediaPackage에서 SPEKE 연동이 가능한 역할을 생성합니다.

서비스는 MediaConvert를 선택, Role 이름은 SPEKEAccess 로 설정하고 나머지는 전부 default 로 설정하고 역할 생성 버튼을 눌러 생성합니다.

Roles 탭에서 SPEKEAccess role을 선택 후 Trust relationships 탭의 Edit trust relationship 버튼을 클릭하고 Principal.Service의 값을 mediapackage.amazonaws.com 으로 변경 후 Update 버튼을 클릭합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "mediapackage.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

단계 3 : AWS Elemental MediaPackage Encryption 설정

AWS Elemental MediaPackage 콘솔로 이동합니다. Endpoints 에서 Add 버튼을 눌러 Endpoint 설정을 합니다. (채널을 생성한적 없으시다면 우선 채널 생성 부터 진행 하셔야 합니다.)

Endpoint name, packager settings 부분 등 원하는 콘텐츠 스펙에 맞게 설정 합니다. 예제에서는 package type을 DASH-ISO로 선택하도록 하겠습니다.

Encryption 섹션에서 Encrypt content 항목을 클릭하여 DRM encryption 옵션을 활성화 합니다.

Resource ID는 CID(content id)에 해당 하는 값으로 예제에서는 dashtest으로 입력합니다.

System ID: DRM 별 system id 값 입니다. 크롬 또는 파이어폭스에서 DASH 출력을 테스트하고자 하기에 Widevine ID를 입력하고 만약 safari로 테스트 하고자 하는 경우 Apple FairPlay ID를 입력하시면 됩니다. IE11/엣지 브라우저는 PlayReady ID를 입력하시면 되고 자세한 정보는 Content Protection에 규정된 DRM 별 system id 값을 참조하시면 됩니다.

·       Widevine: edef8ba9-79d6-4ace-a3c8-27dcd51d21ed

·       FaiPlay: 94ce86fb-07ff-4f43-adb8-93d2fa968ca2

·      PlayReady: 9a04f079-9840-4286-ab92-e65be0885f95

키 공급자 URL: KMS 연동 URL을 입력합니다. KMS token은 PallyCon 서비스 가입 시 생성되는 API 인증 토큰으로, 멀티 DRM 탭에서 DRM 세팅을 클릭하면서 우측과 같이 KMS 토큰을 확인할수가 있습니다.

KMS URL 형식: https://kms.pallycon.com/v1/cpix/getKey?enc-token=YOUR-KMS-TOKEN


[Figure 17]

Role ARN에 생성한 단계2에서 생성한 SPEKEAccess Role을 입력합니다.

SPEKE 버전은 V1으로 설정하는데 만약 멀티키 패키징은 기능을 원하시면 버전은 V2로 설정하시면 됩니다. DRM 암호화 적용 시 출력되는 비디오와 오디오 트랙을 서로 다른 키로 암호화하는 기능이며, PlayReady SL3000 또는 Widevine L1 등의 하드웨어 DRM을 적용하기 위해서는 반드시 필요합니다. 또한 KMS URL 링크는 다음과 같이 변경하여 설정하셔야 합니다.

다음 Additional configuration을 클릭하셔서 key rotation interval 항목을 0으로 세팅합니다. 0은 키 순환 기능을 비활성화 한다는 의미입니다.


[Figure 18]

그리고 Preview를 클릭하여 live streaming을 재생하면 다음과 같이 error 가 발생하는 것을 확인 할 수가 있습니다.


[Figure 19]

단계 4 :토큰 생성 및 DRM 콘텐츠 재생

패키징된 콘텐츠 재생하기 위해서는 DRM 라이선스 연동을 통해 플레이어에 해당 콘텐츠 라이선스가 발급되어야 합니다. 라이선스 요청에 사용되는 토큰은 정해진 규격에 따라 PallyCon 멀티DRM이 적용될 동영상 서비스의 서버 사이드(백엔드)에서 생성되어 클라이언트의 플레이어 코드에 적용되어야 합니다. 다음과 같이 PallyCon 사이트에서 제공하는 토큰 생성 페이지에서 토큰을 생성하여 DRM 콘텐츠를 재생하도록 하겠습니다.


[Figure 20]

멀티 DRM 탭에서 DRM 세팅을 클릭시면 해당 서비스에 가입 하면서 자동으로 생성이 된 사이트 ID, 사이트 Key 그리고 Access Key를 확인할수가 있습니다.

DRM Type으론 Widevine을 입력하고 CID는 단계3에서 설정하신 ResourceID를 입력합니다. (예제: dashtest), 크롬/파이어폭스 브라우저를 이용하는 경우에는 Widevine, IE11/엣지 브라우저의 경우는 PlayReady로 DRM Type 값이 입력되어야 합니다.

UserID로는 임의의 사용자 정보를 입력하고 Time stamp는 현재 시간으로 싱크업하고 request token 버튼을 클릭하여 Token 값을 결과로 출력 받을 수가 있습니다.

이제 해당 토큰 값을 가지고 DRM 콘텐츠를 재생하기 위한 설정을 진행하도록 하겠습니다. Preview에서 Options를 클릭하고 DRM Options를 설정합니다. Widevine를 선택하고 Licen Url 및 위 단계에서 생성한 토큰값으로 헤더값을 정의합니다.

·       Licence URL: https://license-global.pallycon.com/ri/licenseManager.do

·       Request Header Key:  pallycon-customdata-v2

·       Request Header Value : 단계 4에서 생성한 Result 토큰 값


[Figure 21]

결과:

모든 설정을 완료하면 다음과 같이 DRM 콘텐츠 영상이 오류 없이 잘 재생이 되는것을 확인할수 있습니다.


[Figure 22]

결론

이 게시글에서는 미디어 서비스를 제공하는 고객사에서 필수적으로 고려가 되어야 하는 라이브 환경에서의 콘텐츠 보안 강화 방안에 대해서 설명하였습니다. AWS MediaPackage에서 CDN authorization를 활용하여 사용자에게 제공이 된 CloudFront Url로만 접속이 가능하도록 설정할 수가 있습니다. 또한 DRM 솔루션과의 연동을 통하여 미디어 콘텐츠 자체에 대한 보안을 강화할 수가 있습니다. 그리고 Amazon CloudFront를 활용하여 Signed URL, Signed Cookie, 그리고 실제 사용하는 과정에서 보안 토큰 쿼리스트링을 유지하는 등 방안을 설명합니다. 이를 통해 사용자는 소중한 미디어 콘텐츠를 보호하는 체계를 다양한 방법으로 구축할 수가 있습니다.

Yongzhe Ren

Yongzhe Ren

렌(Yongzhe Ren) 솔루션즈 아키텍트는 다양한 분야의 엔지니어 경험을 바탕으로, 고객의 비즈니스 성과를 달성하도록 최적의 아키텍처를 구성하는 역할을 수행하고 있습니다.

YoHan Choi

YoHan Choi

최요한 Sr Edge Services Specialist SA 는 방송 미디어에 대한 다양한 설계와 개발 경험을 바탕으로 최적의 솔루션을 선택하여 비즈니스 성과를 달성할 수 있도록 고객과 함께 전문 미디어 솔루션 아키텍처를 구성하는 역할을 수행하고 있습니다.