BLOG

[Techblog] 토큰 인증으로 미디어 자산 보호하기
작성일: 2021-01-27

비디오 스트리밍 컨텐츠 제작은 이제 더 이상 미디어 회사에서만 일어나는 일은 아닙니다.  학교, 이커머스 리테일, 테크 회사, 은행과 같이 다양한 산업에서 기업들은 소비자에게 배포할 미디어 콘텐츠를 제작하고 있으며, 이에 따라 실시간 및 온디맨드 비디오 스트리밍은 타겟 고객에게 도달하기 위한 보편적인 커뮤니케이션 도구가 되었습니다.

 

이렇게 미디어 자산 가치가 커지고 미디어 컨텐츠가 증가함에 따라 미디어에 대한 보안이 더욱 중요해지고 있는데요.

하여 오늘은 접근 권한이 있는 사람만 액세스할 수 있도록 안전한 배포 워크 플로우를 생성해보는 방법을 소개해 드리려 합니다. 

 

Amazon CloudFront 인증 방법

인터넷을 통해 미디어 콘텐츠를 배포하는 회사는 자산의 무단 액세스 및 재배포를 방지하기 위해 미디어 스트림을 보호해야 합니다. Amazon CloudFront 는 서명된 URL과 서명된 쿠키로 프라이빗 콘텐츠를 제공하는 기능을 제공합니다. Lambda @ Edge를 배포에 추가하여 토큰 인증을 사용할 수도 있습니다. Lambda @ Edge 는 애플리케이션 사용자와 더 가까운 지역에서 코드를 실행할 수 있는 Amazon CloudFront의 기능으로, 성능을 향상시키고 지연 시간을 줄입니다. 다음은 CloudFront를 사용하여 비공개 콘텐츠를 안전하게 제공하는 옵션입니다.

 

  • 사용자가 CloudFront 서명된 URL 또는 서명된 쿠키를 사용하여 프라이빗 콘텐츠에 액세스하도록 요구합니다.
  • 사용자가 오리진 서버 (예: Amazon Simple Storage Service (Amazon S3) 또는 프라이빗 HTTP 서버) 에서 콘텐츠에 직접 액세스하는 URL이 아니라 CloudFront URL을 사용하여 콘텐츠에 액세스해야 합니다.
    • CloudFront URL을 요구할 필요는 없지만 사용자가 서명된 URL 또는 서명된 쿠키에 지정한 제한을 우회하지 못하도록 방지하는 것이 좋습니다.
  • Lambda @ Edge를 사용하면 사용자가 프라이빗 콘텐츠에 액세스하기 위해 JSON 웹 토큰 (JWT)을 제공해야 합니다.

 

이 게시물에서는 온 디맨드 및 라이브 OTT 배포를 보호하기 위해 Lambda @ Edge를 사용하여 Amazon CloudFront 배포에 대한 토큰 인증을 구현하는 방법을 보여줍니다.

 

 

Lambda @ Edge를 사용하는 JSON 웹 토큰

JWT (JSON Web Tokens)는 개인 데이터 정보를 JSON 객체로 안전하게 공유하기 위한 개방형 표준입니다. JWT는 256 비트 비밀 키를 사용하여 디지털 서명되므로 정보를 확인하고 신뢰할 수 있습니다.

 

Lambda @ Edge를 사용하면 사용자 지정 함수를 생성하고 AWS 리전 및 Amazon CloudFront 엣지 로케이션 에서 실행할 수 있습니다.

 

Lambda 함수를 사용하여 다음 시점에서 CloudFront 요청 및 응답을 변경할 수 있습니다.

 

  • CloudFront가 최종 사용자로부터 요청을 받은 후 (뷰어 요청)
  • CloudFront가 오리진에 요청을 전달하기 전 (오리진 요청)
  • CloudFront가 오리진에서 응답을 수신한 후 (오리진 응답)
  • CloudFront가 최종 사용자에게 응답을 전달하기 전 (뷰어 응답)

 

 

아키텍처 개요

 

솔루션 구성 요소

이 게시물에서는 웹 앱( GitHub 저장소) 에서 구성 요소를 구현하는 방법을 살펴 봅니다. 또한 인증, 토큰 유효성 검사 및 CDN 캐싱을 위한 클라우드 구성 요소를 살펴 봅니다.

 

