콘텐츠로 이동
This documentation is also available as markdown. For a complete index of all pages, see llms.txt at /llms.txt

동시 스트림 제한 가이드

동시 스트림 제한(Concurrent Stream Limiting, CSL)은 최종 사용자 계정당 동시에 재생되는 스트림 수를 제한하는 DoveRunner Multi-DRM 기능입니다. CSL은 재생 중 주기적인 DRM 라이선스 갱신을 통해 동작하므로, 라이선스 서버는 어떤 스트림이 아직 활성 상태인지 항상 파악할 수 있습니다. CSL의 주요 용도는 서비스 가치를 떨어뜨리는 과도한 계정 공유를 방지하는 것입니다.

사용 사례CSL의 역할
계정공유 방지서비스의 모든 계정에 기본 제한을 적용합니다(예: 최대 3개 동시 스트림).
요금제별 제한 라이선스 토큰의 max_stream_per_user를 사용해 구독 요금제별로 다른 제한을 적용합니다(예: Basic 요금제 최대 2개, Premium 요금제 최대 5개).

일반적인 DRM 라이선스는 콘텐츠 전체 길이 동안 유효할 수 있습니다. CSL을 사용하면 라이선스 유효 기간이 콘텐츠보다 짧게(예: 10분) 설정되므로, 클라이언트는 재생이 계속되는 동안 renewal interval 마다 라이선스 갱신을 요청해야 합니다. 서버는 이 갱신 요청을 이용해 어떤 스트림이 아직 활성 상태인지 판단합니다. 갱신 주기 내에 클라이언트로부터 갱신 요청이 도착하지 않으면, 서버는 재생이 종료된 것으로 간주하고 해당 스트림을 카운트에서 제외합니다.

카운트가 클라이언트 애플리케이션이 아닌 DRM 라이선스 흐름에서 이루어지기 때문에, 클라이언트 앱을 변조해도 이 로직을 우회할 수 없으며, 클라이언트가 비정상적으로 종료되는 경우(탭 닫힘, 기기 재시작)에도 카운트가 자동으로 보정됩니다.

다음 예시는 최대 동시 스트림 = 2, 갱신 주기 = 10분일 때의 전체 세션 주기를 보여줍니다.

  1. 사용자가 첫 번째 기기에서 DRM 콘텐츠 재생을 시작합니다. 라이선스 서버는 해당 사용자의 동시 스트림 수를 1로 카운트합니다.
  2. 같은 사용자 계정으로 두 번째 기기에서 재생을 시작합니다. 카운트가 2로 증가합니다.
  3. 사용자가 세 번째 기기에서 재생을 시도합니다. 제한에 도달했으므로 라이선스 발급이 실패합니다. 플레이어는 *“최대 동시 재생 수 제한으로 인해 새 재생을 시작할 수 없습니다”*와 같은 메시지를 표시합니다(서비스 애플리케이션의 CSL 오류 처리로 구현).
  4. 첫 번째 기기에서 재생이 종료됩니다. 해당 클라이언트로부터 더 이상 갱신 요청이 오지 않으므로 10분 이내에 카운트가 1로 감소합니다.
  5. 사용자가 세 번째 기기에서 다시 시도합니다. 더 이상 제한을 초과하지 않으므로 라이선스가 발급되고 재생이 시작되며, 카운트는 2로 증가합니다.
  6. 이 과정을 통해 한 사용자 계정의 동시 스트림 수는 절대 2를 초과하지 않습니다.

아래 그림은 이 주기를 보여줍니다.

