

# CloudFront 배포에 상호 TLS 활성화
<a name="enable-mtls-distributions"></a>

## 사전 조건 및 요구 사항
<a name="mtls-prerequisites-requirements"></a>

CloudFront의 상호 TLS 확인 모드에서는 모든 클라이언트가 TLS 핸드셰이크 중에 유효한 인증서를 제시하고 유효한 인증서가 없는 연결을 거부해야 합니다. CloudFront 배포에서 상호 TLS를 활성화하기 전에 다음을 확인해야 합니다.
+ 인증 기관 인증서로 트러스트 스토어를 생성함
+ 트러스트 스토어가 CloudFront 배포와 연결됨
+ 모든 배포 캐시 동작이 HTTPS 전용 뷰어 프로토콜 정책을 사용함
+ 배포에서 HTTP/2를 사용하고 있음(기본 설정, HTTP/3에서는 뷰어 mTLS가 지원되지 않음)

**참고**  
상호 TLS 인증에는 뷰어와 CloudFront 간의 HTTPS 연결이 필요합니다. HTTP 연결을 지원하는 캐시 동작이 있는 배포에서는 mTLS를 활성화할 수 없습니다.

## 상호 TLS 활성화(콘솔)
<a name="enable-mtls-console"></a>

### 새 배포의 경우
<a name="enable-mtls-new-distributions"></a>

CloudFront 콘솔에서 새 배포를 생성하는 과정에서는 뷰어 mTLS를 구성할 수 없습니다. 먼저 모든 방법(콘솔, CLI, API)으로 배포를 생성한 다음 배포 설정을 편집하여 아래 기존 배포 지침에 따라 뷰어 mTLS를 활성화합니다.

### 기존 배포의 경우
<a name="enable-mtls-existing-distributions"></a>

1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

1. 배포 목록에서 수정하려는 배포를 선택합니다.

1. 모든 캐시 동작의 뷰어 프로토콜 정책을 **HTTP를 HTTPS로 리디렉션** 또는 **HTTPS 전용**으로 설정해야 합니다. (**캐시 동작** 탭을 선택하여 HTTP 프로토콜 정책으로 캐시 동작을 보고 업데이트할 수 있습니다.)

1. **일반** 탭을 선택합니다.

1. **설정** 섹션에서 **편집**을 선택합니다.

1. **연결성** 섹션에서 **뷰어 상호 인증(mTLS)**을 찾습니다.

1. **상호 인증 활성화**를 켜기로 전환합니다.

1. **클라이언트 인증서 검증 모드**에서 **필수**(모든 클라이언트가 인증서를 제시해야 함) 또는 **선택 사항**(클라이언트가 선택적으로 인증서를 제공할 수 있음)을 선택합니다.

1. **트러스트 스토어**에서 이전에 생성한 트러스트 스토어를 선택합니다.

1. (선택 사항) TLS 핸드셰이크 중에 CloudFront가 클라이언트에 CA 이름을 보내도록 하려면 **트러스트 스토어 CA 이름 알리기**를 전환합니다.

1. (선택 사항) 만료된 인증서와의 연결을 허용하려면 **인증서 만료 날짜 무시**를 전환합니다.

1. **변경 사항 저장**을 선택합니다.

## 상호 TLS 활성화(AWS CLI)
<a name="enable-mtls-cli"></a>

### 새 배포의 경우
<a name="enable-mtls-cli-new"></a>

다음 예제에서는 mTLS 설정을 포함하는 배포 구성 파일(distribution-config.json)을 생성하는 방법을 보여줍니다.

```
{
  "CallerReference": "cli-example-1",
  "Origins": {
    "Quantity": 1,
    "Items": [
      {
        "Id": "my-origin",
        "DomainName": "example.com",
        "CustomOriginConfig": {
          "HTTPPort": 80,
          "HTTPSPort": 443,
          "OriginProtocolPolicy": "https-only"
        }
      }
    ]
  },
  "DefaultCacheBehavior": {
    "TargetOriginId": "my-origin",
    "ViewerProtocolPolicy": "https-only",
    "MinTTL": 0,
    "ForwardedValues": {
      "QueryString": false,
      "Cookies": {
        "Forward": "none"
      }
    }
  },
  "ViewerCertificate": {
    "CloudFrontDefaultCertificate": true
  },
  "ViewerMtlsConfig": {
    "Mode": "required", 
    "TrustStoreConfig": {
        "TrustStoreId": {TRUST_STORE_ID},
        "AdvertiseTrustStoreCaNames": true,
        "IgnoreCertificateExpiry": true
    }
  },
  "Enabled": true
}
```

다음 예제 명령을 사용하여 mTLS가 활성화된 배포를 생성합니다.

```
aws cloudfront create-distribution --distribution-config file://distribution-config.json
```

### 기존 배포의 경우
<a name="enable-mtls-cli-existing"></a>

다음 예제 명령을 사용하여 현재 배포 구성을 가져옵니다.

```
aws cloudfront get-distribution-config --id E1A2B3C4D5E6F7 --output json > dist-config.json
```

파일을 편집하여 mTLS 설정을 추가합니다. 배포 구성에 다음 예제 섹션을 추가합니다.

```
"ViewerMtlsConfig": {
    "Mode": "required", 
    "TrustStoreConfig": {
        "TrustStoreId": {TRUST_STORE_ID},
        "AdvertiseTrustStoreCaNames": true,
        "IgnoreCertificateExpiry": true
    }
}
```

파일에서 ETag 필드를 제거하되 값을 별도로 저장합니다.

다음 예제 명령을 사용하여 배포를 새 구성으로 업데이트합니다.

```
aws cloudfront update-distribution \
    --id E1A2B3C4D5E6F7 \
    --if-match YOUR-ETAG-VALUE \
    --distribution-config file://dist-config.json
```

## 뷰어 프로토콜 정책
<a name="viewer-protocol-policies"></a>

상호 TLS를 사용하는 경우 모든 배포 캐시 동작을 HTTPS 전용 뷰어 프로토콜 정책으로 구성해야 합니다.
+ **HTTP를 HTTPS로 리디렉션** - 인증서 검증을 수행하기 전에 HTTP 요청을 HTTPS로 리디렉션합니다.
+ **HTTPS 전용** - HTTPS 요청만 수락하고 인증서 검증을 수행합니다.

**참고**  
HTTP 연결은 인증서 검증을 수행할 수 없으므로 HTTP 및 HTTPS 뷰어 프로토콜 정책은 상호 TLS에서 지원되지 않습니다.

## 다음 단계
<a name="enable-mtls-next-steps"></a>

CloudFront 배포에서 뷰어 TLS를 활성화한 후 연결 함수를 연결하여 사용자 지정 인증서 검증 로직을 구현할 수 있습니다. 연결 함수를 사용하면 사용자 지정 검증 규칙, 인증서 해지 확인 및 로깅을 통해 기본 제공 mTLS 인증 기능을 확장할 수 있습니다. 연결 함수 생성 및 연결에 대한 자세한 내용은 [CloudFront 연결 함수 연결](connection-functions.md) 섹션을 참조하세요.