프런트 엔드 및 백엔드 AWS 리소스는 모바일 및 프런트 엔드 웹 개발자가 안전하고 확장 가능한 풀 스택 애플리케이션을 구축하고 배포할 수 있도록 지원하는 종단 간 솔루션 인 AWS Amplify 를 사용하여 구축됩니다. Amplify를 사용하면 몇 분 만에 앱 백엔드를 구성하고 단 몇 줄의 코드만으로 앱에 연결하고 3 단계로 정적 웹 앱을 배포할 수 있습니다.

웹 앱은 React에 내장되어 있으며 Video.JS를 비디오 플레이어로 사용합니다.

 

인증에 성공하면 Amazon Cognito 가 사용자 풀 토큰을 애플리케이션에 반환합니다. 그런 다음 토큰을 사용하여 백엔드 리소스에 대한 액세스 권한을 부여할 수 있습니다. 제안된 아키텍처에서 토큰은 미디어 스트림 콘텐츠에 대한 요청에 서명하는 데 사용되며 Lambda @ Edge 함수는 토큰 속성을 디코딩하고 유효성을 검사하여 콘텐츠를 볼 시청자를 인증합니다.

 

 

배포 단계

 

1) 프로젝트 종속성

AWS 구성 요소와의 통합을 구축하고 웹 애플리케이션을 호스팅하기 위해 AWS Amplify를 사용합니다.

 

AWS Amplify를 설치하고 구성하는 전체 단계는 설명서(Amplify Documentation for React)를 참조하세요.

 

npm install -g @aws-amplify/cli

amplify configure

 

2) 저장소 복제

git clone https://github.com/aws-samples/cloudfront-secure-media.git

cd secure-url-cf

npm install

amplify init –app  https://github.com/aws-samples/cloudfront-secure-media.git

amplify init

amplify push

 

3) 로컬 환경 시작

npm start

 

인증 페이지를 로드해야 합니다. 이제 첫 번째 계정을 만들고 로그인할 수 있습니다.

 

로그인 다음 로컬 사이트를 로드해야 합니다.

 

4) Amazon S3 버킷에 동영상 리소스 추가

우리는 Amplify Video를 사용해 몇 가지 테스트 VOD 컨텐츠를 만들 수 있습니다. Amplify Video는 Amplify CLI용 오픈 소스 플러그인으로, 웹 또는 모바일 애플리케이션에 비디오 스트리밍을 쉽게 통합할 수 있으며 AWS Amplify및 AWS 미디어 서비스로 구동됩니다.  Amplify 비디오는 라이브 워크 플로우도 지원합니다. 더 많은 옵션 및 샘플 구현을 보려면 amplify-video GitHub 를 방문하세요.

 

npm i amplify-category-video -g

 

 amplify add video

? Please select from one of the below mentioned services: Video-On-Demand

? Provide a friendly name for your resource to be used as a label for this category in the project: vod-wf-jwt

? Select a system-provided encoding template, specify an already-created template name:  Default HLS Adaptive Bitrate? Is this a production environment

? Yes? Do you want to protect your content with signed urls? No

? Do you want Amplify to create a new GraphQL API to manage your videos? (Beta) No

All resources built. amplify push

 

Amplify Video는 소스 콘텐츠, 트랜스 코딩된 콘텐츠를 저장할 Amazon S3 버킷을 생성하고 CloudFront 배포도 배포합니다. amplify push 의 샘플 결과를 참고하세요.

 

Video on Demand:

 Input Storage bucket:

vodcfjwt-dev-input-SOMEID

 

 Output URL for content:

https://someid.cloudfront.net (https://someid.cloudfront.net/)

 

참고: Amplify Video는 서명된 URL로 콘텐츠를 보호하는 옵션도 제공합니다. Amplify Video를 사용하여 서명된 URL을 사용하는 방법에 대한 자세한 정보는 VOD 시작하기를 참조하세요.

 

 

트랜스코딩 테스트

Amazon S3 콘솔로 이동합니다. Amplify Video는 환경에 몇 개의 버킷을 배포했습니다. input 버킷을 선택하고 .mp4컴퓨터에 로컬로 저장한 파일을 업로드 합니다.

 

파일이 성공적으로 업로드되면 AWS Elemental MediaConvert 콘솔로 이동하여 트랜스 코딩 작업이 시작되었는지 확인합니다. 이 작업은 입력 파일을 가져 와서 Apple HTTP Live Streaming Protocol (HLS)로 트랜스 코딩하고 세그먼트 파일을 output. 레이블이 서명된 Amazon S3 버킷에 출력합니다.

 

 