sequenceDiagram
    autonumber
    participant D1 as user_id: A - 기기 1
    participant D2 as user_id: A - 기기 2
    participant D3 as user_id: A - 기기 3
    participant LS as DoveRunner<br/>라이선스 서버
    Note over LS: CSL 활성화 - 최대 2개 스트림,<br/>갱신 주기 10분

    D1->>LS: 라이선스 요청 (새 스트림)
    LS-->>D1: 라이선스 발급 (카운트: 1/2)
    D1->>D1: 재생 시작
    loop 재생 중 10분마다
        D1->>LS: 라이선스 갱신
        LS-->>D1: 갱신 응답 (세션 활성 유지)
    end

    D2->>LS: 라이선스 요청 (새 스트림)
    LS-->>D2: 라이선스 발급 (카운트: 2/2)
    D2->>D2: 재생 시작
    loop 재생 중 10분마다
        D2->>LS: 라이선스 갱신
        LS-->>D2: 갱신 응답
    end

    D3->>LS: 라이선스 요청 (새 스트림)
    LS--xD3: 거부 - 오류 2102<br/>(제한 도달, 카운트 2/2)
    Note over D3: 플레이어가 CSL 메시지 표시<br/>(서비스 앱에서 처리)

    Note over D1: 기기 1에서 재생 종료 -<br/>더 이상 갱신 요청 전송 안 함
    Note over LS: 갱신 주기 내에<br/>갱신 요청 미수신 -<br/>세션 해제 (카운트: 1/2)

    D3->>LS: 라이선스 요청 (재시도)
    LS-->>D3: 라이선스 발급 (카운트: 2/2)
    D3->>D3: 재생 시작

다음 네 가지 규칙을 기억하세요. 대부분의 연동 관련 질문은 이 규칙에서 비롯됩니다.

  1. CSL은 (사용자 ID, 기기 ID) 단위로 카운트합니다. 제한은 최종 사용자 계정(라이선스 토큰의 user_id로 식별)마다 적용되며, 각 동시 스트림은 DRM 키 시스템이 제공하는 고유 기기 ID로 식별됩니다.
  2. 제한은 라이선스 발급 시점에 적용됩니다. 새 스트림이 시작을 시도할 때 사용자의 활성 스트림 수가 이미 설정된 최대값에 도달한 경우, 라이선스 서버는 CSL 오류 2102(사용자당 허용된 세션 수를 초과했습니다)로 요청을 거부합니다. 플레이어는 이를 감지해 사용자에게 친절한 메시지를 표시해야 합니다.
  3. 세션은 중지 신호가 아니라 타임아웃으로 해제됩니다. 프로토콜에는 “재생 중지” 신호가 없습니다. 세션은 다음 갱신 요청이 갱신 주기 내에 도착하지 않을 때 해제되므로, 최악의 경우(사용자가 갱신 요청 직후 바로 재생을 중지한 경우) 재생 종료 후 최대 갱신 주기 1회 + TTL(10초) 이후에 슬롯이 해제됩니다. 이는 표준 OTT 동작이며, 주요 스트리밍 서비스도 동일한 방식으로 동작합니다.
  4. 탭은 기기 ID를 공유합니다. 같은 브라우저 인스턴스의 여러 탭은 하나의 기기 ID를 공유하므로, 탭마다가 아니라 하나의 기기로 카운트됩니다.

단일 CSL 세션의 수명 주기는 아래와 같습니다.

stateDiagram-v2
    direction LR
    [*] --> Active: 라이선스 발급<br/>(카운트 증가)
    Active --> Active: 갱신 주기마다<br/>라이선스 갱신<br/>(세션 활성 유지)
    Active --> Expired: 갱신 주기 내<br/>갱신 없음
    Expired --> Released: 서버가 세션 제거<br/>(카운트 감소)
    Released --> [*]
    note right of Active
      재생은 언제든 종료될 수 있음
      (뒤로 가기 버튼, 탭 닫기,
      크래시, 전원 차단) - "중지" 신호는
      없으며, 해제는 항상
      갱신 누락을 통해 이루어짐
    end note
    note right of Released
      사용자의 다른 기기에서 슬롯을
      다시 사용할 수 있음 - 마지막 갱신 후
      갱신 주기 1회 + TTL
      (10초) 이내
    end note

다른 방식 대신 CSL을 사용하는 이유

Section titled “다른 방식 대신 CSL을 사용하는 이유”

콘텐츠 서비스 제공자들은 그동안 다음과 같은 방식으로 계정 공유를 제한해 왔습니다. CSL은 이러한 방식의 주요 약점을 해결합니다.

