---
title: "윈도우즈 크롬에서의 PlayReady SL3000 지원"
description: "이 가이드는 윈도우즈 크롬 브라우저에서의 PlayReady Security Level 3000 (SL3000) 통합 및 지원에 대해 설명합니다."
---
> For the complete documentation index, see [llms.txt](/llms.txt).

이 가이드는 Windows Chrome 브라우저에서의 **PlayReady Security Level 3000 (SL3000)** 통합 및 지원에 대해 설명합니다. PlayReady SL3000은 Windows의 하드웨어 기반 DRM 경로를 활용하여 고가치 콘텐츠(4K/UHD, HDR, HEVC 등)를 보호합니다.

과거에는 Microsoft Edge에서만 사용할 수 있었던 이 기능은 이제 Windows 11 사용자를 위한 Google Chrome에서도 하드웨어 보안 재생을 지원합니다.

## 전제 조건

PlayReady SL3000을 활용하기 위해서는 최종 사용자 환경과 구현이 다음 요구 사항을 충족해야 합니다.

### 시스템 요구 사항

*   **운영 체제:** Windows 11 21H2 (빌드 22000) 이상
*   **브라우저:** Chrome 버전 **140.0.7339.0** 이상
*   **하드웨어:** PlayReady SL3000을 지원하는 유효한 GPU 드라이버
*   **아키텍처 제한:**
    *   지원됨: x64 (네이티브)
    *   **지원되지 않음:** x86 빌드, ARM64 빌드, 또는 WoW 에뮬레이션을 통해 ARM64에서 실행되는 x86_64 빌드

### 코덱 지원

