AWS 기술 블로그
AWS Elemental MediaConvert및 Amazon CloudFront를 활용한 미디어 콘텐츠의 보안 강화 전략 – Part 2: VOD
이전 게시글, AWS 미디어 서비스를 활용한 라이브 스트리밍 미디어 콘텐츠의 보안 강화 전략 – Part1: Live Streaming 에서는 라이브 스트리밍 보안에 대해 살펴 보았습니다. 이번 게시글에서는 VOD(Video On Demand)를 안전하게 스트리밍하기 위해 오리진부터, 트랜스 코딩 및 패키징, 콘텐츠 전송 네트워크 (CDN) 배포까지 각 단계별로 미디어 콘텐츠의 보안을 강화하는 방안에 대해 소개합니다.
솔루션 개요
이번 게시글에서 소개할 VOD에 대한 보안 적용방안은 아래와 같습니다.
1) 콘텐츠 원본 오리진으로 Amazon S3를 이용할 때, 오리진의 콘텐츠 보호를 위해서 Amazon S3에서 외부 접근을 모두 차단하여 직접적인 액세스를 제한하고, 콘텐츠 전송 네트워크 (CDN) 서비스인 CloudFront의 OAI(Origin Access Identity) 설정을 통해 제공받은 CDN 배포 도메인 주소로 VOD 콘텐츠 액세스를 관리할 수 있습니다.
2) AWS Elemental MediaConvert는 파일 기반 콘텐츠를 빠르고 안정적으로 모든 규모의 다양한 콘텐츠를 브로드캐스트 및 스트리밍용으로 트랜스코딩 할 수 있는 서비스로, 콘텐츠 보호를 위해 트랜스코딩 과정에서 다양한 DRM 솔루션과 손쉽게 연동할 수 있도록 제공할 수 있습니다.
3) Amazon CloudFront에서 Signed URL과 Signed 쿠키를 사용하여 프라이빗 콘텐츠 제공, 지리적 배포 제한, HTTPS 사용 등 다양한 설정을 추가하여 보안을 강화할 수 있습니다. 또한, Signed URL을 활용하는 과정에서 디바이스 Player가 토큰이 포함된 manifest 파일 및 비디오 스트림의 쿼리 스트링을 유지하지 못하는 경우, 이런 문제를 해결할 수 있는 방안에 대해서도 설명합니다.
솔루션 구현 요약
- 콘텐츠 원본 오리진인 S3에서 직접 액세스 제한하기
- 단계 1: 소스 및 타겟 S3 버킷 생성 및 퍼블릭 액세스 차단
- 단계 2: CloudFront 배포 생성 및 원본 액세스 제어 설정
- 단계 3: 타겟 S3 버킷 정책 수정하기
- AWS Elemental MediaConvert를 활용한 트랜스 코딩 과정에서 DRM 연동하기
- 단계 1: DRM 공급자를 활용한 콘텐츠 키 준비 및 관리
- 단계 2: SPEKE IAM Role 권한 생성
- 단계 3: AWS Elemental MediaPackage Encryption 설정
- 단계 4: 라이선스 토큰 생성 및 DRM 콘텐츠 재생
- Amazon CloudFront를 활용한 Access control 설정하기
- 단계 1: 키 페어 설정
- 단계 2: CloudFront Signed URL 또는 Signed Cookie 설정
- 단계 3: CloudFront Signed URL 설정
- 단계 4: Signed URL 활용하는 과정에서 토큰이 포함된 쿼리 스트링을 유지하도록 설정하는 방법
- 단계 5: Signed Cookie를 활용한 콘텐츠 보호
사전 준비사항
솔루션을 배포하기 위해서는 아래와 같은 사항을 미리 준비해야 합니다.
- AWS 계정
- 미디어 워크로드 : 운영중인 미디어 솔루션이 없는 경우, AWS 솔루션 라이브러리에 접속하셔서AWS Elemental MediaConvert 및 Amazon CloudFront를 활용한 온디맨드 비디오 워크플로우 솔루션을 참조합니다.
1. 콘텐츠 원본 오리진인 S3에서 직접 액세스 제한하기
콘텐츠 원본 오리진인 S3에서 직접 액세스를 제한하고, CloudFront OAI 설정을 통해 제공받은 CDN 배포 도메인 주소로 VOD 콘텐츠 액세스를 관리할 수 있습니다.
단계 1 : 소스 및 타겟 S3 버킷 생성 및 액세스 차단
S3 콘솔에 접속하여 소스 및 타겟 버킷 두 개를 생성합니다. 해당 예시에서는 소스 버킷 이름으로 vod-security-source-xxx를 입력했고, 타겟 버킷 이름은 vod-security-destination-xxx 으로 지정했습니다.
퍼블릭 액세스 차단 설정 탭에서 모든 퍼블릭 액세스를 차단하도록 설정값을 활성화 시킵니다. 이를 통해 외부에서는 해당 버킷에 있는 콘텐츠를 조회할 수 없도록 차단됩니다. 나머지 설정 값은 그대로 두고 버킷 생성을 완료합니다.
단계 2 : CloudFront 배포 생성 및 원본 액세스 제어 설정
CloudFront 콘솔 -> 보안 -> 원본 액세스 -> 제어 설정 생성 버튼을 클릭하여 Origin Access Identity (OAI)를 설정합니다. OAI는 CloudFront가 제한된 S3 객체에 액세스 할 수 있도록 허용하는 CloudFront 의 설정입니다. 제어 설정 생성에서 이름은 vod-security-oai 로 입력하고 서명 요청 (권장)을 활성화하고, 기타 값은 default 값으로 두고 생성 버튼을 클릭합니다.
다음으로 타겟 버킷 접속을 위한 CloudFront 배포를 생성합니다. 원본 도메인은 위에 생성한 타겟 버킷 vod-security-destination-xxx.s3.ap-northeast-2.amazonaws.com 을 선택하고 원본 액세스 설정은 ‘원본 액세스 제어 설정 (권장)’을 선택하고, origin access control은 방금 전에 생성한 vod-security-oai 를 선택합니다. 기타 값은 default 값 그대로 두고 배포 생성 버튼을 클릭합니다.
단계 3 : 타겟 S3 버킷 정책 수정하기
타겟 S3 버킷 정책을 업데이트 하기 위해 콘솔에서 제공하는 정책을 복사합니다.
다음 타겟 S3 버킷으로 이동하여 권한 탭을 클릭하고, 버킷 정책을 편집합니다. 편집 버튼을 클릭하여 위에서 복사한 정책을 붙여넣기 합니다. 예는 아래와 같습니다.
타겟 버킷에 임의의 이미지를 업로드하고, 객체 URL를 클릭하면 다음과 같이 AccessDenied 오류 메시지를 확인할 수 있습니다.
위에서 생성한 Cloudfront 배포 도메인 주소를 기반으로 이미지에 접속해보면, 위와 달리 정상적인 접근이 가능하다는것을 확인할 수 있습니다.
2. AWS Elemental MediaConvert를 활용한 트랜스코딩 과정에서 DRM 연동하기
AWS Elemental MediaConvert는 AWS보안 패키저 및 인코더 키 교환 (SPEKE) API를 MediaPackage 사용하여 DRM 공급자의 콘텐츠 암호화 및 암호 해독을 용이하게 합니다. DRM 공급자는 SPEKE를 사용하여 SPEKE API를 MediaConvert를 통해 암호화 키를 제공하고, 지원되는 미디어 플레이어에 암호 해독을 위한 라이선스를 제공합니다. 이번 게시글에서는 Pallycon DRM을 활용하여 콘텐츠를 트랜스 코딩하고 토큰을 활용하여 DRM 콘텐츠를 재생하는 방법을 알아 보겠습니다.
단계 1 : DRM 공급자를 활용한 콘텐츠 키 준비 및 관리
PallyCon 사이트에 접속하셔서 무료 체험으로 아이디를 생성합니다. 로그인 정보를 입력하고 DRM Setting 탭을 클릭하여 MediaPackage에서 DRM 콘텐츠키 설정에 필요한 KMS Token, Site Credentials 등과 같은 정보들을 확인합니다. 자세한 내용은 단계 3에서 좀 더 알아보겠습니다.
단계 2 : SPEKE IAM Role 권한 생성
IAM 콘솔에 접속하여, MediaPackage에서 SPEKE 연동이 가능한 역할(Role)을 생성합니다. 역할을 생성할 때, 서비스는 MediaConvert를 선택하고 Role 이름은 vod-security-mc-role 로 설정합니다. 나머지는 전부 default 로 설정하고 역할 생성 버튼을 누릅니다.
단계 3 : AWS Elemental MediaConvert 작업 생성
AWS Elemental MediaConvert 콘솔로 이동합니다. 작업 생성 버튼을 클릭하고 입력은 소스 버킷에 업로드한 test 영상 파일 (임의의 영상을 업로드하면 되기에 해당 블로그에서 출처를 명시하지 않았습니다.)을 선택합니다.
다음 작업 설정 탭에서 AWS 통합을 선택하고, 서비스 액세스 설정에서 서비스 역할을 방금 전에 생성한 vod-security-mc-role을 입력합니다.
출력 그룹에서 추가 버튼을 클릭하고 DASH ISO를 선택합니다.
그리고 DASH ISO 그룹 설정에서 사용자 지정 그룹 이름에는 사용자가 구분하기 편한 이름을 입력합니다. 예: vod-security-destination
대상 항목에 패키징이 완료된 파일이 들어갈 s3 타겟 버킷 경로를 지정합니다. 예 : vod-security-destination-xxx
DRM 암호화를 활성화하고 Resource ID, System ID, URL를 입력합니다.
- Resource ID는 CID(content id)에 해당하는 값으로, 예제에서는 dashtest으로 입력합니다.
- System ID: DRM 별 system id 값 입니다. 애플 기기와 다른 플랫폼을 모두 지원하려면 하나의 입력에 대해서 DASH ISO와 Apple HLS 두 개의 출력 그룹을 생성해야 합니다. 크롬 또는 파이어폭스에서 DASH 출력을 테스트하기 위해 Widevine ID를 입력하고, 만약 safari로 테스트 하고자 하는 경우는 Apple FairPlay ID를 입력하면 됩니다. IE11/엣지 브라우저는 PlayReady ID를 입력합니다. 자세한 정보는 Content Protection에 규정된 DRM 별 system id 값을 참조하면 됩니다. 이 게시글에서는 DASH 출력 그룹에 Widevine과 PlayReady 방식으로 DRM를 적용하는 방법에 대해서 설명하겠습니다.
- Widevine: edef8ba9-79d6-4ace-a3c8-27dcd51d21ed
- 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
인증서 ARN는 비워 두고 재생 디바이스 호환성은 CENC v1 으로 설정합니다.
DASH output의 경우, 비디오와 오디오가 하나의 output으로 출력되면 일부 Widevine 환경에서 재생이 안 되므로 비디오와 오디오 트랙을 나눠서 생성해야 합니다. (‘Add output’ 버튼 클릭)
생성 버튼을 클릭한 후, S3 타겟 버킷에 접속하면 트랜스코딩된 파일이 생성된 것을 확인할 수 있습니다. 다음은 Dash Player에 접속하여 Cloudfront의 도메인 주소를 입력하면 다음과 같이 DRM no license error 오류 메시지가 발생하는 것을 확인할 수 있습니다. 예 : https://d1vd51z3a5e5th.cloudfront.net/test.mpd
단계 4 :토큰 생성 및 DRM 콘텐츠 재생
패키징된 콘텐츠를 재생하기 위해 DRM 라이선스 연동을 통해 플레이어에 해당 콘텐츠 라이선스가 발급되어야 합니다. 라이선스 요청에 사용되는 토큰은 정해진 규격에 따라 PallyCon 멀티DRM이 적용될 동영상 서비스의 서버 사이드(백엔드)에서 생성되어 클라이언트의 플레이어 코드에 적용되어야 합니다. 다음과 같이 PallyCon 사이트에서 제공하는 토큰 생성 페이지에서 토큰을 생성하여 DRM 콘텐츠를 재생하도록 하겠습니다. 토큰 생성 페이지 : https://sample.pallycon.com/customdata/#createToken
멀티 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를 선택하고 License URL 및 위 단계에서 생성한 토큰값으로 헤더값을 정의합니다.
- License URL: https://license-global.pallycon.com/ri/licenseManager.do
- Request Header Key: pallycon-customdata-v2
- Request Header Value : 단계 4에서 생성한 Result 토큰 값
결과:모든 설정을 완료하고 Load 버튼을 클릭하면 정상적으로 콘텐츠를 재생할 수 있음을 확인 할 수 있습니다.
3. 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 패키지를 설치합니다.
RSA 알고리즘을 이용한 private key를 생성합니다.
해당 private key기반으로 public key를 생성합니다.
단계 2 : CloudFront Signed URL 또는 Signed Cookie 설정
생성한 public_key.pem의 내용을 다음과 같이 복사하여 붙여넣고 퍼블릭 키를 생성합니다. 해당 ID는 추후 Signed URL 또는 Signed Cookie의 쿼리 문자열 파라미터 (Key-Pari-Id) 에 사용이 됩니다.
이전 단계에서 생성한 vod 퍼블릭 키를 기반으로 다음과 같이 키 그룹을 생성합니다. 이 키 그룹은 뷰어 액세스 제한에 사용될 예정입니다.
위에서 생성한 CloudFront 배포로 이동하여 동작을 변경합니다. 원본의 뷰어 액세스 제한 항목을 활성화하고, 위 단계에서 생성한 키 그룹을 지정하여 배포를 업데이트합니다.
배포가 완료된 이후, 기존의 동일한 url로 접속한 경우 다음과 같이 콘텐츠가 플레이되지 않고, Error Log에 mpd is not available 메세지가 표시되는 것을 확인합니다.
결과: Access Error 발생
이를 해결하기 위해 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에는 만료될 시간을 입력합니다.
Custom Policy를 활용한 Signed URL를 생성하기 위해 필요한 필드 값은 Policy, Signature, Key-Pair-Id 값입니다. 자세한 내용은 Signed 쿠키 사용 개발자 가이드 문서를 참조하면 됩니다.
- 구조 : <resource값>?Policy=<생성한 Policy 값>&Signature=<생성한 서명값>&Key-Pair-Id=<Cloudfront 퍼블릭 키 ID>
- Policy : 파일 사용 제한을 정의하는 정책 파일의 내용을 BASE64로 인코딩한 값이고 다음과 같은 명령어를 통해 확인할 수 있습니다.
- Signature : 파일 사용 제한을 정의하는 정책 파일의 내용을 CloudFront 개인 키로 서명한 해시값이고 다음과 같은 명령어를 통해 확인할 수 있습니다.
- Key-Pair-Id : CloudFront 전용 키 페어의 액세스 키 입니다.(CloudFront 키 관리 페이지, 단계 1 에서 생성한 퍼블릭 키 ID)
위의 Signed URL에 접속하면 m3u8 manifest 파일에 정상적으로 접속하는 것을 확인할 수 있습니다. 하지만 하위 manifest인 플레이리스트파일 그리고 세그먼트 ts 파일에 대해서는 Signed URL로 CloudFront에 요청하지 않기 때문에 오류가 발생하는 것을 확인할 수 있습니다.
단계 4 : Signed URL을 활용하는 과정에서 토큰이 포함된 쿼리 스트링을 유지하도록 설정하는 방법
생성한 public_key.pem의 내용을 다음과 같이 복사하여 붙여넣고 퍼블릭 키를 생성합니다. 해당 ID는 추후 Signed URL 또는 Signed Cookie의 쿼리 문자열 파라미터 (Key-Pair-Id) 에 사용됩니다.
이를 해결하기 위해서는 player에서 토큰이 포함된 쿼리 스트링을 항상 유지시키도록 구현하는 것이 필요합니다. 플레이어별로 각각 구현해야 하는 부분이 어려워 서버단에서 처리하는 것을 고민할 수 있지만, 장기적인 관점에서 CloudFront Function 등으로 인증을 구현하는 것은 비용, 성능, 트러블슈팅 관점에서 모두 불리합니다.
아래는 javascript를 이용하여 간단하게 크롬 브라우저에서 요청에 쿼리 스트링을 유지할 수 있습니다.
해당 소스를 기반으로 CloudFront에 요청하는 m3u8 및 ts 파일에 대해서 쿼리 스트링을 추가하여 Signed URL로 변환하면 정상적으로 프라이빗 콘텐츠가 재생되는 것을 확인할 수 있습니다.
단계 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를 설정합니다.
ModHeader 플러그인을 클릭하고, 다음과 같이 Request Headers를 추가합니다.
CloudFront에 요청하는 파일은 header정보에 ‘Cookie’ 항목이 세팅되고, 이를 통해 미디어 콘텐츠가 정상적으로 동작되는 것을 확인할 수 있습니다.
결론
이번 게시글에서는 1편 (Live 콘텐츠 보안)에 이어서 VOD 콘텐츠 보안과 함께 미디어 서비스를 제공하는 고객사가 필요로 하는 워크로드에서 AWS서비스를 활용한 콘텐츠 보안 강화 방안에 대해서 소개했습니다. 콘텐츠 원본 오리진인 S3에서 직접 액세스를 제한시키고, 사용자에게 제공된 CloudFront URL로만 접속이 가능하도록 설정하여 VOD 원본 콘텐츠 보안을 강화할 수 있습니다. 또한, AWS MediaConvert에서 DRM 솔루션과의 연동하여 트랜스 코딩 과정에서 미디어 콘텐츠 자체에 대한 보안을 강화할 수 있습니다. 마지막으로 Amazon CloudFront를 활용하여 Signed URL, Signed Cookie를 생성하여 배포 과정에서의 보안을 강화하는 방안에 대해서 살펴 보았습니다. 1편과 2편을 통해 사용자는 Live 와 VOD 미디어 콘텐츠를 보호하는 체계를 다양한 방법으로 구축할 수 있습니다.
참고 자료
AWS Elemental MediaPackage 및 Amazon CloudFront를 활용한 미디어 콘텐츠의 보안 강화 전략 – Part1: Live Streaming