귀하의 사이트에서 프리미엄/비공개 콘텐츠를 제공하는 방법은 무엇입니까?

많은 온라인 회사(예: Netflix, Udemy 등)는 사이트 회원 또는 구독하거나 프리미엄을 지불한 회원만 액세스할 수 있는 콘텐츠를 인터넷을 통해 배포합니다. 오늘 이 게시물에서는 Amazon Web Services를 사용하여 웹 사이트에서 이를 달성하는 방법을 살펴봅니다. S3 미리 서명된 URL을 사용하여 AWS S3 버킷에서 사용자에게 비공개 콘텐츠를 안전하게 제공하는 방법을 살펴보겠습니다.

미리 서명된 URL이란 무엇입니까?



미리 서명된 URL은 제한된 권한과 요청 시간을 제공하는 URL입니다. 그러면 미리 서명된 URL을 받는 사람은 누구나 개체에 액세스할 수 있습니다. 예를 들어 버킷에 파일이 있고 버킷과 객체가 모두 비공개인 경우 미리 서명된 URL을 생성하여 파일을 다른 사람과 공유할 수 있습니다.

미리 서명된 URL에 대한 몇 가지 중요한 사항


  • 미리 서명된 URL 작성자는 URL이 작동하려면 객체에 액세스할 수 있어야 합니다. 그렇지 않으면 URL이 작동하지 않습니다.
  • 사용할 수 없거나 작동하지 않는 미리 서명된 URL을 만들 수 있습니다.
  • 미리 서명된 URL을 만드는 데 비용이 들지 않습니다.
  • URL에 만료 시간을 설정할 수 있습니다
  • .
  • 임시 토큰을 사용하여 미리 서명된 URL을 생성한 경우 만료 시간이 더 늦은 URL을 생성했더라도 토큰이 만료되면 URL이 만료됩니다
  • .
  • URL을 생성한 사용자로부터 개체에 대한 액세스 권한을 제거하여 URL을 취소할 수 있습니다.

  • 미리 서명된 URL을 만드는 방법은 무엇입니까?



    객체에 대해 미리 서명된 URL을 생성할 때 보안 자격 증명을 제공하고 버킷 이름, 객체 키를 지정하고 방법 및 만료 시간을 지정해야 합니다.

    Python에서는 Boto3를 사용하여 generate_presigned_url 메서드를 사용하여 URL을 생성할 수 있습니다.

    response = s3_client.generate_presigned_url('get_object',
                Params={'Bucket': bucket_name,
                'Key': object_name},
                ExpiresIn=expiration)
    

    응답 개체에는 다음과 유사한 URL이 포함됩니다.

    https://somebucketname-rep.s3.amazonaws.com/someFileName.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQS3IOUWUZF7YSXGA%2F20200821%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20200821T051228Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=FwoGZXIvYXdzEH8aDCfJDxO0y6xQxYmdGCK2AXe71W%2FgZEg%2FSnSWC%2Fw%2FaJHeZ20M7OI7AqMEum5c98Chl6pSNPwE5Awsc3ySwokDF6L8a9wP0ceXWAmxT3WXLSoFeNHDbbEHfUKWnvGL8yFzAxdmf%2Fmi%2B5Tnl62td8Nad%2F0Ct1Sx11Mip1h2qdYxw80OX5bCTq7cAHHjpmupvaDt%2BZ3qVyIA9WZmeS63dCPOlieE9IiBZf%2FjxF4Mcs5w4ZIHtZL%2F3LvqMXAy3XfzCgnlYVZeCNczKLuv%2FfkFMi0mStwkzyO%2BfMIxWJ82GJmyNi7LZuY5r0Hx0mE%2BxLnre8jp9%2FACoV%2FM92GnsR0%3D&X-Amz-Signature=17046b630ad4dede85af1cd57204bba8adc462a1825a35d93e81b656c683ad75
    

    브라우저에서 이 URL을 사용하여 개체에 액세스할 수 있습니다! 간단합니다..그렇죠?

    액션으로 보자



    이전 두 게시물in the first post 위에 이를 구현하려고 합니다. AWS KMS를 사용하여 암호 해독을 암호화하는 사용자 지정 자격 증명 브로커(가입/로그인)를 구현했습니다. second post에서 AWS STS를 AssumeRole에 사용하여 버킷 파일 이름을 읽었으며 이제 미리 서명된 URL을 사용하도록 확장합니다. github.com/rajanpanchal/aws-kms-sts에서 두 번째 게시물의 코드를 다운로드하고 수정합니다.
    전체 프로세스는 다음과 같습니다.


    Lamdba 폴더에서 showFiles.py 파일을 열고 미리 서명된 URL을 생성하는 기능을 추가합니다. getFilesList 함수에서 이 함수를 호출합니다.

    def getSignedUrl(key,s3_client):
        KeyUrl = {}
    
        response = s3_client.generate_presigned_url('get_object',
                            Params={'Bucket': os.environ['filesBucket'],
                            'Key': key},
                            ExpiresIn=3600)
        KeyUrl[key] = response
        return KeyUrl
    
    
    # Returns list of files from bucket using STS    
    def getFilesList():
        sts_client = boto3.client('sts')
    
        # Call the assume_role method of the STSConnection object and pass the role
        # ARN and a role session name.
        assumed_role_object=sts_client.assume_role(
            RoleArn=os.environ['s3role'],
            RoleSessionName="AssumeRoleSession1"
        )
    
        # From the response that contains the assumed role, get the temporary 
        # credentials that can be used to make subsequent API calls
        credentials=assumed_role_object['Credentials']
    
        # Use the temporary credentials that AssumeRole returns to make a 
        # connection to Amazon S3  
        s3_resource=boto3.resource(
            's3',
            aws_access_key_id=credentials['AccessKeyId'],
            aws_secret_access_key=credentials['SecretAccessKey'],
            aws_session_token=credentials['SessionToken'],
        )
        s3_client = boto3.client('s3',aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'])
        bucket = s3_resource.Bucket(os.environ['filesBucket'])
        files=[]
        for obj in bucket.objects.all():
            files.append(getSignedUrl(obj.key,s3_client))
        return files
    

    AssumeRole에서 얻은 임시 자격 증명을 사용하여 getSignedUrl 함수에서 Presigned URL을 생성합니다. getFilesList 함수는 파일 이름 목록과 미리 서명된 URL을 반환합니다.

    이제 showFiles.html을 수정하여 응답을 반복하고 파일에 대한 링크를 만듭니다.

    <html>
    <head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha512-8bHTC73gkZ7rZ7vpqUQThUDhqcNFyYi2xgDgPDHc+GXVGHXq+xPjynxIopALmOPqzo9JZj0k6OqqewdGO3EsrQ==" crossorigin="anonymous" />
    <script
      src="https://code.jquery.com/jquery-3.1.1.min.js"
      integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
      crossorigin="anonymous"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js"></script>
    </head>
    <body>
    
    <div class="ui raised very text container">
    <h1 class="ui header">File Access System</h1>
    <i class="folder open icon"></i></i><div class="ui label">Files</div>
    <div id="files" >Loading..</div>
    </div>
    </body>
    <script>
    
    fetch(" https://g4m3zpzp95.execute-api.us-east-2.amazonaws.com/Prod/showFiles/", {
      credentials: 'include'
    })
      .then(response => response.text())
      .then((body) => {
        var files="";
    
        var obj = JSON.parse(body)
        for (i = 0; i < obj.length; i++) {
                var o = obj[i]
    
                for(x in o){
                    files =  files+ "<i class='file alternate outline icon'><a href='"+o[x]+"' target='_blank'>&nbsp;&nbsp;"+x+"</a>"
                }
        }
        document.getElementById("files").innerHTML= files
      })
      .catch(function(error) {
        console.log(error); 
      });
    
    </script>
    </html>
    
    

    이제 SAM 빌드 및 배포를 수행합니다.


    login.html, signup.html 및 showFiles.html을 수정하여 cloudformation 출력에서 ​​api URL을 업데이트합니다.
    이러한 파일을 버킷 stsexamplebucket 또는 생성한 버킷에 업로드합니다. 이 파일을 공개로 유지

    여기에서 코드를 찾을 수 있습니다.
    https://github.com/rajanpanchal/aws-kms-sts-presigned-url

    테스트





    질문이나 의견이 있으면 알려주세요!

    좋은 웹페이지 즐겨찾기