CloudFront 서명된 URL로 시간 제한 다운로드 URL 생성

7217 단어 CloudFrontAWS

개요



CloudFront의 서명 된 URL에서 시간 제한이있는 다운로드 URL을 게시하기 위해 Node.js에서 다운로드 URL을 게시하는 방법을 설명합니다.

준비



필요한 준비로 AWS 측에서 다음을 준비합니다.
  • S3 버킷

  • CloudFront를 통해 액세스하는 S3 버킷을 준비합니다.
  • CloudFront 배포판

  • 디스트리뷰션은 작성이 끝난 경우는 설정에 맞추어 변경을 실시해, 신규의 경우는 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
    셀프


  • CloudFront 키 쌍

  • 서명된 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을 게시할 수 있습니다.
    기간외의 파일의 다운로드를 실시할 수 없게 하는 것으로 다양한 서비스에 이용할 수 있다고 생각하고 있다.

    좋은 웹페이지 즐겨찾기