모바일 앱의 DRM: 기초, 보호 방식 및 작동 원리

저자: IT Sectr 게시일: 2026-05-24 읽는 시간: 11 분

DRM(디지털 권리 관리)은 디지털 콘텐츠를 무단 복사 및 배포로부터 보호하는 기술 모음입니다. 모바일 애플리케이션에서 DRM은 비디오, 오디오 및 전자책을 암호화하여 권리 보유자와 소비자 간의 라이선스 계약 준수를 보장하는 데 사용됩니다. Google Widevine Documentation, 2026에 따르면, DRM은 대부분의 스트리밍 서비스(Netflix, Spotify, Apple TV+)에 내장되어 있으며 프리미엄 콘텐츠의 합법적 배포에 필수적입니다.

핵심 포인트

  • DRM(디지털 권리 관리) — 디지털 콘텐츠의 복사 및 배포를 제한하여 저작권을 보호하는 기술.
  • 세 가지 주요 방식: Widevine(Google), FairPlay(Apple), PlayReady(Microsoft) — 모바일 플랫폼을 지배.
  • Widevine은 CDM을 통해 Android 및 iOS에서 작동하며 세 가지 보안 수준(L1, L2, L3)을 지원.
  • Apple의 FairPlay는 키 생성을 위해 KSM 서버를 사용하며 iOS 및 macOS의 AVFoundation에 내장.
  • DRM 복호화는 미디어 플레이어 수준에서 이루어지며, 개발자는 ExoPlayer 또는 AVPlayer를 통해 준비된 비디오 스트림을 받음.

DRM이란?

DRM은 디지털 콘텐츠에 대한 접근을 제어하는 암호화 및 소프트웨어 방법의 집합입니다. 단순한 암호화와 달리 DRM에는 라이선스 시스템이 포함됩니다. 콘텐츠는 암호화되어 있으며, 사용자 권한을 확인한 후에만 발급되는 키가 필요합니다.

DRM의 주요 목적은 불법 복제를 방지하고 지역 제한을 준수하도록 하는 것입니다. DRM이 없으면 콘텐츠 소유자(영화 스튜디오, 음반사)는 스트리밍 플랫폼에 콘텐츠를 라이선스하지 않습니다. Motion Picture Association(2025)에 따르면, DRM은 DVD-rip 시대와 비교하여 스트리밍에서 영화의 불법 배포를 62% 감소시켰습니다.

모바일 개발에서 DRM은 미디어 플레이어 수준에 내장됩니다. 개발자는 암호화된 스트림의 내장 복호화를 지원하는 ExoPlayer(Android), AVPlayer(iOS) 또는 Shaka Player(Web)를 사용합니다. 개발자는 암호화를 구현할 필요 없이 라이선스용 SDK만 통합하면 됩니다.

DRM과 CENC(공통 암호화)

CENC 표준(공통 암호화 — ISO/IEC 23001-7)은 모든 DRM 시스템에 대해 하나의 암호화된 미디어 파일을 사용할 수 있게 합니다. 콘텐츠는 한 번 암호화되고 키는 다른 라이선스 서버를 통해 배포됩니다. 이는 멀티플랫폼 서비스에 중요합니다. Netflix는 영화를 한 번 암호화하여 재인코딩 없이 Android(Widevine), iOS(FairPlay) 및 Windows(PlayReady)에 전달합니다.

CENC는 오디오 및 비디오 트랙에 대해 다른 키를 사용하는 CBC 암호화를 사용합니다. 각 키는 MPD(MPEG-DASH) 또는 M3U8(HLS) 매니페스트에 암호화되어 저장됩니다. 콘텐츠 식별자(KID)는 암호화된 스트림을 서버의 라이선스에 연결합니다. 유효한 라이선스 없이는 키를 복호화할 수 없습니다.

모바일 애플리케이션에서 DRM 작동 방식

DRM 재생 프로세스는 매니페스트 로딩, 라이선스 획득, 콘텐츠 복호화 및 표시의 네 단계로 구성됩니다. 각 단계는 시스템의 다른 구성 요소(미디어 플레이어, CDM 모듈 및 라이선스 서버)에 의해 수행됩니다.

  • 매니페스트 로딩 — 플레이어가 암호화된 세그먼트, 암호화 방식 및 라이선스 서버 URL에 대한 메타데이터와 함께 MPD(DASH) 또는 M3U8(HLS)를 수신.
  • 라이선스 요청 — 플레이어가 콘텐츠 식별자(KID)를 콘텐츠 복호화 모듈(CDM)에 전달하고, CDM이 라이선스 서버에 요청을 생성.
  • 키 획득 — 서버가 사용자 권한(구독, 지역, 기기)을 확인하고 기기의 공개 키로 암호화된 키를 반환.
  • 스트림 복호화 — CDM이 기기의 개인 키를 사용하여 키를 복호화하고 비디오 세그먼트를 실시간으로 복호화하기 위해 미디어 플레이어에 전달.