이 방식은 고유 기기 ID 정보를 이용해 사용자 계정당 등록할 수 있는 기기 수를 제한합니다. OTT 서비스에서 널리 사용되지만 다음과 같은 문제가 있습니다.

  • 고유 ID 확보가 어렵습니다. Chrome 같은 웹 브라우저에서는 고유 ID를 얻기 어렵고, 개인정보 보호 제약으로 인해 모바일 앱에서도 점점 어려워지고 있습니다.
  • 기기 등록/등록 해제 기능을 구현해야 합니다. 등록 기기 제한을 초과하면 고객 지원을 위한 등록 해제 기능이 필요하며, 이 구현 자체가 해킹될 수 있습니다.

CSL은 기기 등록이 필요 없으며, 사용자가 기기를 바꿔도 차단되지 않습니다. 동시에 실행되는 스트림 수만 제한됩니다.

애플리케이션 레벨에서 스트림 카운트

Section titled “애플리케이션 레벨에서 스트림 카운트”

CSL은 서비스 애플리케이션에서 재생 시작 및 종료 시점을 추적하여 자체 백엔드에서 구현할 수도 있습니다. 많은 서비스가 이 방식을 사용하지만 다음과 같은 문제가 있습니다.

  • 클라이언트 해킹으로 우회 가능합니다. 카운트 로직이 클라이언트나 API 계층에 있으므로, 변조된 클라이언트는 재생 보고를 회피할 수 있습니다.
  • 카운트 불일치가 발생합니다. 클라이언트가 비정상적으로 종료되면(크래시, 전원 차단) “재생 종료” 신호가 유실되어 서버 카운트가 줄어들지 않고, 카운트가 실제와 점점 어긋나게 됩니다.

CSL의 DRM 라이선스 갱신 로직은 클라이언트 변조로 우회할 수 없으며, 비정상 종료 후에도 서버 카운트가 갱신 주기 내에 자동으로 보정됩니다.

CSL은 Console 설정(활성화 + 제한), 라이선스 토큰(요청별 설정), 플레이어 연동(DRM 환경별 갱신 동작), 플레이어의 오류 처리라는 네 가지 요소로 구성됩니다. 아래 단계를 순서대로 진행하세요.

1단계: DoveRunner Console에서 CSL 활성화 및 설정

Section titled “1단계: DoveRunner Console에서 CSL 활성화 및 설정”

DoveRunner Console의 Multi-DRM > DRM Settings 화면에서 Concurrent Stream Limiting 옵션을 Enable로 설정합니다.

DoveRunner Console - Concurrent Stream Limiting 옵션이 있는 DRM Settings 화면

두 가지 설정은 아래와 같습니다.

설정설명기본값
Max Stream per User최종 사용자 계정당 동시에 재생 가능한 최대 스트림 수입니다.3
Renewal Interval스트리밍 라이선스가 갱신되는 주기입니다. 주기가 짧을수록 재생 종료를 더 정확하게 판단하지만, 라이선스 발급 건수가 늘어납니다. 현재 제공되는 값: 1 - 15분.10분

요금제 요건은 트라이얼 계정과 상용 계정에 따라 다릅니다.

  • 트라이얼 계정: 트라이얼 기간 동안 CSL을 무료로 활성화할 수 있습니다.
  • 상용 계정 - MAU(월간 사용자 기반) 요금제: Change Plan 화면에서 Enable Concurrent Stream Limit 옵션을 선택합니다. MAU 기본 요금에 추가 CSL 요금(기본 월 $200)이 청구됩니다.
  • 상용 계정 - MAL(월간 라이선스 건수 기반) 요금제: 별도의 요금제 옵션이나 추가 기본 요금 없이 CSL을 사용할 수 있습니다. 갱신으로 증가한 라이선스 건수가 청구서에 반영됩니다.

CSL이 활성화된 콘텐츠의 라이선스 토큰을 생성할 때는 다음 사항이 적용됩니다(전체 토큰 정의는 라이선스 토큰 규격 참조).

