

# 연결 로그를 사용한 관찰성
<a name="connection-logs"></a>

CloudFront 연결 로그는 상호 TLS 인증 이벤트에 대한 자세한 가시성을 제공하므로 인증서 검증을 모니터링하고, 연결 시도를 추적하고, 인증 문제를 해결할 수 있습니다.

## 연결 로그란 무엇인가요?
<a name="what-are-connection-logs"></a>

연결 로그는 상호 TLS 지원 배포의 TLS 핸드셰이크 및 인증서 검증에 대한 자세한 정보를 캡처합니다. HTTP 요청 정보를 기록하는 표준 액세스 로그와 달리 연결 로그는 특히 다음을 포함한 TLS 연결 설정 단계에 중점을 둡니다.
+ 연결 상태(성공/실패)
+ 클라이언트 인증서 세부 정보
+ TLS 프로토콜 및 암호 정보
+ 연결 타이밍 지표
+ 연결 함수의 사용자 지정 데이터

이러한 로그는 인증서 기반 인증 이벤트에 대한 포괄적인 가시성을 제공하여 보안을 모니터링하고 문제를 해결하며 규정 준수 요구 사항을 충족하는 데 도움이 됩니다.

## 연결 로그 활성화
<a name="enable-connection-logs"></a>

연결 로그는 상호 TLS 인증이 활성화된 배포에만 사용할 수 있습니다. CloudWatch Logs, Amazon Data Firehose 및 Amazon S3를 비롯한 여러 대상으로 연결 로그를 전송할 수 있습니다.

### 사전 조건
<a name="connection-logs-prerequisites"></a>

연결 로그를 활성화하기 전에:
+ CloudFront 배포에 대한 상호 TLS 구성
+ CloudFront 배포에 대한 연결 로그 활성화
+ 선택한 로깅 대상에 필요한 권한이 있는지 확인합니다.
+ 교차 계정 전송의 경우 적절한 IAM 정책을 구성합니다.

### 연결 로그를 활성화하려면(콘솔)
<a name="enable-connection-logs-console"></a>

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

1. 배포 목록에서 mTLS 지원 배포를 선택합니다.

1. **Logging**(로깅) 탭을 선택합니다.

1. **추가**를 선택합니다.

1. 로그를 수신할 서비스를 선택합니다.
   + **CloudWatch 로그**
   + **Firehose** – 
   + **Amazon S3**

1. **대상**에서 선택한 서비스의 리소스를 선택합니다.
   + CloudWatch Logs에서 **로그 그룹 이름**을 입력합니다.
   + Firehose의 경우 **Firehose 전송 스트림**을 선택합니다.
   + Amazon S3의 경우 **버킷 이름**을 입력합니다(접두사 포함은 선택 사항).

1. (선택 사항) 추가 설정 구성:
   + **필드 선택:** 포함할 특정 로그 필드를 선택합니다.
   + **출력 형식:** JSON, 일반, w3c, 원시 또는 Parquet(S3만 해당) 중에서 선택합니다.
   + **필드 구분 기호:** 로그 필드를 구분하는 방법을 지정합니다.

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

### 연결 로그를 활성화하려면(AWS CLI)
<a name="enable-connection-logs-cli"></a>

다음 예제에서는 CloudWatch API를 사용하여 연결 로그를 활성화하는 방법을 보여줍니다.

```
# Step 1: Create a delivery source
aws logs put-delivery-source \
  --name "cf-mtls-connection-logs" \
  --resource-arn "arn:aws:cloudfront::123456789012:distribution/E1A2B3C4D5E6F7" \
  --log-type CONNECTION_LOGS

# Step 2: Create a delivery destination
aws logs put-delivery-destination \
  --name "s3-destination" \
  --delivery-destination-configuration \
  "destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket1"

# Step 3: Create the delivery
aws logs create-delivery \
  --delivery-source-name "cf-mtls-connection-logs" \
  --delivery-destination-arn "arn:aws:logs:us-east-1:123456789012:delivery-destination:s3-destination"
```

**참고**  
CloudWatch API를 사용하는 경우 로그를 다른 리전으로 전송할 때도 미국 동부(버지니아 북부) 리전(us-east-1)을 지정해야 합니다.

## 연결 로그 필드
<a name="connection-log-fields"></a>

연결 로그에는 각 TLS 연결 시도에 대한 세부 정보가 포함됩니다.


