※일반적으로 스트리밍 영상을 다운로드하여, 개인 소지하는 경우에는 법적 분쟁이 적을 수 있으나 유료 스트리밍 또는 다운로드 방지된 제품에 대한 다운로드 시도는 법적 문제가 생길 수 있음
※따라서 해당 글을 사용하여, 무단 다운로드 등으로 인한 저작권 및 법적 분쟁은 개인 책임이며, 게시자의 책임이 없음을 공지함
1.개발 결과
사실, 개발 결과란 부분이 없다. python의 라이브러리 중 requests, urllib을 이용하거나 설치된 ffmpeg를 이용한 방법이기 때문이다.
1) requests + urllib
(1)requets를 이용하여, 시간 별로 분할된 동영상 다운로드 주소 목록이 담긴 파일을 받아온다.
(2)urllib을 이용해서, 주소 목록에서 동영상 다운로드 주소를 파싱한다. (이는 다른 방식으로도 수행해도 된다.)
(3)파싱된 동영상 다운로드 주소 별로 requests를 요청하고, 응답 값으로 받은 영상 정보를 하나의 파일로 생성한다.
2) ffmpeg + subprocess
(1) ffmpeg를 설치한다.
(2) subprocess를 통해 ffmpeg 명령어를 실행하여 동영상을 다운로드한다.
두 방법의 차이는, 동영상 다운로드 주소 목록을 가져와 분할된 동영상을 다운로드하고, 다시 하나의 파일로 만드는 과정을 직접 구현하거나, 자동으로 수행한다는 점이다.
ffmpeg는, 동영상 다운로드 주소 목록을 받아, 자동으로 분할된 동영상을 다운로드하고, 하나로 합쳐준다. 이 과정에서, 필요한 옵션들을 추가할 수 있다.
2.개발 목적
m3u8 형식으로 스트리밍되는 영상의 무단 다운로드의 대응 방법 도출
3.개발 사유
기존에 전체 동영상(예 : .mp4) 등으로 스트리밍되던 시대에서, m3u8 방식으로 스트리밍 제공함에 따라, 영상 파일을 다운로드 받는 방식이 변경되었다.
일부 서비스는 스트리밍 영상을 유료 결제 후 다운로드 가능하지만, 우회 경로를 통한 무단 다운로드가 발생할 수 있다. 이에, 우회 방안을 검증하고 대응할 수 있는 방안을 모색하기 위해 시작되었다.
4.구현 단계
1) 소스코드 및 기능 설명
더욱 발전된 소스코드를 구현할 수 있는 능력자분들이 넘치니, 간략한 예시로 작성하였다.
■ requests + urllib (예시)
import requests, urllib
# 동영상 다운로드 주소 목록을 요청할 URL
m3u8_url = ""
# requess 통해, 동영상 다운로드 주소 목륵을 저장
response = requests.get(m3u8_url, verify=False)
# 동영상 다운로드 주소 목록 파일을, 라인 별로 구분하여 저장
lines = response.text.split("\n")
ts_urls = []
# 라인 별로 저장된 파일에서 동영상 다운로드 주소만 배열 ts_urls[]에 저장
# lines에는 분할된 다운로드 주소 외에도 다른 정보가 포함되어 있음
for line in lines:
if ".ts" in line:
ts_url = urllib.parse.urljoin(m3u8_url, line)
ts_urls.append(ts_url)
#저장할 파일명 설정
with open("파일명", "wb") as f:
#분할된 동영상을, 다운로드 주소 별로 응답 받아 하나의 파일로 저장
for ts_url in ts_urls:
response = requests.get(ts_url, verify=False)
f.write(response.content)
■ ffmpeg + subprocess (예시)
import subprocess
# 동영상 다운로드 주소 목록을 요청할 URL
m3u8_url = ""
output_file = "파일명"
#ffmpeg 명령어 설정
ffmpeg_command = ['ffmpeg', '-i', m3u8_url, '-c', 'copy', output_file]
#subprocess를 통한 ffmpeg 명령어 실행
subprocess.call(ffmpeg_command)
2) 구현단계에서 발생된 문제점 및 해결 방법
python으로 ffmpeg를 이용하려고 할 때, python 모듈만이 아니라 ffmpeg를 별도로 설치해주고 시스템 환경 변수 편집을 통해 경로를 설정해야 한다.
5.m3u8 스트리밍 영상 무단 다운로드 방지 방안
m3u8 스트리밍 영상의 무단 다운로드 방지는 무척이나 어렵다. 그렇기에 대응방안을 적용하기 전에, 서비스 규모 및 대응방안 적용으로 발생할 수 있는 리소스 소모 등에 대한 검토가 필요하다.
※법이나 저작권 문제 등이 발생하는 경우에는, 검토 따윈 무시하게 될 수도 있다.
1) 요청 HTTP 메시지 헤더 검증
일부 알려진 m3u8 영상 다운로드 도구는, 특정한 요청 HTTP 메시지 헤더를 지닌다. 이를 통해서 m3u8 스트리밍 영상의 index 파일이 저장된 서버 등으로 요청된 HTTP 메시지의 헤더 값을 검증할 수 있다.
(1) 요청 HTTP 메시지 내 특정 헤더 값을 추가하여, 정당한 서비스 요청임을 검증
(2) 요청 HTTP 메시지 내 특정 헤더 값이 존재하는 경우, 차단
다만, 헤더 값을 변경할 수 있는 방법이 존재하기에 충분한 대응방안이 아닐 수 있다. 이는, 알려진 도구를 통해 m3u8 스트리밍 영상 주소를 넣어 다운로드하는, 일반적인 이용자들의 무단 다운로드를 방지하기 위한 최소한의 대응 방법 중 하나이다.
2) 알려진 m3u8 추출 사이트 차단
검색 사이트 등을 통해, 알려진 m3u8 추출 사이트들이 다수 존재한다. 이들 목록을 작성하고 해당 도메인(IP 기준)에서 오는 요청을 차단하는 방법이 있다. 이는 앞서 언급한 사항과 같이 일반적인 이용자들의 무단 다운로드를 방지하기 위한 최소한의 대응 방법이 될 수 있다. (유튜브 등에서 mp3 파일을 추출하던 사이트 이용자들과 같은 단계)
3) DRM
'DRM(Digital Rights Management)'의 적용을 고려해볼 수 있지만 개발 비용, 서비스 규모 및 리소스 소모 등에 대해서 검토가 필요하다.
'DRM'을 자체적으로 서비스에 맞도록 구현할 수도 있고, 알려진 솔루션을 도입할 수도 있다. 하지만, 배보다 배꼽이 더 크게 발생할 수 있으므로 대응방안으로 무조건적인 'DRM' 적용보다는 위험 수준의 평가와, 서비스 구조를 확인하고 고려하는 것이 적절한 정보보호관리체계에 맞을 것이라고 본다.
※ 안전한 것이 좋지만, 서비스 보호를 위해 드는 비용으로 회사가 망한다면 그것도 이상하지 않을까? 물론, 개인정보와는 다른 부분이다. 일반적으로 여기서 언급되는 '영상'은 회사에서 재화를 목적으로 생성한 결과물이기 때문이다.
'개발' 카테고리의 다른 글
| [WEB] Node.js 웹 사이트 구축 2 (로그인 기능 구현) (0) | 2024.01.15 |
|---|---|
| [WEB] Node.js 웹 사이트 구축 1 (환경 구성) (0) | 2024.01.05 |
| [Python][자동화] ICMP Type 및 Code 별 전송 (0) | 2023.02.10 |
| ChatGPT로 메일 서버 구축해보기 (1) : 메일서버 어떻게 구축해? (0) | 2023.02.05 |
| [Python] Flask 테스트 웹 만들기 _ 1편 : HTTP 서버 만들기 (0) | 2022.11.25 |