토큰 필드필수 설정참고
user_id고유한 최종 사용자 IDCSL은 최종 사용자 계정 단위로 카운트하므로, DRM 서버가 계정을 식별할 수 있는 고유 사용자 ID가 필요합니다.
playback_policy.persistentfalseCSL은 스트리밍에만 적용됩니다. persistent: true(오프라인) 토큰은 카운트되지 않습니다.
playback_policy.max_stream_per_user선택 사항Console의 Max Stream per User 값을 발급 건별로 재정의합니다. 요금제별 제한에 사용하세요(1단계 사용 사례 참조).
playback_policy.license_durationCSL 사용 시 무시됨CSL이 활성화된 persistent: false 토큰에서는 license_duration 같은 라이선스 유효 기간 필드가 무시되고, 대신 Console의 Renewal Interval이 적용됩니다.

3단계: 플레이어에 라이선스 갱신 연동

Section titled “3단계: 플레이어에 라이선스 갱신 연동”

라이선스 갱신 동작은 DRM마다 다릅니다. 클라이언트 환경에 맞게 연동하세요.

Widevine (Chrome 브라우저, Android 앱, Chromecast)

어떤 플레이어든 사용할 수 있습니다. Widevine은 자체 라이선스 갱신 규격을 통해 라이선스 갱신을 기본 처리하므로 플레이어 측 API가 필요 없습니다. 단, 데스크톱 Chrome은 예외로, 고유 기기 ID를 생성하기 위해 추가 설정이 하나 필요합니다.

// 데스크톱 Chrome: 키 시스템이 안정적이고 고유한 기기 ID를
// 생성하도록 persistent state를 요청합니다.
// (Bitmovin 예시. 사용하는 플레이어에서 동일한 설정을 구성하세요.)
widevine: {
'mediaKeySystemConfig': {
'persistentState': 'required'
}
}

PlayReady (Windows Edge 브라우저)

플레이어는 Console의 갱신 주기에 맞춰 라이선스 갱신 API를 수동으로 호출해야 합니다. DoveRunner가 테스트한 HTML5 플레이어 중에서는 Bitmovin만 이 API를 제공합니다(Bitmovin Player API - renewLicense).

// PlayReady (Bitmovin): DoveRunner Console에 설정한
// Renewal Interval과 같은 주기로 라이선스를 갱신합니다.
// 예: 10분 주기 = 600000 ms.
const RENEWAL_INTERVAL_MS = 600000; // Console 설정과 일치해야 함
setInterval(() => {
if (player && !player.isEnded()) {
player.get('drm').renewLicense();
}
}, RENEWAL_INTERVAL_MS);

FairPlay - Safari 브라우저

Safari에서의 FairPlay 라이선스 갱신은 현재 Safari 내장 기본 HLS 플레이어와 Video.js에서 지원됩니다. 연동 방식은 위의 PlayReady/Bitmovin 방식과 비슷합니다.

// FairPlay (Video.js): 이벤트 객체에서 키 세션을 가져와
// 해당 세션으로 갱신을 시작합니다.
player.tech().on('keysessioncreated', function (event) {
const keySession = event.keySession; // 이벤트 객체의 속성
if (keySession) {
startLicenseRenewal(player, keySession);
}
});

FairPlay - iOS 앱

최신 DoveRunner FPS iOS SDK 또는 Bitmovin Player iOS SDK로 개발된 iOS 앱은 라이선스 갱신이 SDK 라이브러리 내부에 구현되어 있으므로 CSL 연동 작업이 최소화됩니다. DoveRunner FPS iOS SDK의 갱신 주기는 라이선스 토큰의 Response Format에 따라 적용됩니다.

  • original: 서버가 실제 라이선스 데이터 형식으로 응답합니다. 갱신 주기를 코드에 직접 입력해야 하며, Console 설정과 같아야 합니다.
  • json: 서버가 JSON 형식의 커스텀 라이선스 데이터로 응답합니다. JSON에 포함된 갱신 주기 값이 자동으로 적용되므로 직접 입력할 필요가 없습니다.

플레이어 샘플

플레이어별로 바로 실행 가능한 전체 CSL 샘플은 DoveRunner HTML5 플레이어 샘플 저장소에 있습니다.

HTML5 플레이어 샘플 - CSL 관련 코드