| 필드 | 설명 | 예제 | 
| --- | --- | --- | 
| eventTimestamp | 연결이 설정되거나 실패한 경우 ISO 8601 타임스탬프 | 1731620046814 | 
| connectionId | TLS 연결의 고유 식별자 | oLHiEKbQSn8lkvJfA3D4gFowK3\$1iZ0g4i5nMUjE1Akod8TuAzn5nzg== | 
| connectionStatus |  mTLS 연결 시도의 상태입니다.  | Success 또는 Failed | 
| clientIp | 연결 클라이언트의 IP 주소 | 2001:0db8:85a3:0000:0000:8a2e:0370:7334 | 
| clientPort | 클라이언트에서 사용하는 포트 | 12137 | 
| serverIp | CloudFront 엣지 서버의 IP 주소 | 99.84.71.136 | 
| distributionId | CloudFront 배포 ID | E2DX1SLDPK0123 | 
| distributionTenantId | CloudFront 배포 테넌트 ID(해당하는 경우) | dt\$12te1Ura9X3R2iCGNjW123 | 
| tlsProtocol | 사용된 TLS 프로토콜 버전 | TLSv1.3 | 
| tlsCipher | 연결에 사용되는 TLS 암호 제품군 | TLS\$1AES\$1128\$1GCM\$1SHA256 | 
| tlsHandshakeDuration | TLS 핸드셰이크 기간(밀리초) | 153 | 
| tlsSni | TLS 핸드셰이크의 서버 이름 표시 값 | d111111abcdef8.cloudfront.net | 
| clientLeafCertSerialNumber | 클라이언트 인증서의 일련 번호 | 00:b1:43:ed:93:d2:d8:f3:9d | 
| clientLeafCertSubject | 클라이언트 인증서의 제목 필드 | C=US, ST=WA, L=Seattle, O=Amazon.com, OU=CloudFront, CN=client.test.mtls.net | 
| clientLeafCertIssuer | 클라이언트 인증서의 발급자 필드 | C=US, ST=WA, L=Seattle, O=Amazon.com, OU=CloudFront, CN=test.mtls.net | 
| clientLeafCertValidity | 클라이언트 인증서의 유효 기간 | NotBefore=2025-06-05T23:28:21Z;NotAfter=2125-05-12T23:28:21Z | 
| connectionLogCustomData | 연결 함수를 통해 추가된 사용자 지정 데이터 | REVOKED:00:b1:43:ed:93:d2:d8:f3:9d | 

## 연결 오류 코드
<a name="connection-error-codes"></a>

```
Failed:ClientCertMaxChainDepthExceeded
Failed:ClientCertMaxSizeExceeded
Failed:ClientCertUntrusted
Failed:ClientCertNotYetValid
Failed:ClientCertExpired
Failed:ClientCertTypeUnsupported
Failed:ClientCertInvalid
Failed:ClientCertIntentInvalid
Failed:ClientCertRejected
Failed:ClientCertMissing
Failed:TcpError
Failed:TcpTimeout
Failed:ConnectionFunctionError
Failed:ConnectionFunctionDenied
Failed:Internal
Failed:UnmappedConnectionError
```

연결이 실패하면 CloudFront는 특정 사유 코드를 기록합니다.


| 코드 | 설명 | 
| --- | --- | 
| ClientCertMaxChainDepthExceeded | 최대 인증서 체인 깊이 초과 | 
| ClientCertMaxSizeExceeded | 최대 인증서 크기 초과 | 
| ClientCertUntrusted | 클라이언트 인증서를 신뢰할 수 없음 | 
| ClientCertNotYetValid | 인증서가 아직 유효하지 않음 | 
| ClientCertExpired | 인증서가 만료됨 | 
| ClientCertTypeUnsupported | 클라이언트 인증서 유형이 지원되지 않음 | 
| ClientCertInvalid | 인증서가 잘못됨 | 
| ClientCertIntentInvalid | 인증서 의도가 잘못됨 | 
| ClientCertRejected | 사용자 지정 검증에서 거부된 인증서 | 
| ClientCertMissing | 인증서 누락 | 
| TcpError |  연결을 설정하는 동안 오류 발생  | 
| TcpTimeout |  제한 시간 내에 연결을 설정할 수 없음  | 
| ConnectionFunctionError |  연결 함수 실행 중에 발견되지 않은 예외 발생  | 
| 내부 |  내부 서비스 오류 발생  | 
| UnmappedConnectionError |  다른 범주에 속하지 않는 오류 발생  | 