CloudFront 서명된 URL로 시간 제한 다운로드 URL 생성
7217 단어 CloudFrontAWS
개요
CloudFront의 서명 된 URL에서 시간 제한이있는 다운로드 URL을 게시하기 위해 Node.js에서 다운로드 URL을 게시하는 방법을 설명합니다.
준비
필요한 준비로 AWS 측에서 다음을 준비합니다.
필요한 준비로 AWS 측에서 다음을 준비합니다.
CloudFront를 통해 액세스하는 S3 버킷을 준비합니다.
디스트리뷰션은 작성이 끝난 경우는 설정에 맞추어 변경을 실시해, 신규의 경우는 Web에서 작성을 실시해 설정을 실시한다.
설정 위치로서 다음 내용을 수정한다.
Restrict Bucket Access는 S3에서 직접 요청을 보내지 않도록 대응하므로 Yes로 한다.
또한 Query String에서
response-content-disposition
를 WhiteList에 등록합니다. 이 파라미터가 attachment
의 경우는 다운로드할 파일로서 클라이언트측이 인식해, 다운로드를 실시한다.매개변수
값
Restrict Bucket Access
예
Cache Based on Selected Request Headers
Whitelist
Whitelist Headers
origin
Query String Forwarding and Caching
Forward all, cache based on whitelist
Query String Whitelist
response-content-disposition
Restrict Viewer Access (Use Signed URLs or Signed Cookies)
예
Trusted Signers
셀프
서명된 URL을 게시하려면 CloudFront용 키 쌍을 발급해야 합니다.
게시에는 AWS의 관리 콘솔에 루트 계정으로 로그인하여 게시해야 합니다.
발행 후 아래의 모달이 올라 오기 때문에 비밀 키를 다운로드합니다.
(공개키는 사용하지 않는다. 이 모달로 비밀키를 다운로드하지 않으면 이후 다운로드를 할 수 없게 된다.)
Node.js 측 구현
Node.js 측에 구현을 실시한다.
필요한 모듈로서 aws-sdk, moment
가 있기 때문에 npm등으로 인스톨을 실시한다.
response-content-disposition=attachment
를 제거하면 클라이언트 측에 이미지와 동영상을 표시 할 수 있습니다.
moment().add()
는 값을 변경하여 해당 URL이 유효한 시간을 설정할 수 있지만 과거 시간을 지정할 수는 없습니다.
var aws = require('aws-sdk');
var moment = require('moment');
var fs = require('fs');
const key_pair_id = 'XXXXXXXXXXXXXXXXXXX';
const private_key = fs.readFileSync('./pk-XXXXXXXXXXXXXXXXXXX.pem', 'utf-8');
const cloudfront = new aws.CloudFront.Signer(key_pair_id, private_key);
const fileName = 'test.png';
const url = 'https://xxxxxxxxxxxxxx.cloudfront.net/'+fileName+'?response-content-disposition=attachment';
// 5min 後に設定
const time = moment().add('+5', 'minute');
const expire = time.unix();
console.log('Expire time: ' + time.format());
let cloudfront_url;
cloudfront.getSignedUrl({url: url, expires: expire}, (err, url) =>{
if(err){
return;
}
cloudfront_url = url;
});
console.log(cloudfront_url);
위의 코드를 실제로 실행하면 URL과 Expire time이 출력됩니다.
clom@MyComputer:~$ node cloudfront.js
Expire time: 2018-12-31T21:44:45+09:00
https://xxxxxxxxxxxxxx.cloudfront.net/test.png?response-content-disposition=attachment&Expires=1546260285&Key-Pair-Id=XXXXXXXXXXXXXXXXXXX&Signature=xxxxxx__
clom@MyComputer:~$
출력 된 링크를 실행하여 파일을 다운로드합니다.
또한 시간 경과 후에 실행한 경우에는 Access Denied
의 취지가 출력된다.
이를 통해 CloudFront의 서명된 URL에서 시간 제한 다운로드 URL을 게시할 수 있습니다.
기간외의 파일의 다운로드를 실시할 수 없게 하는 것으로 다양한 서비스에 이용할 수 있다고 생각하고 있다.
Reference
이 문제에 관하여(CloudFront 서명된 URL로 시간 제한 다운로드 URL 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/clom/items/a7b6278bb340b0233c73
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
var aws = require('aws-sdk');
var moment = require('moment');
var fs = require('fs');
const key_pair_id = 'XXXXXXXXXXXXXXXXXXX';
const private_key = fs.readFileSync('./pk-XXXXXXXXXXXXXXXXXXX.pem', 'utf-8');
const cloudfront = new aws.CloudFront.Signer(key_pair_id, private_key);
const fileName = 'test.png';
const url = 'https://xxxxxxxxxxxxxx.cloudfront.net/'+fileName+'?response-content-disposition=attachment';
// 5min 後に設定
const time = moment().add('+5', 'minute');
const expire = time.unix();
console.log('Expire time: ' + time.format());
let cloudfront_url;
cloudfront.getSignedUrl({url: url, expires: expire}, (err, url) =>{
if(err){
return;
}
cloudfront_url = url;
});
console.log(cloudfront_url);
clom@MyComputer:~$ node cloudfront.js
Expire time: 2018-12-31T21:44:45+09:00
https://xxxxxxxxxxxxxx.cloudfront.net/test.png?response-content-disposition=attachment&Expires=1546260285&Key-Pair-Id=XXXXXXXXXXXXXXXXXXX&Signature=xxxxxx__
clom@MyComputer:~$
Reference
이 문제에 관하여(CloudFront 서명된 URL로 시간 제한 다운로드 URL 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/clom/items/a7b6278bb340b0233c73텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)