출처 ; http://www.html5rocks.com/ko/tutorials/eme/basics/
인크립티트 미디어 익스텐션(Encrypted Media Extensions, 역자주: 이하 EME)은 웹 애플리케이션이 콘텐트 보호 시스템과 상호 작용할 수 있게 하는 API를 제공해 암호화된 오디오와 비디오를 재생할 수 있도록 합니다.
이 글은 EME API와 그 사용법에 관한 것입니다. EME를 둘러싼 의견(politics)에 관심 있는 사람을 위해 장단점 논쟁을 이 문서에 요약했습니다.
디지털 미디어에 대한 일반 소개는 Monty Montgomery의 Digital Media Primer for Geeks를 살펴보세요.
EME는 같은 앱과 암호화된 파일을 하위 보호 시스템에 관계없이 어떤 브라우저에서나 사용할 수 있도록 디자인했습니다. 전자는 표준화된 API가 가능하게 하고 후자는 공통 암호화(Common Encryption) 개념이 가능하게 했습니다.
EME는 HTMLMediaElement
표준의 확장(extension)입니다. 그래서 이름이 그러합니다. '확장'은 브라우저가 EME을 지원하는 것이 선택적이라는 의미입니다. 브라우저가 암호화된 미디어를 지원하지 않으면 암호화된 미디어를 재생하지 못하겠지만, EME가 HTML 스펙 준수(compliance)에 필요하지는 않습니다. EME 스펙에서:
이 제안은 HTMLMediaElement를 확장하여 보호된 콘텐트 재생을 제어하는 API를 제공한다.
이 API는 간단한 클리어 키(Clear Key) 암호화에서 (적절한 사용자 에이전트 구성을 주면) 높은 가치의 비디오까지 사용 사례를 지원한다. 애플리케이션이 라이선스/키 교환을 제어한다. 이는 다양한 콘텐트 복호화와 보호 기술을 지원하는 강력한 재생 애플리케이션 개발을 쉽게 한다.
이 스펙은 콘텐트 보호나 디지털 권리 관리(DRM) 시스템을 정의하지 않는다. 오히려 더 간단한 콘텐트 암호화 시스템뿐만 아니라 그러한 시스템을 이용하여 발견, 선택, 상호 작용하는 공통 API를 정의한다. 이 스펙의 준수(compliance)는 DRM 구현을 요구하지 않는다. 일반 베이스라인(baseline, 역자주: 기초)으로 간단한 클리어 키 시스템을 구현해야 한다.
공통 API는 간단한 콘텐트 암호화 기능 세트를 지원한다. 이는 페이지 작성자에게 인증과 권한 같은 애플리케이션 기능을 맡긴다. 페이지가 중재하는 콘텐트 보호 시스템에 국한하는 시스템 메시징을 요구하여 이를 해낸다. 암호화 시스템과 라이선스 서버나 다른 서버 사이의 대역 외(out-of-band) 통신을 가정하지는 않는다.
다음의 외부 콤포넌트를 사용해 EME을 구현합니다.
- 키 시스템: 콘텐트 보호 (DRM) 메커니즘. EME는 클리어 키(더 자세한 내용은 아래에)를 제외하고는 키 시스템 자체를 정의하지 않습니다.
- 콘텐트 복호화 모듈 (CDM): 암호화된 미디어를 재생할 수 있게 하는 클라이언트 쪽 소프트웨어 혹은 하드웨어 메커니즘. 키 시스템을 사용하기 때문에 EME가 CDM를 정의하지는 않습니다. 하지만 EME는 애플리케이션이 사용할 수 있는 CDM과 상호 작용하는 인터페이스를 제공합니다.
- 라이선스 (키) 서버: CDM과 상호 작용하여 미디어 복호화를 위한 키 제공. 라이선스 서버와의 협상(negotiation)은 애플리케이션 몫입니다.
- 패키징 서비스: 배포와 소비를 위한 미디어 인코딩과 암호화.
EME를 사용하는 애플리케이션이 라이선스 서버를 사용하여 복호화할 수 있는 키를 얻는다는 점에 주목하세요. 하지만 사용자 신원(identity)과 인증이 EME의 몫은 아닙니다. (선택적으로) 사용자 인증을 한 후에 미디어를 재생할 수 있게 하는 키 추출이 일어납니다. Netflix 같은 서비스는 그들의 웹 애플리케이션에서 사용자 인증을 해야 합니다. 사용자가 그 애플리케이션에 로그인할 때 애플리케이션이 사용자의 신원과 권한을 결정합니다.
EME은 어떻게 동작하는가?
EME의 컴포넌트가 상호 작용하는 법이 여기 있습니다. 이는 아래의 코드 예제와 일치합니다.
- 웹 애플리케이션이 하나 이상의 암호화된 스트림을 가진 오디오나 비디오를 재생하려 합니다.
- 브라우저는 미디어가 암호화된 것을 알고 (어떻게 아는지는 아래 상자를 보세요) 암호화에 관해 미디어에서 받은 메타데이터(
initData
)를 가지고 needkey
이벤트를 발생합니다. - 애플리케이션이
needkey
이벤트를 처리합니다.- 미디어 엘리먼트와 연관 지은
MediaKeys
객체가 없다면 사용 가능한 키 시스템 확인을 위해 MediaKeys.isTypeSupported()
을 사용하여 사용 가능한 키 시스템과 라이선스 서버를 먼저 선택합니다. 그리고 사용 가능한 키 시스템을 위한MediaKeys
객체를 생성합니다. MediaKeys
객체는 오디오나 비디오 엘리먼트를 위한 미디어 복호화에 사용하는 키를 나타냅니다. 이 객체는 하나의 CDM 개체를 나타내고 특히 키 세션 생성을 위해 그 CDM로의 접근을 제공합니다. - 일단
MediaKeys
객체가 생성되면 그 객체를 미디어 엘리먼트에 할당합니다.setMediaKeys()
는 MediaKeys
객체를 하나의 HTMLMediaElement와 연관 짓습니다. 그래서 재생하는 동안 (즉, 디코딩하는 동안) 그 객체의 키를 사용할 수 있습니다.
- 앱은
MediaKeys
에 createSession()
을 호출하여 CDM의 needkey
핸들러에서 받은 미디어 데이터를 전달합니다. 이 메소드는 라이선스와 키의 수명을 나타내는MediaKeySession
을 생성합니다. - CDM은
message
이벤트를 발생합니다. 라이선스 서버에 키를 요구하는 요청입니다. MediaKeySession
객체는 message
이벤트를 받고 애플리케이션은 라이선스 서버로 (예를 들어 XHR을 통해) 메시지를 보냅니다.- 애플리케이션이 라이선스 서버로부터 응답받고
MediaKeySession
의 update()
메소드를 사용하여 CDM에 데이터를 전달합니다. - CDM이 라이선스에 있는 키로 미디어를 복호화합니다. 미디어 엘리먼트와 연관 지은
MediaKey
내의 어떤 세션에서 얻은 유효한 키를 사용할 수 있습니다. 각 키는 키 ID로 맞는지 확인합니다. CDM은 키 ID를 인덱스로 하여 키 및 관련 데이터를 저장합니다. - 미디어 재생을 시작합니다.
휴...
미디어가 암호화됐다는 것을 브라우저는 어떻게 알까요?
미디어 컨테이너 파일의 메타데이터에 이 정보가 있습니다. ISO BMFF나 WebM 같은 어떤 포맷으로 돼 있을 것입니다. ISO BMFF에서 이 정보는 헤더 메타데이터를 의미하며보호 스키마 정보 박스(protection scheme information box)라고 부릅니다. WebM은 Matroska의 ContentEncryption 엘리먼트를 사용하고 WebM에 국한하는 추가 사항(additions)이 있습니다. EME 스펙은 각 컨테이너를 위한 가이드라인을 제공합니다.
CDM이나 서버 사이에 다수의 메시지가 있을 수 있다는 점에 주목하세요. 이 과정의 모든 통신은 브라우저와 애플리케이션이 알 수 없습니다. CDM과 라이선스 서버만 메시지를 이해합니다. 라이선스 요청은 결과로 오는 라이선스에서 콘텐트 키를 암호화할 때 사용하는 키뿐 아니라 CDM의 유효성(과 신뢰 관계) 증명도 포함합니다.
...그런데 실제로 CDM가 무엇을 하나요?
EME 구현의 내부에서 미디어 복호화 방법을 제공하지는 않습니다. 웹 애플리케이션이 CDM과 상호작용하는 API만 제공합니다.
EME 스펙이 CDM이 실제로 하는 것을 정의하지는 않습니다. CDM은 미디어 디코딩(압축 해제)뿐 아니라 복호화를 다룰 수 있습니다. 가장 약한 것부터 가장 강한 것까지 CDM 기능을 위한 여러 가능성 있는 옵션이 있습니다.
- 복호화만 하고 보통의 미디어 파이프라인을 사용해 재생할 수 있게 합니다. 예를 들면 <video> 엘리먼트를 사용합니다.
- 복호화와 디코딩을 하고 렌더링할 브라우저에 비디오 프레임을 전달합니다.
- 복호화와 디코딩을 하고 하드웨어(예를 들어 GPU)에서 직접 렌더링합니다.
웹 앱에서 CDM을 사용할 수 있게 하는 방법이 여럿 있습니다.
- CDM을 브라우저에 포함해 팝니다.
- CDM을 별도로 배포합니다.
- CDM을 운영체제(OS) 내에 만듭니다.
- CDM을 펌웨어에 포함합니다.
- CDM을 하드웨어에 내장합니다.
CDM을 사용할 수 있게 하는 법을 EME 스펙에서 정의하지는 않습니다. 하지만 모든 경우에 브라우저는 CDM을 조사하고 공개