플레이어 / 환경샘플
Bitmovin (Widevine + PlayReady 갱신)bitmovin-renewal-sample.js
Shaka Player (Widevine)shaka-renewal-sample.js
Video.js (FairPlay Safari)videojs-renewal-sample.js
FPS Safari (기본 HLS / SDK)fps-sdk 샘플

4단계: 플레이어에서 CSL 제한 오류 처리

Section titled “4단계: 플레이어에서 CSL 제한 오류 처리”

제한에 도달하면 라이선스 요청이 실패합니다. 라이선스 응답에서 아래 CSL 오류 코드를 확인하세요(전체 목록은 라이선스 오류 코드 페이지 참조).

오류 코드오류 메시지의미
2102The number of sessions allowed per user has been exceeded.CSL 제한에 도달했습니다. 사용자에게 표시되는 오류입니다.
2101License session count processing failed.서버 측 카운트 처리 실패입니다. DoveRunner 지원팀에 문의하세요.
2103License session update failed.서버 측 세션 업데이트 실패입니다. DoveRunner 지원팀에 문의하세요.
2104License session creation failed.서버 측 세션 생성 실패입니다. DoveRunner 지원팀에 문의하세요.
2105License renewal update failed.갱신 요청을 처리할 수 없습니다.

플레이어에서 2102를 처리할 때는 명확하고 조치 가능한 메시지와 재시도 기능을 함께 제공하세요.

// 의사 코드: 라이선스 요청 실패 경로에서 CSL 제한 오류를
// 감지하고 친절한 메시지를 표시합니다.
if (licenseErrorCode === 2102) {
showUserMessage(
'현재 요금제에서 허용하는 최대 기기 수로 시청 중입니다. ' +
'다른 기기에서 시청을 중지한 후 다시 시도해 주세요.'
);
}

이전 세션의 슬롯은 즉시가 아니라 갱신 타임아웃에 의해 해제되므로, 사용자가 몇 분 기다려야 할 수 있다는 안내를 표시하거나, 막다른 오류 대신 “재시도” 버튼을 제공하는 것을 고려하세요.

프로덕션에 배포하기 전에 다음 동작을 확인하세요(테스트 시 Max Stream per User = 2).

#테스트예상 결과
1기기 1에서 재생한 후, 같은 계정으로 기기 2에서 재생을 시작합니다.둘 다 재생됩니다. 서버 카운트 = 2.
2같은 계정으로 세 번째 기기에서 재생을 시작합니다.라이선스가 2102로 실패하고 CSL 메시지가 표시됩니다.
3기기 1에서 재생을 중지하고 즉시 기기 3에서 재시도합니다.여전히 2102입니다. 슬롯이 아직 해제되지 않았으며, 이는 버그가 아닌 예상된 동작입니다.
4최대 갱신 주기 + TTL(10초)만큼 기다린 후 기기 3에서 재시도합니다.재생에 성공합니다. 갱신 누락으로 슬롯이 해제되었습니다.
5한 기기에서 재생하다가 뒤로 가기를 누르고 같은 기기에서 즉시 다시 재생합니다.제한에 걸리지 않고 정상적으로 재생이 재개됩니다(같은 세션/기기이므로 새로 카운트되지 않음).
6같은 브라우저에서 탭 두 개를 열어 둘 다 재생합니다(Chrome, persistentState: required 설정).두 탭은 하나의 기기 ID를 공유하며 두 개가 아닌 하나의 기기로 카운트됩니다. 같은 기기에서의 동시 스트림은 충돌할 수 있으므로 탭 단위 카운트에 의존하지 마세요.
7Console이 2로 설정된 상태에서 max_stream_per_user = 5인 토큰을 발급합니다.해당 발급에는 토큰 값(5)이 사용됩니다.
8persistent: true(오프라인 다운로드) 토큰을 발급합니다.CSL이 적용되지 않으며, 오프라인 재생은 카운트되지 않습니다.
9Console과 플레이어에 서로 다른 갱신 주기를 설정합니다(PlayReady/FairPlay).갱신이 실패하고 재생이 중단됩니다. 연동 시 모든 곳에서 단일 값을 사용하는지 확인하세요.

어떤 설정이 무엇을 제어하는지는 흔히 혼동되는 부분입니다. 아래 표에 정리했습니다.

