

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

# AWS SDK for Rust 내에서 HTTP 수준 설정 구성
<a name="http"></a>

는 코드에서 생성한 클라이언트가 AWS 서비스 사용하는 내장 HTTP 기능을 AWS SDK for Rust 제공합니다.

기본적으로 SDK for Rust는 `hyper`, `rustls` 및 `aws-lc-rs`를 기반으로 HTTPS 클라이언트를 사용합니다. 이 클라이언트는 추가 구성 없이 대부분의 사용 사례에 적합합니다.
+ [https://docs.rs/hyper/latest/hyper/](https://docs.rs/hyper/latest/hyper/)는와 함께 사용하여 API 서비스를 호출 AWS SDK for Rust 할 수 있는 Rust용 하위 수준 HTTP 라이브러리입니다.
+ [https://github.com/rustls/rustls](https://github.com/rustls/rustls)는 Rust로 작성된 최신 TLS 라이브러리로, 암호화 공급자를 위한 옵션이 내장되어 있습니다.
+ [https://github.com/aws/aws-lc](https://github.com/aws/aws-lc)는 TLS 및 일반 애플리케이션에 필요한 알고리즘을 포함하는 범용 암호화 라이브러리입니다.
+ [https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs)는 Rust의 `aws-lc` 라이브러리 주변에 있는 자연스러운 래퍼입니다.

다른 TLS 또는 암호화 공급자를 선택하려는 경우 `aws-smithy-http-client` 크레이트는 몇 가지 추가 옵션과 구성을 제공합니다. 고급 사용 사례의 경우 자체 HTTP 클라이언트 구현을 가져오거나 고려 대상 기능 요청을 제출하는 것이 좋습니다.

## 대체 TLS 공급자 선택
<a name="tlsProviders"></a>

`aws-smithy-http-client` 크레이트는 몇 가지 대체 TLS 공급자를 제공합니다.

다음과 같은 공급자를 사용할 수 있습니다.

**`rustls`가 있는 `aws-lc`**  
암호화에 [https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs)를 사용하는 [https://github.com/rustls/rustls](https://github.com/rustls/rustls) 기반 TLS 공급자입니다.  
이는 SDK for Rust의 기본 HTTP 동작입니다. 이 옵션을 사용하려면 코드에서 추가 작업을 수행할 필요가 없습니다.

**`s2n-tls`**  
[https://github.com/aws/s2n-tls](https://github.com/aws/s2n-tls) 기반 TLS 공급자입니다.

**`rustls`가 있는 `aws-lc-fips`**  
암호화를 위해 [https://github.com/aws/aws-lc-rs](https://github.com/aws/aws-lc-rs)의 FIPS 호환 버전을 사용하는 [https://github.com/rustls/rustls](https://github.com/rustls/rustls) 기반 TLS 공급자

**`rustls`가 있는 `ring`**  
암호화에 [https://github.com/briansmith/ring](https://github.com/briansmith/ring)를 사용하는 [https://github.com/rustls/rustls](https://github.com/rustls/rustls) 기반 TLS 공급자입니다.

### 사전 조건
<a name="prereqTls"></a>

`aws-lc-rs` 또는 `s2n-tls`를 사용하려면 C 컴파일러(Clang 또는 GCC)를 빌드해야 합니다. 일부 플랫폼의 경우 빌드에 CMake가 필요할 수도 있습니다. 모든 플랫폼에서 ‘fips’ 기능을 사용하여 빌드하려면 CMake 및 Go가 필요합니다. 자세한 내용은 [AWS Libcrypto for Rust(`aws-lc-rs`)](https://github.com/aws/aws-lc-rs/blob/main/aws-lc-rs/README.md) 리포지토리 및 빌드 지침을 참조하세요.

### 대체 TLS 공급자를 사용하는 방법
<a name="s2nTls"></a>

`aws-smithy-http-client` 크레이트는 추가 TLS 옵션을 제공합니다. AWS 서비스 클라이언트가 다른 TLS 공급자를 사용하려면 `aws_config` 크레이트의 로더를 사용하여 `http_client`를 재정의합니다. HTTP 클라이언트는 AWS 서비스 및 자격 증명 공급자 모두에 사용됩니다.

다음 예제에서는 `s2n-tls` TLS 공급자를 사용하는 방법을 보여줍니다. 그러나 다른 공급자에게도 유사한 접근 방식이 적용됩니다.

예제 코드를 컴파일하려면 다음 명령을 실행하여 프로젝트에 종속성을 추가합니다.

```
cargo add aws-smithy-http-client -F {{s2n-tls}}
```

예제 코드:

```
use aws_smithy_http_client::{tls, Builder};

#[tokio::main]
async fn main() {
    let http_client = Builder::new()
        .tls_provider(tls::Provider::{{S2nTls}})
        .build_https();

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

    // create client(s) using sdk_config
    // e.g. aws_sdk_s3::Client::new(&sdk_config);
}
```

## FIPS 지원 활성화
<a name="fipsTls"></a>

`aws-smithy-http-client` 크레이트는 FIPS 준수 암호화 구현을 활성화하는 옵션을 제공합니다. AWS 서비스 클라이언트가 FIPS 준수 공급자를 사용하려면 `aws_config` 상자의 로더를 `http_client` 사용하여를 재정의합니다. HTTP 클라이언트는 AWS 서비스 및 자격 증명 공급자 모두에 사용됩니다.

**참고**  
FIPS 지원에는 빌드 환경에 추가 종속성이 필요합니다. `aws-lc` 크레이트에 대한 [빌드](https://github.com/aws/aws-lc/blob/main/BUILDING.md) 지침을 참조하세요.

예제 코드를 컴파일하려면 다음 명령을 실행하여 프로젝트에 종속성을 추가합니다.

```
cargo add aws-smithy-http-client -F rustls-aws-lc-fips
```

다음 예제 코드는 FIPS 지원을 활성화합니다.

```
// file: main.rs
use aws_smithy_http_client::{
    tls::{self, rustls_provider::CryptoMode},
    Builder,
};

#[tokio::main]
async fn main() {
    let http_client = Builder::new()
        .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLcFips))
        .build_https();

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

    // create client(s) using sdk_config
    // e.g. aws_sdk_s3::Client::new(&sdk_config);
}
```

## 포스트 퀀텀 키 교환 우선 순위 지정
<a name="quantumTls"></a>

기본 TLS 공급자는 `X25519MLKEM768` 포스트 퀀텀 키 교환 알고리즘을 지원하는 `rustls`를 사용한 `aws-lc-rs`를 기반으로 합니다. `X25519MLKEM768`을 우선순위가 가장 높은 알고리즘으로 만들려면 `rustls` 패키지를 크레이트에 추가하고 `prefer-post-quantum` 기능 플래그를 활성화해야 합니다. 그렇지 않으면 사용은 가능하지만 우선 순위가 가장 높지는 않습니다. 자세한 내용은 `rustls` [설명서를](https://docs.rs/rustls/0.23.23/rustls/manual/_05_defaults/index.html#about-the-post-quantum-secure-key-exchange-x25519mlkem768) 참조하세요.

**참고**  
이는 향후 릴리스에서 기본값이 됩니다.

## DNS 해석기 재정의
<a name="overrideDns"></a>

 HTTP 클라이언트를 수동으로 구성하여 기본 DNS 해석기를 재정의할 수 있습니다.

예제 코드를 컴파일하려면 다음 명령을 실행하여 프로젝트에 종속성을 추가합니다.

```
cargo add aws-smithy-http-client -F rustls-aws-lc
cargo add aws-smithy-runtime-api -F client
```

다음 예제 코드는 DNS 해석기를 재정의합니다.

```
use aws_smithy_http_client::{
    tls::{self, rustls_provider::CryptoMode},
    Builder
};
use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns};
use std::net::{IpAddr, Ipv4Addr};

/// A DNS resolver that returns a static IP address (127.0.0.1)
#[derive(Debug, Clone)]
struct StaticResolver;

impl ResolveDns for StaticResolver {
    fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> {
        DnsFuture::ready(Ok(vec![IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))]))
    }
}

#[tokio::main]
async fn main() {
    let http_client = Builder::new()
        .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLc))
        .build_with_resolver(StaticResolver);
    
    let sdk_config = aws_config::defaults(
        aws_config::BehaviorVersion::latest()
    )
    .http_client(http_client)
    .load()
    .await;
    
    // create client(s) using sdk_config
    // e.g. aws_sdk_s3::Client::new(&sdk_config);
}
```

**참고**  
기본적으로 Amazon Linux 2023(AL2023)은 운영 체제 수준에서 DNS를 캐싱하지 않습니다.

## 루트 CA 인증서 사용자 지정
<a name="customizeCertificatesTls"></a>

기본적으로 TLS 공급자는 지정된 플랫폼에 대한 시스템 네이티브 루트 인증서를 로드합니다. 사용자 지정 CA 번들을 로드하도록 이 동작을 사용자 지정하려면 자체 `TrustStore`로 `TlsContext`를 구성할 수 있습니다.

예제 코드를 컴파일하려면 다음 명령을 실행하여 프로젝트에 종속성을 추가합니다.

```
cargo add aws-smithy-http-client -F rustls-aws-lc
```

다음 예제에서는 `rustls`를 `aws-lc`와 함께 사용하지만 지원되는 모든 TLS 공급자에 대해 작동합니다.

```
use aws_smithy_http_client::{
    tls::{self, rustls_provider::CryptoMode},
    Builder
};
use std::fs;

/// read the PEM encoded root CA (bundle) and return a custom TLS context
fn tls_context_from_pem(filename: &str) -> tls::TlsContext {
    let pem_contents = fs::read(filename).unwrap();
    
    // Create a new empty trust store (this will not load platform native certificates)
    let trust_store = tls::TrustStore::empty()
        .with_pem_certificate(pem_contents.as_slice());
        
    tls::TlsContext::builder()
        .with_trust_store(trust_store)
        .build()
        .expect("valid TLS config")
}

#[tokio::main]
async fn main() {
    let http_client = Builder::new()
        .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLc))
        .tls_context(tls_context_from_pem("my-custom-ca.pem"))
        .build_https();
    
    let sdk_config = aws_config::defaults(
        aws_config::BehaviorVersion::latest()
    )
    .http_client(http_client)
    .load()
    .await;
    
    // create client(s) using sdk_config
    // e.g. aws_sdk_s3::Client::new(&sdk_config);
}
```