nginx http_secure_link_module 사용하기

구운몽·2024년 1월 22일
0

1. 목적

  • 동영상 제공을 위한 웹서버가 필요하다.
  • 간단하더라도 1회용 url을 제공할 필요가 있다.

2. 준비물

  • k8s on docker desktop 혹은 nginx를 설치할 환경 (로컬도 가능)
  • m3u8/ts 파일 (없다면 ffmpeg로 만들거나 다운로드..?)

3. 구성내용

  • 테스트 환경을 쿠버네티스로 하기 위해 아래 스크립트를 작성
    1. nginx-nas-pv.yml, nginx-nas-pvc.yml (호스트의 볼륨과 연결하기 위해)
    2. ns.yml (네임스페이스)
    3. nginx_conf.yml (nginx default conf, 필요에 따라 이 글에서는 default 그대로 사용하지만)
    4. nginx_conf_server_block.yml
    5. deploy, service
  • localhost/hls/SVAl4D05xFIwSqrllgXt3A/4705941437/output/3/mycat.m3u8 로 요청한다면
    1. location /hls로 진입
    1. m3u8 확장자를 확인하여 /vod로 rewrite 여기서 md5, expires로 해쉬된 값을 argument로 넘겨준다.
    2. nginx의 내부 secure link 로직에서 체크되고, 비정상이라면 403, 만료된 값이라면 410
      4. ts파일은 m3u8에 의해 /hls/SVAl4D05xFIwSqrllgXt3A/4705941437/output/3/someting.ts로 호출된다.
    3. /vod, /ts는 모두 internal로 제한하여 직접 호출을 방지한다.

4. url 생성 방법

  1. 테스트의 경우에는 아래 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 =
  1. JAVA에서 구현한다면
// md5 해시 
MessageDigest md = MessageDigest.getInstance("md5");
byte[] hash = md.digest(plainText.getBytes());
// Base64 인코딩
String base64 = Base64.getEncoder().encodeToString(hash);
// +를 -로, /를 _로 치환 = 제거
return base64.replace('+', '-').replace('/', '_').replaceAll("=", "");

5. 테스트

  • 임의의 해시로 호출했을 때 403를 반환했다.
  • 임의의 파일을 호출했을 때 403을 반환했다.
  • 임의의 시간을 호출했을 때 403을 반환했다.
  • 짧은 유닉스 시간으로 호출했을 때 410을 반환했다.
  • /vod, /ts 직접 호출은 불가능했다.

0개의 댓글