설정설정 위치 제어 항목토큰으로 재정의 가능 여부
Max Stream per UserConsole사이트의 모든 스트림에 대한 동시 스트림 제한입니다.가능 - 라이선스 토큰의 max_stream_per_user가 해당 발급에 대해 Console 값을 재정의합니다(요금제별 제한에 사용).
Renewal IntervalConsole라이선스 갱신 주기 및 세션 해제 시점(이 주기 내에 갱신이 도착하지 않으면 카운트가 감소)입니다.불가. 라이선스 토큰에 renewal_duration을 설정하지 마세요. 이 값은 Console 설정에서 파생됩니다.
  • 주기가 짧을수록 해제된 슬롯을 다른 기기에서 더 빨리 사용할 수 있고, 재생 종료도 더 정확하게 감지됩니다.
  • 주기가 짧을수록 라이선스 갱신 발급 건수가 많아집니다(MAL 요금제 과금 및 트라이얼 할당량 소모와 관련).
  • DoveRunner Console에서는 현재 1~15분 범위의 갱신 주기를 제공합니다(기본값 10분). 다른 범위가 필요하면 지원팀에 문의하세요.
  • 최소 2분 이상을 권장합니다. 주기가 너무 짧으면 불필요한 세션 변동이 발생하고, 최종 사용자에게 버그처럼 보이는 해제 지연이 생길 수 있습니다.

”제한이 즉시 적용되지 않아요” / “슬롯이 N분 후에야 해제돼요”

Section titled “”제한이 즉시 적용되지 않아요” / “슬롯이 N분 후에야 해제돼요””

가장 흔한 CSL 관련 질문입니다. 동작 방식은 다음과 같습니다.

  • 사용자가 뒤로 가기를 누르거나, 재생을 중지하거나, 탭을 닫아도 CSL 세션은 해제되지 않습니다. 프로토콜에는 중지 신호가 없습니다.
  • 서버는 마지막으로 받은 갱신 이후 갱신 주기 내에 갱신 요청이 도착하지 않을 때만 세션을 해제합니다.
  • 따라서 해제된 슬롯은 클라이언트의 마지막 갱신 후 갱신 주기 1회 + TTL(10초) 이내에 사용 가능해집니다. 최악의 경우(사용자가 갱신 전송 직후 중지한 경우) 재생 종료 후 전체 주기 + TTL이 소요됩니다.
  • 현재 CSL 세션을 즉시 강제 해제하는 API나 메커니즘은 없습니다. 이는 주요 OTT 서비스(Netflix, Disney+ 등)의 동작과 동일합니다.
  • 같은 기기에서 뒤로 가기를 눌렀다가 다시 재생하는 경우에는 슬롯을 소모하지 않습니다. 같은 활성 세션으로 인식되어 정상적으로 재생이 재개됩니다.

”한 브라우저의 여러 탭은 왜 이렇게 동작하나요?”

Section titled “”한 브라우저의 여러 탭은 왜 이렇게 동작하나요?””
  • 같은 브라우저 인스턴스의 탭들은 하나의 기기 ID를 공유하므로 하나의 기기로 카운트됩니다. persistentState: required를 설정해도 두 번째 탭을 열었을 때 CSL 카운트가 증가하지 않습니다.
  • 카운트가 증가하지 않더라도 CSL은 기기별 활성 세션도 추적합니다. 이미 활성 세션이 있는 기기에서 두 번째 스트림을 요청하면, 서버는 이를 충돌 세션으로 간주해 새 스트림을 차단하거나 기존 스트림을 중단시킬 수 있습니다.
  • 사용자가 탭 단위 카운트(탭 하나 = 스트림 하나)를 기대한다면, CSL은 그렇게 동작하지 않습니다. 기기 단위 카운트를 기준으로 사용자 경험을 설계하세요.

”Chrome에서 설정한 제한이 무시되는 것 같아요”

Section titled “”Chrome에서 설정한 제한이 무시되는 것 같아요””

