미리 서명된 URL로 객체 공유 - Amazon Simple Storage Service

미리 서명된 URL로 객체 공유

모든 객체는 기본적으로 비공개이며, 객체 소유자만 이러한 객체에 액세스할 수 있습니다. 그러나 객체 소유자는 필요할 경우 자신의 보안 자격 증명을 사용하여 일정 기간 동안 객체 다운로드를 허가하는 미리 서명된 URL을 만들어 다른 사용자와 객체를 공유할 수 있습니다.

객체에 대해 미리 서명된 URL을 만들 때 보안 자격 증명을 제공하고 버킷 이름, 객체 키, HTTP 메서드(GET으로 객체 다운로드) 및 만료 날짜와 시간을 지정해야 합니다. 사전 서명된 URL은 지정된 기간 동안만 유효합니다.

미리 서명된 URL을 받은 사용자는 누구나 객체에 액세스할 수 있습니다. 예를 들어, 버킷에 동영상이 있고 버킷과 객체 모두 비공개인 경우 미리 서명된 URL을 만들어 다른 사용자와 동영상을 공유할 수 있습니다.

참고
  • 유효한 보안 자격 증명을 가진 사용자는 누구나 미리 서명된 URL을 만들 수 있습니다. 단, 미리 서명된 URL에서 제공하려는 작업을 수행할 권한이 있는 사용자가 생성해야 이 URL을 통해 성공적으로 객체에 액세스할 수 있습니다.

  • 미리 서명된 URL을 생성하는 데 사용할 수 있는 자격 증명에는 다음 사항이 포함됩니다.

    • IAM 인스턴스 프로파일: 최대 6시간 동안 유효함

    • AWS Security Token Service: AWS 계정 계정 루트 사용자 또는 IAM 사용자의 자격 증명과 같은 영구 자격 증명을 통해 서명된 경우 최대 36시간 동안 유효함

    • IAM 사용자: AWS 서명 버전 4를 사용할 경우 최대 7일 동안 유효함

      최대 7일 동안 유효한 미리 서명된 URL을 만들려면 사용 중인 SDK에 IAM 사용자 자격 증명(액세스 키 및 보안 액세스 키)을 먼저 지정합니다. 그런 다음 AWS 서명 버전 4를 사용하여 미리 서명된 URL을 생성합니다.

  • 임시 토큰을 사용하여 미리 서명된 URL을 생성하면 이 URL이 토큰 만료보다 이후의 만료 시간으로 생성된 경우에도 토큰이 만료되면 이 URL도 만료됩니다.

  • 미리 서명된 URL은 URL을 아는 모든 사람에게 Amazon S3 버킷에 대한 액세스 권한을 부여하므로 적절하게 보호하는 것이 좋습니다. 미리 서명된 URL 보호에 대한 자세한 내용은 미리 서명된 URL 기능 제한 섹션을 참조하세요.

미리 서명된 URL 생성

REST API, AWS Command Line Interface, AWS SDK for Java, .NET, Ruby, PHP, Node.js, PythonGo를 사용하여 프로그래밍 방식으로 미리 서명된 URL을 생성할 수 있습니다.

Visual Studio를 사용할 경우 코드를 작성할 필요 없이 AWS Explorer for Visual Studio로 미리 서명된 객체 URL을 만들 수 있습니다. 이 URL만 있으면 누구나 객체를 다운로드할 수 있습니다. 자세한 내용은 AWS Explorer에서 Amazon S3 사용을 참조하세요.

AWS Explorer를 설치하는 방법에 대한 자세한 내용은 AWS SDK 및 Explorer를 사용하여 Amazon S3로 개발 섹션을 참조하세요.

다음 예제는 객체를 검색할 수 있도록 다른 사용자에게 제공할 미리 서명된 URL을 생성합니다. 자세한 내용은 미리 서명된 URL로 객체 공유 섹션을 참조하세요.

.NET

다음 예제는 객체를 검색할 수 있도록 다른 사용자에게 제공할 미리 서명된 URL을 생성합니다. 자세한 내용은 미리 서명된 URL로 객체 공유 섹션을 참조하세요.

실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Amazon S3 .NET 코드 예제 실행를 참조하세요.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; namespace Amazon.DocSamples.S3 { class GenPresignedURLTest { private const string bucketName = "*** bucket name ***"; private const string objectKey = "*** object key ***"; // Specify how long the presigned URL lasts, in hours private const double timeoutDuration = 12; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); string urlString = GeneratePreSignedURL(timeoutDuration); } static string GeneratePreSignedURL(double duration) { string urlString = ""; try { GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest { BucketName = bucketName, Key = objectKey, Expires = DateTime.UtcNow.AddHours(duration) }; urlString = s3Client.GetPreSignedURL(request1); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } return urlString; } } }
Go

SDK for Go를 사용하여 객체를 업로드할 수 있습니다. PUT 요청을 전송하여 단일 작업에서 데이터를 업로드할 수 있습니다. 자세한 내용은 AWS SDK for Go 개발자 안내서특정 페이로드가 포함된 Amazon S3 PUT 작업에 대한 미리 서명된 URL 생성을 참조하세요.

Java

다음 예제에서는 S3 버킷에서 객체를 검색할 수 있도록 다른 사용자에게 제공할 미리 서명된 URL을 생성합니다. 자세한 내용은 미리 서명된 URL로 객체 공유 섹션을 참조하세요.

실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 Amazon S3 Java 코드 예제 테스트 섹션을 참조하세요.

import com.amazonaws.AmazonServiceException; import com.amazonaws.HttpMethod; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import java.io.IOException; import java.net.URL; import java.time.Instant; public class GeneratePresignedURL { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String objectKey = "*** Object key ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withRegion(clientRegion) .withCredentials(new ProfileCredentialsProvider()) .build(); // Set the presigned URL to expire after one hour. java.util.Date expiration = new java.util.Date(); long expTimeMillis = Instant.now().toEpochMilli(); expTimeMillis += 1000 * 60 * 60; expiration.setTime(expTimeMillis); // Generate the presigned URL. System.out.println("Generating pre-signed URL."); GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectKey) .withMethod(HttpMethod.GET) .withExpiration(expiration); URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest); System.out.println("Pre-Signed URL: " + url.toString()); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
PHP

AWS SDK for PHP 버전 3을 사용하여 미리 서명된 URL을 생성하는 방법에 대한 자세한 내용은 AWS SDK for PHP 개발자 안내서에서 AWS SDK for PHP 버전 3으로 미리 서명된 Amazon S3 URL을 참조하세요.

Python

미리 서명된 URL을 생성하여 SDK for Python(Boto3)을 사용해 객체를 공유합니다. 예를 들어, Boto3 클라이언트와 generate_presigned_url 함수를 사용하여 객체를 GET하는 미리 서명된 URL을 생성합니다.

import boto3 url = boto3.client('s3').generate_presigned_url( ClientMethod='get_object', Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'}, ExpiresIn=3600)

미리 서명된 URL을 생성하는 방법과 요청 패키지를 사용하여 객체를 업로드하고 다운로드하는 방법을 보여주는 전체 예제는 GitHub의 PHP 미리 서명된 URL 예제를 참조하세요. SDK for Python(Boto3)을 사용하여 미리 서명된 URL을 생성하는 방법에 대한 자세한 내용은 AWS SDK for PHP API 참조Python을 참조하세요.