콘텐츠 복호화 모듈(CDM)

CDM은 콘텐츠 복호화를 수행하는 보호된 소프트웨어 또는 하드웨어 모듈입니다. Android에서 CDM은 MediaDrm API 수준에서 구현됩니다. iOS에서는 AVContentKeySession을 통해 AVFoundation에 내장되어 있습니다. CDM은 키를 애플리케이션에 절대 노출하지 않으며, 모든 암호화 작업은 보안 환경(TEE — Trusted Execution Environment) 내에서 수행됩니다.

하드웨어 지원(보안 수준 1)이 있는 기기에서 CDM은 TEE 내에서 작동하며 키는 기기의 주 메모리에 절대 들어가지 않습니다. 이는 4K HDR 콘텐츠 재생을 위한 스튜디오의 요구 사항입니다. TEE가 없는 기기에서는 키가 소프트웨어로 복호화되어(L3) 보안이 낮아지고 최대 품질이 540p로 제한됩니다.

주요 DRM 방식

세 가지 DRM 시스템이 모바일 플랫폼을 지배합니다. 각각은 자체 생태계에 독점적이지만 모두 CENC를 지원하므로 단일 암호화 콘텐츠 스트림을 모든 플랫폼에서 사용할 수 있습니다.

DRM개발자플랫폼최대 품질하드웨어 보호
WidevineGoogleAndroid, Chrome, Android TV4K HDR (L1)TEE (L1)
FairPlayAppleiOS, iPadOS, macOS, tvOS4K HDR (iOS)Secure Enclave
PlayReadyMicrosoftWindows, Xbox, Windows Phone4K (SL3000)TPM + TEE

멀티플랫폼 서비스를 위한 DRM 선택

모든 플랫폼에서 실행되는 스트리밍 서비스의 경우 세 가지 DRM 시스템 모두를 지원해야 합니다. 실용적인 솔루션은 멀티-DRM 지원(Muvi, Vualto, Axinom)이 있는 CDN을 사용하는 것으로, 사용자 기기에 따라 라이선스 요청을 적절한 서버로 자동 라우팅합니다. Streaming Learning Center(2025)에 따르면, 78%의 스트리밍 서비스가 멀티-DRM 접근 방식을 사용합니다.

CENC를 사용한 MPEG-DASH 표준은 아키텍처를 단순화합니다. 콘텐츠는 공유 키로 한 번 암호화되고 DRM 시스템은 클라이언트 측에서 선택됩니다. 라이선스 서버는 기기 식별자와 함께 요청을 받고 특정 CDM에 대해 암호화된 키를 반환합니다. 다른 플랫폼에 대한 콘텐츠 차이는 없으며, 다른 라이선스 서버만 있을 뿐입니다.

Widevine: 수준 및 기능

Widevine은 Google의 DRM 시스템으로 Android의 사실상 표준입니다. 콘텐츠 복호화가 어디서 어떻게 수행되는지 결정하는 세 가지 보안 수준을 지원합니다. 보안 수준은 기기의 하드웨어 성능에 따라 달라지며 최대 콘텐츠 해상도를 결정합니다.

Widevine 보안 수준

Widevine L1(하드웨어) — 가장 안전한 수준. 모든 암호화 작업은 Trusted Execution Environment(TEE) 내에서 수행됩니다. 키는 절대 보안 영역을 벗어나지 않습니다. L1 기기는 최대 4K HDR의 콘텐츠를 재생할 수 있습니다. Google 인증이 필요하며, 이는 플래그십 기기가 거치는 절차입니다.

Widevine L3(소프트웨어) — 복호화가 기기의 주 메모리에서 수행됩니다. 기술적으로 숙련된 공격자가 키를 추출할 수 있습니다. 프리미엄 콘텐츠의 해상도는 540p(960x540)로 제한됩니다. 모든 Android 기기는 L1 인증을 받지 않았어도 L3를 지원합니다.

Widevine L2 — 드문 중간 수준으로, 복호화는 TEE에서 수행되지만 렌더링은 보호되지 않은 경로를 통해 이루어집니다. 일부 스마트 TV에서 사용됩니다. 모바일 기기에서는 사실상 찾을 수 없습니다.

