VIDEO SRC를 암호화/복호화 하던중 생긴문제..
본문
안녕하세요.
index.php
<?php
// 암호화 키 생성
$encryptionKey = bin2hex(random_bytes(16));
// 원본 데이터
$originalData = "small.mp4";
// 데이터 암호화
$encryptedData = encryptData($originalData, $encryptionKey);
function encryptData($data, $key)
{
$method = 'aes-256-cbc';
$ivLength = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivLength);
$encrypted = openssl_encrypt($data, $method, $key, 0, $iv);
return base64_encode($iv . $encrypted);
}
?>
<video width="320" height="240" controls="">
<source src="<?php echo G5_THEME_URL ?>/videos/video.php?v=<?php echo $encryptedData; ?>&vv=<?php echo $encryptionKey; ?>">
</source></video>
video.php
<?php
$encryptedData = $_GET['v'];
$encryptionKey = $_GET['vv'];
$token = decryptData($encryptedData, $encryptionKey);
function decryptData($data, $key)
{
$method = 'aes-256-cbc';
$data = base64_decode($data);
$ivLength = openssl_cipher_iv_length($method);
$iv = substr($data, 0, $ivLength);
$encrypted = substr($data, $ivLength);
return openssl_decrypt($encrypted, $method, $key, 0, $iv);
}
if(file_exists("./".$token))
{
// Another important point here is a session id regeneration
session_regenerate_id(true);
$file = "./".$token;
$file_size = filesize($file);
$fp = fopen($file, "rb");
$data = fread ($fp, $file_size);
fclose($fp);
header ("Content-type: video/mp4");
echo $data;
}
?>
이렇게 코드를 작성하였습니다. 다만, 링크를 따라 들어가면 여전히 비디오를 다운 받을 수 있습니다..
해결방법이 있을까요..? 그누를 사용중이긴 한데 영 방법이 안보이네요ㅠ
답변 2
클라이언트에서 미디어의 다운로드를 막는 방법은 없습니다.
- 자바스크립트로 컨텍스트 메뉴를 비활성화 시키기 또는 감추기
- 자바스크립트 파일 내에서 재생 경로를 조합하는 부분을 꼬아놓고 js 파일 자체를 난독화, 압축
- 자바스크립트 canvas 태그 위에 그려 보여주기
- 토큰 사용으로 미디어 직접 접근을 방지
- 3rd party 비디오 라이브러리 사용 (e.g. YouTube, Vimeo, ...)
- 미디어 스트리밍 서비스 또는 서버 구축
등의 방법으로 클라이언트가 쉽게 다운로드 하는 방법을 조금 더 어렵게 하는 대안책이 있을수 있습니다만
웹 상에서 리소스의 다운로드를 완전히 막는 방법은 없습니다.
리소스에 접근하는 순간 브라우저는 이미 서버로부터 클라이언트에게 다운로드를 하고 있는 상태입니다.
추가로 미디어 파일을 php 코드로 읽고 아웃풋으로 내보내는 작업은
트래픽 소모나 부하 발생등 비효율적인 비용이 많이 발생할수 있습니다.
미디어 파일을 서비스 하기 위해서는
- 3rd party 비디오 라이브러리
- 미디어 스트리밍 서비스 또는 서버 구축
등의 방법이 적절합니다.
원칙적으로 미디어파일의 다운로드를 막는 방법은 "절대로" 없습니다.