*   **H.264:** 기본적으로 지원됨
*   **HEVC:** 지원됨. 단, Microsoft Store에서 [HEVC 비디오 확장(HEVC Video Extensions)](https://www.microsoft.com/en-us/p/hevc-video-extensions/9nmzlz57r3t7)을 설치해야 함
*   **AV1:** 현재 개발 중/실험적 상태

## 구현 설정

Chrome에서 PlayReady SL3000 키 시스템을 타겟팅하려면 구체적인 EME(Encrypted Media Extensions) 설정이 필요합니다.

### 키 시스템 문자열 및 강건성 

다음과 같은 키 시스템 문자열과 강건성 설정이 권장됩니다.

- 키 시스템 문자열: `com.microsoft.playready.recommendation.3000`
- 비디오/오디오 강건성: 설정 안함 또는 빈 문자열 설정

키 시스템 문자열 자체에 하드웨어 수준의 강건성 적용이 포함되어 있으므로 별도의 Robustness 설정이 불필요합니다.

:::caution

**Key ID 바이트 순서**

Chrome의 PlayReady는 EME 사양의 Key ID 형식을 따릅니다 (Widevine과 동일). 하지만 Edge나 IE와 같은 레거시 PlayReady 구현체는 종종 다른 GUID 바이트 순서를 사용합니다.

기존 라이선스 서버나 클라이언트 로직이 Edge에서 사용되는 특정 "Microsoft GUID" 바이트 순서를 예상한다면, Chrome에서 사용되는 표준 UUID 형식을 지원하도록 로직을 업데이트해야 할 수 있습니다.

:::

### 하드웨어 컨텍스트 재설정 처리

PlayReady SL3000 사용 시 **하드웨어 컨텍스트 재설정**이라는 고유한 문제가 발생할 수 있습니다. 이는 다음과 같은 시스템 이벤트로 인해 보안 미디어 경로가 중단될 때 발생합니다.
*   장치가 절전 모드로 진입하거나 깨어날 때 (예: 노트북 덮개를 닫고 열 때)
*   새 모니터를 연결하거나 그래픽 토폴로지가 변경될 때

이러한 상황이 발생하면 복호화 키가 손실되며, 브라우저는 별도의 조치 없이는 자동으로 재생을 재개할 수 없습니다.

#### 브라우저 동작

재설정이 발생하면 다음과 같은 현상이 일어납니다.

1.  브라우저가 `"hardware-context-reset"`이라는 이유로 모든 `MediaKeySession` 객체를 닫습니다.
2.  미디어 엘리먼트에서 `waitingforkey` 이벤트가 발생합니다.
3.  재생이 멈춥니다.

#### 구현 요구 사항

플레이어 애플리케이션은 반드시 이러한 이벤트를 감지하고 복구 로직을 처리해야 합니다.

**복구 전략:**

1.  `MediaKeySession.closed` 프라미스(Promise)를 모니터링합니다.
2.  닫힌 이유가 `hardware-context-reset`인지 확인합니다.
3.  확인된 경우, 반드시 **MediaKeySession을 다시 생성**하고 라이선스를 재요청한 뒤 미디어 엘리먼트를 업데이트해야 합니다.
4.  또는, 플레이어 인스턴스를 리로드하거나 사용자에게 "재생" 버튼을 눌러 세션을 다시 시작하도록 유도합니다.


### 오픈 소스 플레이어 설정

널리 사용되는 오픈 소스 플레이어를 사용하는 경우, 올바른 키 시스템 매핑을 위해 특정 설정이 필요합니다.

#### Shaka Player

Shaka Player는 기본적으로 표준 PlayReady 키 시스템을 사용할 수 있습니다. 따라서 SL3000 문자열을 명시적으로 매핑해야 합니다.

```javascript
drm: {
    servers: {
        'com.microsoft.playready': 'YOUR_LICENSE_URL',
    },
    keySystemsMapping: {
        // 표준 PlayReady를 SL3000 특정 문자열로 매핑
        'com.microsoft.playready': 'com.microsoft.playready.recommendation.3000'
    }
}
```

#### Video.js (videojs-contrib-eme)

특정 SL3000 키 시스템을 사용할 때, 브라우저는 요청 본문에 전체 `<PlayReadyKeyMessage>` XML을 전송합니다. 일부 라이선스 서버는 `<Challenge>` 데이터만 기대할 수 있으므로, `getLicense` 콜백에서 메시지를 파싱해야 할 수도 있습니다.

```javascript
// getLicense 콜백 구현 의사 코드(Pseudocode)
getLicense: function(emeOptions, keyMessage, callback) {
    // 1. 'keyMessage' (XML) 파싱
    // 2. <Challenge> 태그 내부의 콘텐츠 추출
    // 3. 추출된 챌린지를 라이선스 서버로 전송
}
```

## 기능 쿼리 예제

재생을 초기화하기 전에 지원 여부를 확인하려면 `navigator.mediaCapabilities.decodingInfo` 기능 쿼리를 사용할 수 있습니다.

### H.264 지원 확인

```javascript
async function checkPlayReadySL3000H264() {
  const config = {
    type: 'media-source',
    video: {
      contentType: 'video/mp4; codecs="avc1.4d401f"', // 프로필/레벨에 맞게 조정
      width: 1920, height: 1080, bitrate: 2000000, framerate: 30
    },
    keySystemConfiguration: {
      keySystem: 'com.microsoft.playready.recommendation.3000', // SL3000 키 시스템
      persistentStateRequired: 'true', // SL3000에 필수
      video: { robustness: "" } // 빈 값 또는 "3000"
    }
  };

  try {
    const result = await navigator.mediaCapabilities.decodingInfo(config);
    if (result.supported && result.keySystemAccess) {
      console.log('PlayReady SL3000 H.264 is supported.');
    } else {
      console.log('PlayReady SL3000 H.264 is NOT supported.');
    }
  } catch (e) {
    console.error('Capability check failed', e);
  }
}
```

### HEVC 지원 확인

Windows에 HEVC 확장이 설치되어 있는지 확인합니다.

```javascript
async function checkPlayReadySL3000HEVC() {
  const config = {
    type: 'media-source',
    video: {
      contentType: 'video/mp4; codecs="hvc1.1.6.L93.B0"', // HEVC 코덱 문자열 조정
      width: 1920, height: 1080, bitrate: 2000000, framerate: 30
    },
    keySystemConfiguration: {
      keySystem: 'com.microsoft.playready.recommendation.3000',
      persistentStateRequired: 'true',
      video: { robustness: "" }
    }
  };
  // ... 위와 동일하게 decodingInfo 실행
}
```

## 트러블슈팅

재생이 실패하거나 키 시스템이 감지되지 않는 경우 다음 사항을 확인합니다.

### 1. 브라우저 플래그

Chrome 설정에서 하드웨어 보안 복호화가 활성화되어 있는지 확인합니다.

*   주소창에 `chrome://flags/#enable-hardware-secure-decryption` 입력.
*   설정값을 **Enabled**로 변경.

### 2. 미디어 내부 로그 

Chrome의 내부 로깅 기능을 사용하여 CDM 로드 및 오류를 디버깅합니다.

*   **CDM 정보:** `chrome://media-internals#cdms`
    *   `com.microsoft.playready.recommendation`을 검색하여 등록 여부 확인.
*   **재생 로그:** `chrome://media-internals#players`
    *   `PIPELINE_ERROR_DECODE` 오류나 라이선스 교환 실패 로그 확인.

### 3. Windows HWDRM 재설정

드물게 치명적인 오류가 발생할 경우, Windows가 HWDRM 기능을 자동으로 비활성화할 수 있습니다. 테스트 목적으로 콘솔을 통해 수동으로 다시 활성화하려면 다음을 수행합니다.

1.  `MF_MEDIAKEYSESSION_TYPE_PERSISTENT_USAGE_RECORD` 타입의 세션을 생성합니다.
2.  세션 ID로 `ResetHardwareDRMDisabled 1.0` 문자열을 사용하여 `Load`를 호출합니다.

### 4. 코덱 설치 확인

Windows에 설치된 코덱 버전을 확인하려면 **PowerShell**에서 다음 명령어를 실행합니다.

```powershell
get-appxpackage *hevc* | Select-Object Version
get-appxpackage *av* | Select-Object Version
```