기기의 Widevine 수준 확인 방법

kotlin
import android.media.MediaDrm
import android.media.UUID

fun checkWidevineLevel(): String {
    val widevineUuid = UUID.fromString("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed")
    val mediaDrm = MediaDrm(widevineUuid)

    val securityLevel = mediaDrm.getPropertyString(
        MediaDrm.PROPERTY_SECURITY_LEVEL
    )

    return when (securityLevel) {
        "L1" -> "Widevine L1 — 하드웨어 보호"
        "L3" -> "Widevine L3 — 소프트웨어 보호"
        else -> "Widevine $securityLevel"
    }
}

이 메서드는 Widevine UUID를 통해 CDM에 securityLevel 속성을 쿼리합니다. 반환 값은 L1, L2 또는 L3 문자열로, 기기의 현재 보호 수준을 나타냅니다. 이 정보는 스트리밍 서비스에 중요합니다. 기기에 L3만 있는 경우 4K 콘텐츠를 표시할 수 없습니다.

Apple FairPlay: 아키텍처 및 작동 원리

FairPlay는 Apple의 DRM 시스템으로, 모든 생태계 플랫폼(iOS, iPadOS, macOS, tvOS, watchOS)에 내장되어 있습니다. Widevine과 달리 FairPlay에는 보안 수준이 없으며 보호는 기기에 의해 결정됩니다. Secure Enclave가 있는 iOS에서 FairPlay는 Widevine L1에 필적하는 보호 수준을 제공합니다.

FairPlay는 HLS(HTTP Live Streaming) 프로토콜에서만 독점적으로 작동합니다. 콘텐츠는 .ts 세그먼트(MPEG-TS) 또는 .m4s 조각(fMP4)으로 패키징됩니다. M3U8 매니페스트에는 라이선스 서버 URI(KSM — Key Server Module)와 초기화 IV가 포함된 #EXT-X-KEY 태그가 포함됩니다. 재생 시작 시 AVPlayer가 매니페스트를 읽고 AVContentKeySession을 통해 키를 요청합니다.

FairPlay Streaming 통합

swift
import AVFoundation

let contentKeySession = AVContentKeySession(keySystem: fairPlayStreaming)
let player = AVPlayer(playerItem: playerItem)
contentKeySession.setDelegate(self, queue: delegateQueue)

func contentKeySession(
    _ session: AVContentKeySession,
    didProvide keyRequest: AVContentKeyRequest
) {
    let assetId = keyRequest.identifier as! String
    sendLicenseRequest(assetId) { licenseData in
        keyRequest.processContentKeyResponse(
            AVContentKeyResponse(fairPlayStreamingKeyResponseData: licenseData)
        )
    }
}

AVContentKeySession 대리자는 콘텐츠 식별자(assetId)와 함께 키 요청을 받습니다. 애플리케이션은 이 ID를 라이선스 서버(KSM)로 보내고, 서버는 암호화된 키를 반환합니다. processContentKeyResponse 호출은 키를 CDM에 전달하여 복호화합니다. 라이선스가 유효하지 않은 경우(만료, 미지불) 서버는 403 오류를 반환하고 AVPlayer는 재생을 시작하지 않습니다.

오프라인 콘텐츠를 위한 영구 키 로딩

FairPlay는 영구 키를 지원합니다. 이는 오프라인 시청을 위해 기기에 라이선스를 저장하는 기능입니다. 키를 받은 후 애플리케이션은 allowsPersistableKey 플래그와 함께 processContentKeyResponse를 호출합니다. 키는 Keychain에 저장되며 이후 재생 시 서버에 접속하지 않고 사용할 수 있습니다. 그러나 오프라인 라이선스에는 제한된 유효 기간(일반적으로 7~30일)이 있으며, 이후 갱신이 필요합니다.

오프라인 라이선스는 iOS의 보호된 저장소인 Keychain에 저장됩니다. 탈옥이나 덤프 추출 시도 시 Secure Enclave가 키를 파괴합니다. Apple(2025)에 따르면, 영구 키 기술은 Apple TV+, Netflix 및 Disney+에서 여행 전 iPad에 콘텐츠를 다운로드하는 데 사용됩니다.

Microsoft PlayReady: 범용 보호

PlayReady는 Microsoft의 DRM으로, Windows, Xbox 및 레거시 Windows Phone에서 사용됩니다. PlayReady는 모바일 기기에서 Widevine 및 FairPlay보다 덜 일반적이지만, 모든 Microsoft 플랫폼에서 작동하는 범용 스트리밍 솔루션에 중요합니다. PlayReady는 TPM을 통해 소프트웨어 및 하드웨어 보호를 모두 지원합니다.

