

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS SDK for Rust를 사용하여 미리 서명된 URL 생성
<a name="presigned-urls"></a>

 나중에 다른 호출자가 자신의 자격 증명을 제시하지 않고도 요청을 사용할 수 있도록 일부 AWS API 작업에 대한 요청을 미리 서명할 수 있습니다.

 예를 들어 Jane이 Amazon Simple Storage Service(Amazon S3) 객체에 대한 액세스 권한을 가지고 있고 객체에 대한 액세스 권한을 Alejandro와 일시적으로 공유하려고 할 경우, Jane은 미리 서명된 `GetObject` 요청을 생성하여 Alejandro와 공유할 수 있으므로 Alejandro는 Jane의 자격 증명에 액세스하거나 직접 자격 증명을 보유하지 않고도 객체를 다운로드할 수 있습니다. Jane이 URL을 생성한 AWS 사용자이므로 미리 서명된 URL에서 사용하는 자격 증명은 Jane의 자격 증명입니다.

Amazon S3의 미리 서명된 URL에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [미리 서명된 URL 작업](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)을 참조하세요.

## 사전 서명 기본 사항
<a name="presign-basics"></a>

 AWS SDK for Rust는 미리 서명된 요청을 가져오는 데 사용할 수 있는 작업 fluent-builder에 대한 `presigned()` 메서드를 제공합니다.

 다음 예시에서는 Amazon S3에 대해 미리 서명된 `GetObject` 요청을 생성합니다. 요청은 생성 후 5분 동안 유효합니다.

```
use std::time::Duration;
use aws_config::BehaviorVersion;
use aws_sdk_s3::presigning::PresigningConfig;

let config = aws_config::defaults(BehaviorVersion::latest())
    .load()
    .await;

let s3 = aws_sdk_s3::Client::new(&config);

let presigned = s3.get_object()
    .presigned(
        PresigningConfig::builder()
            .expires_in(Duration::from_secs(60 * 5))
            .build()
            .expect("less than one week")
    )
    .await?;
```

 `presigned()` 메서드는 `Result<PresignedRequest, SdkError<E, R>>`를 반환합니다.

반환된 `PresignedRequest`에는 메서드, URI 및 헤더를 포함하여 HTTP 요청의 구성 요소를 가져오는 메서드가 포함되어 있습니다. 요청이 유효하려면 이러한 모든 항목을 서비스로 전송해야 합니다. 그러나 미리 서명된 많은 요청은 URI로만 표현할 수 있습니다.

## `POST` 및 `PUT` 요청 사전 서명
<a name="presign-post-put"></a>

 미리 서명할 수 있는 많은 작업은 URL만 필요하며 HTTP `GET` 요청으로 전송해야 합니다. 그러나 일부 작업은 본문을 사용하므로 경우에 따라 헤더와 함께 HTTP `POST` 또는 HTTP `PUT` 요청으로 전송해야 합니다. 이러한 요청을 미리 서명하는 것은 `GET` 요청에 미리 서명하는 것과 동일하지만 미리 서명된 요청을 간접 호출하는 것은 더 복잡합니다.

 다음은 Amazon S3 `PutObject` 요청을 미리 서명하고 선택한 HTTP 클라이언트를 사용하여 전송할 수 있는 [https://docs.rs/http/latest/http/request/struct.Request.html](https://docs.rs/http/latest/http/request/struct.Request.html)로 변환하는 예제입니다.

`into_http_1x_request()` 메서드를 사용하려면 `Cargo.toml` 파일의 `aws-sdk-s3` 크레이트에 `http-1x` 기능을 추가합니다.

```
aws-sdk-s3 = { version = "1", features = ["http-1x"] }
```

소스 파일:

```
let presigned = s3.put_object()
    .presigned(
        PresigningConfig::builder()
            .expires_in(Duration::from_secs(60 * 5))
            .build()
            .expect("less than one week")
    )
    .await?;


let body = "Hello AWS SDK for Rust";
let http_req = presigned.into_http_1x_request(body);
```

## 독립 실행형 서명자
<a name="standalone-signer"></a>

**참고**  
다음은 고급 사용 사례입니다. 대부분의 사용자에게 필요하지 않거나 권장되지는 않습니다.

SDK for Rust 컨텍스트 외부에서 서명된 요청을 생성해야 하는 몇 가지 사용 사례가 있습니다. 이 경우 SDK와 독립적으로 [https://docs.rs/aws-sigv4/latest/aws_sigv4/index.html](https://docs.rs/aws-sigv4/latest/aws_sigv4/index.html) 크레이트를 사용할 수 있습니다.

 다음은 기본 요소를 보여주는 예제입니다. 자세한 내용은 크레이트 설명서를 참조하세요.

`Cargo.toml` 파일에 `aws-sigv4` 및 `http` 크레이트를 추가합니다.

```
[dependencies]
aws-sigv4 = "1"
http = "1"
```

소스 파일:

```
use aws_smithy_runtime_api::client::identity::Identity;
use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest};
use aws_sigv4::sign::v4;
use std::time::SystemTime;

// Set up information and settings for the signing.
// You can obtain credentials from `SdkConfig`.
let identity = Credentials::new(
    "AKIDEXAMPLE",
    "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY",
    None,
    None,
    "hardcoded-credentials").into();

let settings = SigningSettings::default();

let params = v4::SigningParams::builder()
    .identity(&identity)
    .region("us-east-1")
    .name("service")
    .time(SystemTime::now())
    .settings(settings)
    .build()?
    .into();

// Convert the HTTP request into a signable request.
let signable = SignableRequest::new(
    "GET",
    "https://some-endpoint.some-region.amazonaws.com",
    std::iter::empty(),
    SignableBody::UnsignedPayload
)?;

// Sign and then apply the signature to the request.
let (signing_instructions, _signature) = sign(signable, &params)?.into_parts();

let mut my_req = http::Request::new("...");
signing_instructions.apply_to_request_http1x(&mut my_req);
```