저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

'wowza'에 해당되는 글 1건

  1. 2012.05.17 Wowza 별칭 기능을 이용한 비디오 자원 이름 노출 막기 (4)

미디어서버를 이용해서 동영상 서비스를 제공하고 싶을 때 문제가 되는 부분은 동영상 주소가 웹 소스 상에 그대로 노출된다는 점이다. 예를 들어, 아래 코드를 보자.


<a href="http://somehost/vod/_definst_/mp4:0000/00/1/1_PC1.mp4/playlist.m3u8">


조금만 지식이 있다면 위 코드를 이용해서 아무 곳에서나 동영상을 플레이할 수 있게 된다. 자유롭게 사용할 수 있도록 해 주는 것이 문제가 되지 않는다면 상관없지만, 만약 동영상 컨텐츠를 허용된 방법 이외의 다른 방법으로 재생하거나 동영상 자체를 다운로드 할 수 없도록 하고 싶다면 별도의 방안을 강구해야 한다.


DRM을 사용할 수 있겠지만 DRM 솔루션 자체가 비싸고 플레이어를 별도로 구현해야 한다는 단점이 있다. 또한, 디바이스에 따라 플레이어를 커스터마이징 할 수 없는 경우가 발생할 수도 있다. 그래서 생각해 볼 수 있는 것이 아래와 같이 동영상 주소를 시간에 따라서 다르게 생성해주는 것이다.


<a href="http://somehost/vod/_definst_/E14c1d156a...무지긴문자열...72ea34e4/playlist.m3u8">


위 값을 생성하는 방식에 따라 원하는 기능을 구현할 수 있다. 예를 들어, 암호화할 때 현재 시간 값을 포함시켜서 일정 시간이 지나면 값이 무효화되도록 구현할 수 있다. 이 경우, 위 주소를 복사해서 사용하더라도 일정 시간이 지나면 더 이상 동영상 재생을 할 수 없게 된다.


남은 작업은 Wowza 서버에서 암호화된 주소 값을 인식하도록 하는 것이다. Wowza 서버는 서버 상에 커스텀 모듈을 설치할 수 있도록 지원해주고 있는데, 이 커스텀 모듈을 사용해서 위 기능을 구현할 수 있게 된다. Wowza가 제공하는 서버 API 중 하나인 IMediaStreamNameAliasProvider2 인터페이스를 이용하면 클라이언트가 요청한 변경된 스트림 이름을 실제 스트림 이름으로 변경해 줄 수 있다. 아래 코드는 이 인터페이스를 이용한 구현 예를 보여주고 있다.


public class RaconAliasModule extends ModuleBase implements

        IMediaStreamNameAliasProvider2 {


    public void onAppStart(IApplicationInstance appInstance) {

        appInstance.setStreamNameAliasProvider(this);

        getLogger().info(

                "RaconAliasModule is registered to " + appInstance.getName());

    }


    public String resolvePlayAlias(IApplicationInstance appInstance,

            String name, IClient client) {

        return resolveAlias(name);

    }


    private String resolveAlias(String name) {

        // name이 암호화된 값

        RequestStreamName rsn = convertAliasToRequestStreamName(name); // name을 복호화 처리

        if (rsn.isTimeout()) {

            return null; // 유효하지 않은 name값. null 리턴

        }

        return si.getRealStreamName(); // 실제 스트림 이름 리턴

    }


    public RequestStreamName convertAliasToStreamInfo(String name) {

        // name을 복호화 처리

        ...

    }


    public String resolvePlayAlias(IApplicationInstance appInstance,

            String name, IHTTPStreamerSession httpSession) {

        return resolveAlias(name);

    }


    public String resolvePlayAlias(IApplicationInstance appInstance,

            String name, RTPSession rtpSession) {

        return resolveAlias(name);

    }

    .... // 동일하게 구현

}


모듈을 구현한 클래스를 구현했다면, 해당 모듈을 jar 만들어서 [wowza디렉토리]/lib에 복사한다. 이 때, 모듈에서 함께 사용하는 외부 jar 파일도 함께 복사해 주는 것도 잊지 말자.


lib에 복사했다면 위 모듈을 적용하고 싶은 Wowza 어플리케이션의 Application.xml 파일에 다음과 같이 Module 정보를 추가해 주면 된다.


<Module>

        <Name>customaccesscontrol</Name>

        <Description>CustomAccessControl</Description>

        <Class>com.custom.wowza.module.CustomAliasModule</Class>

</Module>


모듈을 개발하려면 Wowza 관련 jar 파일이 필요한데, 이 jar 파일들은 [wowza디렉토리]/lib에 위치한다. 이 파일들을 별도로 클래스패스로 잡기 귀찮다면 Wowza IDE를 이용해도 된다. Wowza IDE에 대한 자료는 아래 참고자료 링크를 확인해보기 바란다.


참고자료




Posted by 최범균 madvirus

댓글을 달아 주세요

  1. nwow 2012.07.09 18:13 신고  댓글주소  수정/삭제  댓글쓰기

    setStreamNameAliasProvider 안하고 왜 안되나 하고 있었는데, 여기서 답을 찾았네요.

    좋은 정보 감사합니다. ~

  2. min 2013.02.12 16:26 신고  댓글주소  수정/삭제  댓글쓰기

    초보라... 자세히 만들어서 주시면 안되나요? 샘플이라도... 부탁드립니다.

    • 최범균 madvirus 2013.02.15 07:08 신고  댓글주소  수정/삭제

      위 코드가 거의 샘플입니다.
      누락된 부분은
      1. 실제로 암호화된 URL을 만드는 것과
      2. 암호하된 URL을 복호화하는 convertAliastToStreamInfo(String name) 부분이에요.

      암호화된 URL을 만들어주는 기능은 Wowza가 아닌 웹 서버나 기타 다른 프로그램에서 만들어주셔야 할 것 같구요,

      위 코드에서 만든 Wowza 모듈의 convertAliasToStreamInfo 는 암호화된 이름을 복호화 처리하면 됩니다.

      실제 암/복호화와 관련된 건 자바의 Security API를 찾아보시면 될 것 같습니다.