PlayReady는 SL(보안 수준) 아키텍처를 사용합니다: SL2000(소프트웨어, Widevine L3와 유사), SL3000(하드웨어, L1과 유사). Xbox Series X에서 PlayReady SL3000은 TEE+TPM을 통해 작동하며 키는 보호된 환경에서만 추출됩니다. 이를 통해 복사 위험 없이 콘솔에서 4K Blu-ray를 재생할 수 있습니다.

Microsoft Docs(2026)에 따르면 PlayReady는 CENC를 지원하며 Edge 브라우저의 Media Source Extensions(MSE)를 통해 MPEG-DASH와 함께 작동할 수 있습니다. Android 및 iOS의 모바일 애플리케이션의 경우 PlayReady는 SDK를 통해 사용 가능하지만 주로 엔터프라이즈 애플리케이션 및 Microsoft 미디어 서비스에 사용되며 드물게 사용됩니다.

Android용 PlayReady 네이티브 SDK

Microsoft는 Android 및 iOS용 PlayReady Native SDK를 제공합니다. 통합은 PlayReady 확장 프로그램과 함께 ExoPlayer를 통해 수행됩니다. 개발자는 PlayReadyRenderer를 추가하여 디코딩 체인에 내장합니다. ExoPlayer는 MPD 매니페스트에 지정된 DRM에 따라 Widevine과 PlayReady 사이를 자동으로 전환합니다.

PlayReady는 모바일 애플리케이션에서 거의 사용되지 않지만, Microsoft 생태계 내 서비스(예: SharePoint 및 Stream의 엔터프라이즈 교육 플랫폼)에서는 지원이 필수적입니다. Microsoft(2025)에 따르면 PlayReady는 엔터프라이즈 미디어 솔루션의 23%에서 사용되는 반면 Widevine은 62%입니다.

모바일 애플리케이션에 DRM 통합

모바일 애플리케이션에 DRM을 통합하는 데 암호화 코드를 작성할 필요가 없습니다. 개발자는 DRM을 기본적으로 지원하는 플레이어로 작업합니다. DRM 확장 프로그램과 함께 ExoPlayer를 통해 Android에서의 통합을 살펴보겠습니다.

Widevine 지원 ExoPlayer 설정

kotlin
val drmSessionManager = DefaultDrmSessionManager.Builder()
    .setUuidAndExoMediaDrmProvider(
        C.WIDEVINE_UUID,
        FrameworkMediaDrm.DEFAULT_PROVIDER
    )
    .setMultiSession(true)
    .build(mediaDrmCallback)

val mediaItem = MediaItem.Builder()
    .setUri(mpdUrl)
    .setDrmConfiguration(
        MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
            .setLicenseUri(licenseUrl)
            .setLicenseRequestHeaders(headers)
            .build()
    )
    .build()

exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()

DefaultDrmSessionManager는 DRM 세션을 관리합니다: MediaDrm 세션을 생성하고, 라이선스 요청을 처리하고, 키를 디코더에 전달합니다. setMultiSession(true) 매개변수를 사용하면 다른 세션에서 여러 스트림(오디오 + 비디오)을 동시에 복호화할 수 있습니다. MediaDrmCallback은 라이선스 서버에 대한 HTTP 요청을 구현하며, 일반적으로 SignedRequest 본문이 있는 POST입니다.

라이선스 요청을 위한 MediaDrmCallback

kotlin
val mediaDrmCallback = DefaultDrmSessionManager.MediaDrmCallback {
    url, requestBody ->

    val response = OkHttpClient().newCall(
        Request.Builder()
            .url(url)
            .post(RequestBody.create(requestBody, MediaType.parse("application/octet-stream")))
            .addHeader("Authorization", "Bearer ")
            .build()
    ).execute()

    val responseBytes = response.body?.bytes()
        ?: throw DrmSessionException(Exception("Empty license response"))

    responseBytes
}

콜백은 본문에 Widevine UUID와 함께 POST 요청을 라이선스 서버로 보냅니다. 서버는 사용자 인증(헤더의 토큰)을 확인하고 암호화된 키를 반환합니다. 사용자에게 활성 구독이 없는 경우 서버는 403 Forbidden을 반환하고 ExoPlayer는 DRM 오류를 생성하며, 이는 onPlayerError를 통해 처리해야 합니다.

DRM 오류 처리

