1. 목적
- 동영상 제공을 위한 웹서버가 필요하다.
- 간단하더라도 1회용 url을 제공할 필요가 있다.
2. 준비물
- k8s on docker desktop 혹은 nginx를 설치할 환경 (로컬도 가능)
- m3u8/ts 파일 (없다면 ffmpeg로 만들거나 다운로드..?)
3. 구성내용
- 테스트 환경을 쿠버네티스로 하기 위해 아래 스크립트를 작성
- nginx-nas-pv.yml, nginx-nas-pvc.yml (호스트의 볼륨과 연결하기 위해)
- ns.yml (네임스페이스)
- nginx_conf.yml (nginx default conf, 필요에 따라 이 글에서는 default 그대로 사용하지만)
- nginx_conf_server_block.yml
- deploy, service
- localhost/hls/SVAl4D05xFIwSqrllgXt3A/4705941437/output/3/mycat.m3u8 로 요청한다면
1. location /hls로 진입
- m3u8 확장자를 확인하여 /vod로 rewrite 여기서 md5, expires로 해쉬된 값을 argument로 넘겨준다.
- nginx의 내부 secure link 로직에서 체크되고, 비정상이라면 403, 만료된 값이라면 410
4. ts파일은 m3u8에 의해 /hls/SVAl4D05xFIwSqrllgXt3A/4705941437/output/3/someting.ts로 호출된다.
- /vod, /ts는 모두 internal로 제한하여 직접 호출을 방지한다.
4. url 생성 방법
- 테스트의 경우에는 아래 bash명령어를 사용한다.
date -d "today + 180 minutes" +%s
echo -n "${expires} 127.0.0.1 mysecret" | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
echo -n "4705941437 /vod/output/3/mycat.m3u8 mysecret" | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
- JAVA에서 구현한다면
MessageDigest md = MessageDigest.getInstance("md5");
byte[] hash = md.digest(plainText.getBytes());
String base64 = Base64.getEncoder().encodeToString(hash);
return base64.replace('+', '-').replace('/', '_').replaceAll("=", "");
5. 테스트
- 임의의 해시로 호출했을 때 403를 반환했다.
- 임의의 파일을 호출했을 때 403을 반환했다.
- 임의의 시간을 호출했을 때 403을 반환했다.
- 짧은 유닉스 시간으로 호출했을 때 410을 반환했다.
- /vod, /ts 직접 호출은 불가능했다.