BLOG
Amazon Interactive Video Service (IVS) 는 개발자가 JWT (JSON Web Tokens)로 보호되는 비공개 채널을 시작할 수 있는 새로운 기능인 Playback Authorization을 소개했습니다. 약간의 개발만으로 구독 기반 라이브 스트리밍 서비스를 쉽게 구축할 수 있는 비공개 채널을 설정할 수 있습니다.
이것은 두 부분으로 구성된 블로그 시리즈 중 첫 번째입니다. 이 게시물에서는 다음 방법을 안내합니다.
- Amazon IVS를 사용하여 비공개 채널을 생성하고 구독자에 대한 채널 액세스를 제한하세요.
- 첫 번째 채널을 설정하고 토큰을 생성하여 재생을 승인하세요.
2 부에서는 샘플 애플리케이션을 공유하므로 전체 구현을 검토하고 다음 훌륭한 구독 비디오 서비스 구축을 시작할 수 있습니다.
솔루션 개요
이 워크 플로 파이프 라인은 Amazon IVS 채널, AWS Secrets Manager에 저장된 ECDSA (Elliptic Curve Digital Signiture Algorithm) 키 페어 및 권한 부여 토큰을 제공하는 AWS Lambda 함수로 구성됩니다. Amazon IVS 채널은 라이브 플레이 아웃 및 시간 제한 메타 데이터를 관리하는 반면 키 페어는 Lambda 함수에서 뷰어 인증을 위한 토큰을 생성하는 데 사용됩니다.
Amazon IVS의 비공개 채널은 JWT (JSON Web Tokens)를 통해 보호됩니다. JWT를 생성하려면 먼저 ECDSA 공개 / 개인 키 쌍을 생성해야 합니다.
- 개인 키는 재생 인증을 활성화한 스트림에 토큰을 서명하는 데 사용됩니다.
- 퍼블릭 키는 Amazon IVS에 업로드하고 프라이빗 키로 서명된 토큰을 확인하는 데 사용됩니다.
사용자 인증 및 마스터 재생 목록 보호의 오버 헤드는 Amazon IVS 서비스에서 관리하지만 다음 단계는 토큰 판매 서비스를 구축하는 것입니다. 이 서비스는 사용자에게 인증할 JWT 토큰을 보내는 작업을 수행합니다.
다음 연습에서는 ECDSA 키 페어를 생성하고 AWS Lambda에서 서버리스 함수를 작성하여 재생 권한을 부여하기 위해 프라이빗 키로 서명된 JWT 토큰을 생성하고 제공하는 방법을 안내합니다.
실행
첫 번째 단계는 Amazon Interactive Video Service 대시 보드로 들어가는 것입니다. Media Services 아래의 “Find Services” 바에서 검색하여 Amazon IVS를 찾을 수 있습니다.
그런 다음 서비스 대시 보드에서 새 재생 키를 생성해야 합니다. 콘솔로 이동하여 왼쪽 탐색 메뉴에서 재생 키를 선택합니다. 그런 다음 재생 키 만들기를 클릭합니다.
메시지가 표시되면 재생 키 이름 (재생 ECDSA 키 쌍의 이름)을 입력합니다.
생성을 클릭하여 새 개인 키를 다운로드합니다. 이것은 모든 Amazon IVS 프라이빗 스트림의 토큰에 서명하는 데 사용할 수 있으므로 안전한 곳에 보관해야 합니다. 이 자습서의 뒷부분에서는 클라이언트에 보낼 JWT 토큰을 생성할 수 있도록 AWS Secrets Manager에 키를 저장하는 방법을 보여줍니다. 이제 키가 생성되어 로컬 컴퓨터에 저장되었으므로 첫 번째 IVS 채널을 설정해야 합니다.
이 연습에서는 새로운 IVS 채널을 만드는 과정을 안내합니다. 이미 채널을 시작했고 이를 사용하려는 경우 Amazon IVS 사용 설명서의 채널에서 재생 승인 활성화에 따라 채널을 보호할 수 있습니다.
비공개 채널 만들기를 시작하려면 채널 페이지로 이동하여 새 채널을 만듭니다. 비공개 채널을 생성하려면 사용자 지정 구성을 선택하고 일부 기본 옵션을 수동으로 재정의해야 합니다. 사용자 지정 구성을 선택한 후 토큰 인증을 활성화하는 토글이 표시되어야 합니다. 모든 설정이 완료되면 구성이 다음 스크린 샷과 일치해야 합니다. 구성을 확인한 후 주황색 채널 만들기 버튼을 클릭합니다.
이제 라이브 채널이 실행 중이므로 간단한 API를 만들어 채널에 대한 JWT 토큰을 반환하고 사용자 인증을 시작하겠습니다.
코드를 작성하기 전에 먼저 개인 키를 안전한 곳에 저장해야 합니다. 이 예에서는 AWS Secrets Manager에 프라이빗 키를 저장합니다.
Secrets Manager에 프라이빗 키를 업로드하려면 AWS Command Line Interface (AWS CLI)를 사용하면 됩니다. 다음 명령을 복사하고 개인 키(일명 pem 키)에 위치를 제공합니다.
None
aws secretsmanager create-secret –name ivsprivatekey –cli-binary-format raw-in-base64-out –secret-binary file://private-key.pem
JSON
{ “ARN”: “arn:aws:secretsmanager:us-west-2:582048091268:secret:ivsprivatekey-uljBck”, “Name”: “ivsprivatekey”, “VersionId”: “ca768fe0-e690-466f-95df-6784676185e9”
}
명령이 완료되면 터미널에 성공 출력이 표시됩니다. 이 응답에서 비밀 ARN, 비밀 이름 및 버전 ID GUID가 포함된 JSON 객체를 확인할 수 있습니다. 나중에 이 프라이빗 키에 액세스 할 수 있는 적절한 권한이 있는 IAM 정책을 생성하는 데 필요하므로 CLI 출력에서 ARN을 복사합니다.
이제 프라이빗 키가 Secrets Manager에 저장되었으므로 Lambda 함수를 생성하고 JWT를 생성하는 스크립트를 작성해야 합니다. 이 Lambda 함수는 JWT에 대한 권한 부여자 및 서명자 역할을 합니다.
새 탭을 열고 AWS Lambda 서비스 대시 보드로 이동합니다. Lambda 콘솔 내에서 함수 생성 버튼을 선택하고 새 NodeJS 12.x 함수를 생성합니다. 또한 Secrets Manager에 액세스 할 수 있는 권한이 있는 새 역할을 생성해야 합니다. 이 역할은 다음 스크립트와 유사해야 합니다. (<ARN_SECRET>위의 Secrets Manager ARN으로 교체)
JSON
{ “Version”: “2012-10-17”, “Statement”: [ { “Action”: [ “logs:CreateLogGroup”, “logs:CreateLogStream”, “logs:PutLogEvents” ], “Resource”: [ “arn:aws:logs:us-west-2:582048091268:log-group:/aws/lambda/*” ], “Effect”: “Allow” }, { “Action”: [ “secretsmanager:GetSecretValue” ], “Resource”: [ “<ARN_SECRET>” ], “Effect”: “Allow” } ]
}
이제 적절한 권한이 있으므로 Lambda 함수에 대한 코드를 작성해야 합니다. 이 예제는 추가 NodeJS 패키지를 사용하므로 대부분의 작업은 콘솔 외부에서 수행해야 합니다.
함수를 저장할 새 폴더를 로컬로 만듭니다. 다음 명령을 붙여 넣어 새 노드 프로젝트를 초기화하고 jsonwebtoken를 설치하면 함수를 사인하는 데 도움이 됩니다.
None
$ npm init
$ npm install jsonwebtoken
다음으로 index.js Lambda 함수 코드를 보관할 새 파일을 폴더의 루트에 생성합니다. 잠시 시간을 내어 이전에 기록해둔 Secret의 Manager ARN 및 채널 ARN을 회수하고 아래 스크립트를 index.js에 붙여넣습니다. 보안 ARN 및 채널 ARN을 배포와 관련된 ARN으로 교체해야 합니다.
JavaScript
// Need to install this using npm install jsonwebtokenvar jwt = require(‘jsonwebtoken’);const aws = require(‘aws-sdk’);var globalPem; exports.handler = async (event) => { if (globalPem === undefined) { await getPemKey(‘<SECRET_ARN>’); } var payload = { “aws:channel-arn”: “<CHANNEL_ARN>”, “aws:access-control-allow-origin”: “*” }; var token = jwt.sign(payload, globalPem, { algorithm: ‘ES384’, expiresIn: ‘2 days’ }); var tokenObj = { token }; const response = { statusCode: 200, body: JSON.stringify(tokenObj), headers: { ‘Access-Control-Allow-Origin’:‘*’, }, }; return response;}; async function getPemKey(pemId) { const secretsManager = new aws.SecretsManager({ apiVersion: ‘2017-10-17’ }); const secret = await secretsManager.getSecretValue({ SecretId: pemId }).promise(); globalPem = secret.SecretBinary;
}
이제 API 게이트웨이를 이 Lambda 함수로 지정하면 서명된 토큰이 클라이언트에 반환됩니다. 클라이언트가 토큰을 수신한 후 해당 토큰을 URL의 매개 변수로 사용하도록 애플리케이션을 구성할 수 있습니다. 예를 들어 https://<ivs_channel_url>?token=<token>로 스트림 보기를 시작할 수 있습니다:
우리는 Amazon IVS 프라이빗 채널을 시작하고 사용자가 프라이빗 채널에 액세스할 수 있도록 JWT 토큰을 생성하는 방법을 배웠습니다. 이 블로그 게시물 시리즈의 다음 버전에서는 실제 사용 사례를 검토하면서 기존 토큰 판매 서비스를 확장하는 방법을 배웁니다. 또한 사용자 확인, 다중 채널 지원 및 최신 프런트 엔드를 사용하여 간단한 구독 기반 서비스를 구현하는 방법에 대해서도 설명합니다.