DRM 오류는 라이선스가 유효하지 않거나, 만료되었거나, 기기가 필요한 보호 수준을 지원하지 않을 때 발생합니다. ExoPlayer는 Player.Listener.onPlayerError를 통해 TYPE_DRM_LICENSE_EXPIRED, TYPE_DRM_UNSUPPORTED 또는 TYPE_SOURCE 코드와 함께 오류를 전달합니다. 사용자에게 정보 메시지를 표시하는 것이 좋습니다: “이 기기에서 콘텐츠를 사용할 수 없습니다” 또는 “시청하려면 구독을 갱신하세요.”

스트리밍 서비스 분석(2025)에 따르면, 최대 8%의 재생 시작 실패가 DRM 오류와 관련됩니다. 이 중 60%는 만료된 라이선스, 25%는 기기 비호환성, 15%는 키 요청 중 네트워크 오류입니다. 5초 후 자동 재시도는 네트워크 오류 사례의 40%를 해결합니다.

자주 묻는 질문

모바일 기기에서 DRM을 우회할 수 있습니까?

Widevine L3(소프트웨어 보호)가 있는 기기에서는 기술적으로 가능하며, 메모리에서 키를 추출할 수 있습니다. L1 및 Secure Enclave가 있는 FairPlay에서는 우회가 극히 어렵습니다. TEE에 대한 물리적 접근이 필요합니다. 콘텐츠 스튜디오는 프리미엄 콘텐츠에 L1 기기를 대상으로 합니다.

Android에서 Netflix가 낮은 품질을 보여주는 이유는 무엇입니까?

대부분 기기가 Widevine L1 인증을 받지 않았고 L3를 사용하고 있기 때문입니다. Netflix는 L3 기기에서 품질을 540p로 제한합니다. Google Play의 DRM Info 앱을 통해 Widevine 수준을 확인하세요. Samsung, Pixel 및 OnePlus의 플래그십 기기는 일반적으로 L1을 보유합니다.

스트리밍 서비스에 어떤 DRM이 가장 좋습니까?

멀티-DRM을 사용하세요: Android용 Widevine, Apple용 FairPlay, Windows용 PlayReady. Axinom 또는 Vualto와 같은 서비스는 세 가지 DRM 시스템 모두에 통합 API를 제공합니다. 콘텐츠는 CENC를 통해 한 번 암호화되며 DRM 선택은 클라이언트 측에서 자동으로 이루어집니다.

DRM으로 오프라인 시청을 구현하는 방법은 무엇입니까?

iOS에서는 AVContentKeySession을 통해 FairPlay 영구 키를 사용하세요. Android에서는 ExoPlayer OfflineLicenseHelper를 통해 Widevine 오프라인 라이선스를 사용하세요. 키는 제한된 유효 기간(일반적으로 7~30일)으로 Keychain(iOS) 또는 KeyStore(Android)에 로컬로 저장됩니다.

DRM 맥락에서 KID란 무엇입니까?

KID(키 ID) — CENC 매니페스트의 암호화 키에 대한 고유한 16바이트 식별자. 각 KID는 특정 콘텐츠 부분(예: 영화의 10분 세그먼트)에 연결됩니다. 라이선스 서버는 KID를 사용하여 데이터베이스에서 해당 키를 찾습니다. 하나의 영화에는 다른 부분에 대해 최대 20개의 다른 KID가 포함될 수 있습니다.

요약

  • DRM(디지털 권리 관리) — 디지털 콘텐츠를 위한 암호화 보호 시스템, 합법적 스트리밍에 필수.
  • 세 가지 주요 방식: Widevine(Android), FairPlay(iOS), PlayReady(Windows) — 통합 콘텐츠 암호화에 CENC 사용.
  • Widevine L1(TEE를 통한 하드웨어 보호)은 4K HDR을 지원, L3(소프트웨어)는 540p로 제한. 수준은 MediaDrm.getPropertyString으로 확인.
  • FairPlay는 HLS에서만 작동하며 KSM 서버에서 키를 요청하기 위해 AVContentKeySession을 사용.
  • DRM 통합은 미디어 플레이어를 통해 수행: ExoPlayer(Android)와 DefaultDrmSessionManager, AVPlayer(iOS)와 AVContentKeySession.
  • DRM 오류는 onPlayerError로 처리 — 만료된 라이선스, 기기 비호환성 및 네트워크 오류가 실패의 8%를 차지.
  • 멀티플랫폼 서비스의 경우 CDN 제공업체와 통합 CENC 콘텐츠 암호화를 통한 멀티-DRM 접근 방식 권장.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기