오디오 스트리밍 개발기 두번째 이야기입니다.
오디오 스트리밍 서비스라고 하면 가장 중요한 부분은 뭘까요?
중요한 것들이 많이 있지만, 사실 콘텐츠의 보호가 제일 중요합니다.
단순히 재생만 한다면 이전 포스팅인 [오디오 스트리밍 개발기2 – HTML Audio]에서 사용된 예제처럼 작성만 하면 되겠죠.
콘텐츠를 보호하기 위해서는 여러 방법이 필요합니다.
그 중 가장 쉽고 단순한 Onetime Link를 소개하려고 합니다.
Onetime Link는 이름에서 알 수 있듯이, 일회용 링크입니다.
당연히, Onetime Link 만으로 콘텐츠를 보호할 수 있는 것은 아니지만 콘텐츠에 직접 접근하려할 때 하나의 벽이 될수는 있겠죠.
그렇다면 콘텐츠를 복사하려고 한다면 어떤 방법들이 있을까요?
- 주소를 복사해서 사용한다.
- 주소를 다운로드할 수 있는 프로그램으로 다운받아 사용한다.
- 녹음 프로그램 또는 녹화 프로그램을 사용한다.
- 휴대폰이나 녹음기로 녹음 또는 녹화하여 사용한다.
이렇게 네가지 정도로 정리할 수 있겠네요.
당연히 이 네가지 방법중 1~2번이 가장 쉽게 접근할 수 있는 방법입니다만 Onetime Link로 이를 쉽게 방지할 수 있습니다.
Onetime Link를 구현하는 것은 간단합니다.
아래 예제는 python + Django 를 이용한 방법입니다.
class OnetimeLink(models.Model): user = models.ForeignKey('user.User', on_delete=models.CASCADE, verbose_name='회원') link_hash = models.CharField(max_length=64, verbose_name='링크 해시') content = models.ForeignKey('content.Content', on_delete=models.CASCADE, verbose_name='콘텐츠') encoded_file = models.CharField(max_length=256, verbose_name='재생 파일') used = models.BooleanField(default=False, verbose_name='사용여부') tstamp = models.DateTimeField(auto_now_add=True, verbose_name='등록시간')
이렇게 DB 모델을 생성해서 콘텐츠 재생을 시도할 때 OnetimeLink 데이터를 생성해서 전달해주고, 전달받은 OnetimeLink에 접근하게됩니다.
간단히 시퀀스로 확인해볼까요?
- LAH 회원이 A 노래 재생을 요청 ( https://play.lahion.com/play/A ) 합니다.
- 서버에서는 LAH 회원이 A 노래를 재생할 권한이 있는지 확인한 후, 다음 정보를 생성하여 회원(웹)에게 전달합니다.
hash = 'RANDOMRANDOMRANDOMRANDOMRANDOMRANDOM....RANDOM'
OnetimeLink(user='LAH', link_hash=hash, content='A', encoded_file='A.mp3', used=False).save()
- LAH 회원은 A 노래를 재생 ( https://play.lahion.com/_url?key=RANDOMRANDOMRANDOMRANDOMRANDOMRANDOM….RANDOM ) 합니다.
- 서버에서는 key값을 확인하고 used 값이 False라면 실제 재생해야될 파일(‘A.mp3’)을 재생합니다.
- 서버에서는 파일을 재생하면서 링크를 다시 사용할 수 없도록 used 값을 True로 저장합니다.
이렇게 되면 실제 미디어를 재생해주는 링크를 https://play.lahion.com/_url?key=~~~ 가 되지만 해당 링크는 다시 사용할 수 없겠죠!
왜냐하면 재생할 때 used 값을 바꾸니까요 🙂
이렇게 아주 간단하게 Onetime Link를 생성할 수 있습니다.
생성된 Onetime Link 데이터 일부를 보자면 이렇게 되어있습니다.
이것만으로도 간단히 링크 복사를 통한 콘텐츠 유출을 막을 수 있습니다 🙂
다만 클라이언트의 HTML Audio 객체와 함께 사용할 때, 콘텐츠를 매끄럽게 가져오기 위해서는 링크의 유효시간 설정도 중요하니 주의해야합니다!
다음 시리즈에는 StreamingResponse에 대해 다뤄보겠습니다.