미디어 재생 테스트

MediaConvert 작업이 완료된 상태에 도달하면 Amazon S3 콘솔로 다시 이동하여 출력 버킷을 찾습니다. 버킷을 살펴보면 업로드한 파일 이름이 포함된 폴더가 표시됩니다. 폴더에서 MediaConvert에 의해 생성된 출력 파일을 볼 수 있습니다. 확장자가 .m3u8인 파일인 HLS 매니페스트를 찾은 다음 Amazon S3 도메인을 콘텐츠의 출력 URL로 바꿉니다.

 

재생 가능한 URL의 형식은  Output URL for content + / 에셋 이름 / + 에셋이름입니다.

예: https://someid.cloudfront.net/BigBuckBunny/BigBuckBunny.m3u8

 

 

5) Amazon CloudFront 배포에 JWT 인증 추가

 

a) Lambda @ Edge JWT 인증의 종속성 설치

Bashcd amplify/backend/function/jwtauth/src/

npm install

 

b) index.js 함수 파일을 편집하고 Amazon Cognito 사용자 속성 추가

다음 위치에 있는 config.js 파일을 엽니다.

amplify/backend/function/jwtauth/src/config.js

생성된 인증 리소스를 나열하고 Cognito 사용자 풀 ID를 복사합니다.

amplify auth console

Using service: Cognito, provided by: awscloudformation

? Which console User Pool

User Pool console:https://us-east-1.console.aws.amazon.com/cognito/users/?region=us-east-1#/pool/us-east-SomeID/details

Current Environment: dev

 

 

Cognito 사용자 풀 ID는 amplify 인증 콘솔을 실행하여 반환된 URL에서 찾을 수 있습니다.

https://us-east-1.console.aws.amazon.com/cognito/users/?region=us-east-1#/pool/us-east-SomeID/details

 

ID 정보를 복사하고 var USERPOOLID에서 바꿉니다.

var USERPOOLID = us-east-1_SomeID;

 

c) 사용자 풀에 해당하는 공개 JSON (JWK) 다운로드하고 저장. JSON 일부로 사용 가능

웹 키 세트 (JWKS)는 다음 위치에서 찾을 수 있습니다.

https://cognito-idp.us-east-1.amazonaws.com/us-east-SomeID/.well-known/jwks.json

 

JWK 및 JWK 세트에 대한 자세한 내용은 Amazon Cognito에서 JSON 웹 토큰 확인 설명서 및 JWK ( J SON 웹 키)를 참조하세요.

 

JSON 웹 토큰 문서jwks.json에서 샘플을 볼 수 있습니다. 다음으로 JWKS를 Cognito 사용자 풀의 자격 증명으로 바꿉니다.

var JWKS = ‘{“keys”:[{“alg”:”RS256″,”e”:”AQAB”,”kid”:”1234exemple=”,”kty”::”RSA”….}]}

 

다음으로 amplify push홈 앱 폴더에서 실행하여 Lambda 함수를 배포합니다.

amplify push

 

6) Lambda @ Edge에 배포

이제 JWT 토큰을 확인하는 함수를 클라우드에 푸시했으므로 5 단계에서 생성한 배포에 배포합니다.

 

a) CloudFront 콘솔로이동하여5 단계에서 생성된 배포 ARN 가져옵니다.

 

b) Lambda 콘솔로이동하여Lambda @ Edge 함수를 배포합니다.

 

 

7) End-to-end 테스트

이제 웹 애플리케이션을 열고 테스트 콘텐츠를 재생합니다.

비디오 URL 필드에 5 단계에서 생성한 출력 에셋의 전체 CloudFront URL을 추가합니다.

 

이제 인증 보호를 추가하는 미디어 콘텐츠 배포 및 애플리케이션을 사용자 지정할 수 있습니다.

 

 

결론

이 블로그 게시물에서는 JWT 토큰 인증을 사용하여 미디어 스트림을 보호하는 방법에 대해 논의했습니다. 이는 디지털 콘텐츠의 무단 재배포를 줄이는 데 도움이 됩니다. 자세한 내용은 Amazon CloudFront 설명서를 참조하여 프라이빗 콘텐츠를 보호하는 추가 방법을 찾으세요.

 

추가 자료

원문URL: https://aws.amazon.com/ko/blogs/media/awse-protecting-your-media-assets-with-token-authentication/

 

메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글이나 관련 기사 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.