

# 미리 서명된 URL을 사용하여 객체 공유
<a name="S3OutpostsShareObjectPresignedURL"></a>

버킷 정책을 업데이트하지 않고 Outpost에 로컬로 저장된 객체에 한시적 액세스 권한을 부여하려면 미리 서명된 URL을 사용할 수 있습니다. 버킷 소유자는 미리 서명된 URL을 사용하여 Virtual Private Cloud(VPC)의 사용자와 객체를 공유하거나 이들에게 객체를 업로드 또는 삭제할 수 있는 권한을 부여할 수 있습니다.

AWS SDK 또는 AWS Command Line Interface(AWS CLI)를 사용하여 미리 서명된 URL을 생성하면 URL을 특정 작업과 연결합니다. 또한 최소 1초 및 최대 7일의 사용자 지정 만료 시간을 선택하여 미리 서명된 URL에 대한 한시적 액세스 권한을 부여할 수 있습니다. 미리 서명된 URL을 공유하면 VPC의 사용자가 원래 서명 사용자인 것처럼 URL에 포함된 작업을 수행할 수 있습니다. URL이 만료 시간에 도달하면 URL이 만료되고 더 이상 작동하지 않습니다.



미리 서명된 URL을 생성하면 보안 인증 정보를 제공한 후 다음을 지정해야 합니다.
+ Amazon S3 on Outposts 버킷에 대한 액세스 포인트 Amazon 리소스 이름(ARN)
+ 객체 키
+ HTTP 메서드(객체 다운로드를 위한 `GET`)
+ 만료 날짜 및 시간

미리 서명된 URL은 지정된 기간 동안만 유효합니다. 즉, 만료 날짜 및 시간 전에 URL에서 허용하는 작업을 시작해야 합니다. 미리 서명된 URL은 만료 날짜 및 시간까지 여러 번 사용할 수 있습니다. 임시 토큰을 사용하여 미리 서명된 URL을 생성할 경우, URL의 만료 시간이 토큰 만료 시간보다 이후인 경우에도 토큰이 만료되면 URL도 만료됩니다.

미리 서명된 URL에 액세스할 수 있는 Virtual Private Cloud(VPC) 사용자는 객체에 액세스할 수 있습니다. 예를 들어, 버킷에 동영상이 있고 버킷과 객체 모두 비공개인 경우 미리 서명된 URL을 만들어 다른 사용자와 동영상을 공유할 수 있습니다. 미리 서명된 URL은 해당 URL을 소유한 모든 사람에게 S3 on Outposts 버킷에 대한 액세스 권한을 부여하므로, URL을 적절하게 보호하는 것이 좋습니다. 미리 서명된 URL 보호에 대한 자세한 내용은 [미리 서명된 URL 기능 제한](S3OutpostsPresignedURL.md#S3OutpostsPresignedUrlUploadObjectLimitCapabilities) 섹션을 참조하세요.

유효한 보안 자격 증명을 가진 사용자는 누구나 미리 서명된 URL을 만들 수 있습니다. 단, 미리 서명된 URL은 미리 서명된 URL에서 제공하려는 작업을 수행할 권한이 있는 사용자가 생성해야 합니다. 자세한 내용은 [미리 서명된 URL을 생성할 수 있는 사용자](S3OutpostsPresignedURL.md#S3Outpostswho-presigned-url) 섹션을 참조하세요.

AWS SDK 및 AWS CLI를 사용하여 S3 on Outposts 버킷에 있는 객체를 공유할 미리 서명된 URL을 생성할 수 있습니다. 자세한 정보는 다음 예를 참조하십시오.

## AWS SDK 사용
<a name="S3OutpostsShareObjectPreSignedURLSDK"></a>

AWS SDK를 사용하여 객체를 검색할 수 있도록 다른 사용자에게 제공할 미리 서명된 URL을 생성할 수 있습니다.

**참고**  
AWS SDK를 사용하여 미리 서명된 URL을 생성할 때 미리 서명된 URL의 최대 만료 시간은 생성 시점으로부터 7일입니다.

------
#### [ Java ]

**Example**  
다음 예제에서는 S3 on Outposts 버킷에서 객체를 검색할 수 있도록 다른 사용자에게 제공할 미리 서명된 URL을 생성합니다. 자세한 내용은 [S3 on Outposts에서 미리 서명된 URL 사용](S3OutpostsPresignedURL.md) 섹션을 참조하세요. 이 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.  

```
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 accessPointArn = "*** access point ARN ***";
        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(accessPointArn, 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();
        }
    }
}
```

------
#### [ .NET ]

**Example**  
다음 예제에서는 S3 on Outposts 버킷에서 객체를 검색할 수 있도록 다른 사용자에게 제공할 미리 서명된 URL을 생성합니다. 자세한 내용은 [S3 on Outposts에서 미리 서명된 URL 사용](S3OutpostsPresignedURL.md) 섹션을 참조하세요. 이 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.  

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;

namespace Amazon.DocSamples.S3
{
    class GenPresignedURLTest
    {
        private const string accessPointArn = "*** access point ARN ***"; 
        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 = accessPointArn,
                    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;
        }
    }
}
```

------
#### [ 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': 'ACCESS_POINT_ARN', 'Key': 'OBJECT_KEY'},
    ExpiresIn=3600)
```

SDK for Python(Boto3)을 사용하여 미리 서명된 URL을 생성하는 방법에 대한 자세한 내용은 *AWS SDK for Python (Boto) API 참조*의 [Python](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url)을 참조하세요.

------

## AWS CLI 사용
<a name="S3OutpostsShareObjectPresignedCLI"></a>

다음 예제에서 AWS CLI 명령은 S3 on Outposts 버킷에 대해 미리 서명된 URL을 생성합니다. 이 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

**참고**  
AWS CLI를 사용하여 미리 서명된 URL을 생성할 때 미리 서명된 URL의 최대 만료 시간은 생성 시점으로부터 7일입니다.

```
aws s3 presign s3://arn:aws:s3-outposts:us-east-1:111122223333:outpost/op-01ac5d28a6a232904/accesspoint/example-outpost-access-point/mydoc.txt --expires-in 604800
```

자세한 내용은 *AWS CLI 명령 참조 안내서*의 [미리 서명](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html)을 참조하세요.