Widevine 미디어 키 시스템 설정에 persistentState: required가 설정되어 있는지 확인하세요. 이 설정이 없으면 데스크톱 Chrome이 기본(고유하지 않은) 기기 ID를 반환할 수 있으며, CSL이 세션을 올바르게 구분할 수 없습니다. 설정 방법은 3단계를 참조하세요.

”토큰에 갱신 기간을 설정했는데 여전히 Console 값이 적용돼요”

Section titled “”토큰에 갱신 기간을 설정했는데 여전히 Console 값이 적용돼요””

예상된 동작입니다. 라이선스 토큰에 renewal_duration을 설정하지 마세요. 이 값은 CSL 세션에 대해 우선 적용되는 Console 설정에서 파생됩니다(위의 설정 참조 참고).

재생 중 CSL 오류 (CDM이 라이선스를 거부)

Section titled “재생 중 CSL 오류 (CDM이 라이선스를 거부)”

CSL이 활성화된 스트림이 2102 대신 일반적인 EME/미디어 키 오류로 실패한다면, 대개 CSL 문제가 아닙니다. 표준 라이선스 문제 해결 항목을 확인하세요.

  • 라이선스 토큰의 cid(콘텐츠 ID)가 패키징된 콘텐츠의 PSSH 데이터에 포함된 콘텐츠 ID와 일치하는지 확인합니다.
  • 패키징된 콘텐츠에 유효한 Widevine PSSH 박스가 포함되어 있는지 확인합니다(mp4dump 같은 도구로 검사).
  • 표준 웹 플레이어의 경우 라이선스 토큰 response_format이 original인지 확인합니다(json 응답에는 표준 웹 플레이어가 파싱할 수 없는 메타데이터가 포함됨).
  • 라이선스 요청이 CORS로 차단되거나 잘못 구성되지 않았는지 확인합니다. 브라우저 DevTools에서 라이선스 요청(예: licenseManager.do)을 확인하세요. 200과 바이너리 데이터는 라이선스가 발급되었음을 의미하고, 200과 JSON 본문은 DoveRunner 오류 코드를 포함하며, 4xx/5xx는 서버 측 문제입니다(DoveRunner 지원팀에 문의).

CSL과 키 로테이션은 함께 사용할 수 없음

Section titled “CSL과 키 로테이션은 함께 사용할 수 없음”

현재 DoveRunner DRM 서버 구현상의 제약으로 인해, 같은 서비스 사이트에서 키 로테이션과 CSL을 동시에 활성화할 수 없습니다. 라이브와 VOD 콘텐츠를 모두 제공하는 경우, 무엇이 더 중요한지에 따라 선택하세요.

  • 동시 재생 제한을 통한 계정 공유 방지 → CSL을 사용합니다. (라이브 스트림에 키 로테이션을 적용할 수 없습니다.)
  • 라이브 스트림의 보안 강화 및 비즈니스 모델 → 키 로테이션을 사용합니다. CSL은 적용할 수 없습니다.

클라이언트가 Google Chromecast 또는 Apple Airplay를 지원하는 경우 다음 사항에 유의하세요.

Chromecast. Chromecast 자체가 동시 스트림으로 카운트되는지는 Chromecast 모델/세대에 따라 다릅니다.

  • 두 기기가 모두 카운트되는 경우, 원본 기기가 이미 계정의 남은 슬롯을 사용했다면 캐스트 재생이 시작되지 않습니다.
  • Chromecast에서는 Widevine 라이선스 갱신이 동작하므로, 동시 스트림 제한을 초과하지 않는 한 캐스트 재생이 가능합니다.

Airplay. Chromecast와 달리 Apple TV에서는 FairPlay 라이선스 갱신이 지원되지 않습니다. 이를 처리하기 위해 DoveRunner 라이선스 서버는 Airplay 스트리밍을 통해 Apple TV에서 재생되는 FairPlay 콘텐츠에는 라이선스 갱신을 적용하지 않습니다.

  • 재생을 시작한 모바일 또는 웹 플레이어만 카운트되며, Apple TV의 Airplay 재생은 카운트에 추가되지 않습니다.
  • 재생을 Airplay가 아닌 Apple TV에서 직접 시작한 경우, Apple TV는 일반 기기로 카운트에 반영됩니다.