

# 함수 용도 결정
<a name="function-code-choose-purpose"></a>

함수 코드를 작성하기 전에 함수의 용도를 결정합니다. CloudFront 함수의 대부분의 함수는 다음 용도 중 하나를 가지고 있습니다.

**Topics**
+ [뷰어 요청 이벤트 유형의 HTTP 요청 수정](#function-code-modify-request)
+ [뷰어 요청 이벤트 유형에 HTTP 응답 생성](#function-code-generate-response)
+ [뷰어 응답 이벤트 유형의 HTTP 응답 수정](#function-code-modify-response)
+ [연결 요청 이벤트 유형에서 mTLS 연결 검증](#function-code-connection-request)
+ [관련 정보](#related-information-cloudfront-functions-purpose)

함수의 용도에 관계없이 `handler`은(는) 모든 함수의 진입점입니다. CloudFront에 의해 함수에 전달되는 `event`(이)라고 하는 단일 인수가 필요합니다. `event`은(는) HTTP 요청(그리고 함수가 HTTP 응답을 수정하는 경우 응답)의 표현을 포함하는 JSON 객체입니다.

## 뷰어 요청 이벤트 유형의 HTTP 요청 수정
<a name="function-code-modify-request"></a>

함수는 CloudFront가 최종 사용자(클라이언트)로부터 수신하는 HTTP 요청을 수정하고 수정된 요청을 CloudFront로 반환하여 처리를 계속할 수 있습니다. 예를 들어 함수 코드가 [캐시 키](understanding-the-cache-key.md)를 정규화하거나 요청 헤더를 수정할 수 있습니다.

HTTP 요청을 수정하는 함수를 만들고 게시한 후 *뷰어 요청* 이벤트 유형 연결을 추가해야 합니다. 자세한 내용은 [함수 생성](functions-tutorial.md#functions-tutorial-create) 섹션을 참조하세요. 즉, 요청된 객체가 CloudFront 캐시에 있는지 여부를 확인하기 위해 점검하기 전에 CloudFront가 뷰어의 요청을 수신할 때마다 함수가 실행됩니다.

**Example 예제**  
다음 유사 코드는 HTTP 요청을 수정하는 함수의 구조를 보여줍니다.  

```
function handler(event) {
    var request = event.request;

    // Modify the request object here.

    return request;
}
```
이 함수는 수정된 `request` 객체를 CloudFront로 반환합니다. CloudFront는 CloudFront 캐시에서 캐시 적중률을 확인하고 필요한 경우 오리진에 요청을 전송하여 반환된 요청을 계속 처리합니다.

## 뷰어 요청 이벤트 유형에 HTTP 응답 생성
<a name="function-code-generate-response"></a>

함수는 CloudFront에서 캐시된 응답이나 추가 처리를 확인하지 않고 엣지에서 HTTP 응답을 생성하여 최종 사용자(클라이언트)에게 직접 반환할 수 있습니다. 예를 들어 함수 코드는 요청을 새 URL로 리디렉션하거나 권한 부여를 확인하고 권한 없는 요청에 `401` 또는 `403` 응답을 반환할 수 있습니다.

HTTP 응답을 생성하는 함수를 생성할 때는 *최종 사용자 요청* 이벤트 유형을 선택해야 합니다. 즉, CloudFront가 추가 요청을 처리하기 전에 CloudFront가 최종 사용자의 요청을 수신할 때마다 함수가 실행됩니다.

**Example 예제**  
다음 유사 코드는 HTTP 응답을 생성하는 함수의 구조를 보여줍니다.  

```
function handler(event) {
    var request = event.request;

    var response = ...; // Create the response object here,
                        // using the request properties if needed.

    return response;
}
```
이 함수는 CloudFront에 `response` 객체를 반환하며, CloudFront는 CloudFront 캐시를 확인하거나 오리진에 요청을 보내지 않고 즉시 최종 사용자에게 반환합니다.

## 뷰어 응답 이벤트 유형의 HTTP 응답 수정
<a name="function-code-modify-response"></a>

CloudFront가 HTTP 응답을 최종 사용자(클라이언트)에게 전송하기 전에 함수는 HTTP 응답을 수정할 수 있습니다. 응답이 CloudFront 캐시에서 왔는지 오리진에서 왔는지는 관계없습니다. 예를 들어 함수 코드에서 응답 헤더, 상태 코드 및 본문 콘텐츠를 추가하거나 수정할 수 있습니다.

HTTP 응답을 수정하는 함수를 생성할 때는 *최종 사용자 응답* 이벤트 유형을 선택해야 합니다. 즉, 응답이 CloudFront 캐시에서 왔는지 오리진에서 왔는지 관계없이 CloudFront가 최종 사용자에게 응답을 반환하기 전에 함수가 실행됩니다.

**Example 예제**  
다음 유사 코드는 HTTP 응답을 수정하는 함수의 구조를 보여줍니다.  

```
function handler(event) {
    var request = event.request;
    var response = event.response;

    // Modify the response object here,
    // using the request properties if needed.

    return response;
}
```
이 함수는 수정된 `response` 객체를 CloudFront로 반환하며 CloudFront는 즉시 최종 사용자에게 반환합니다.

## 연결 요청 이벤트 유형에서 mTLS 연결 검증
<a name="function-code-connection-request"></a>

연결 함수는 사용자 지정 검증 및 인증 로직을 제공하기 위해 TLS 연결 중에 실행되는 CloudFront Functions의 한 유형입니다. 연결 함수는 현재 상호 TLS(mTLS) 연결에 사용할 수 있으며, 여기서 클라이언트 인증서를 검증하고 표준 인증서 검증을 넘어 사용자 지정 인증 로직을 구현할 수 있습니다. 연결 함수는 TLS 핸드셰이크 프로세스 중에 실행되며 인증서 속성, 클라이언트 IP 주소 또는 기타 기준에 따라 연결을 허용하거나 거부할 수 있습니다.

연결 함수를 생성하고 게시한 후에는 mTLS 지원 배포에 *연결 요청* 이벤트 유형에 대한 연결을 추가해야 합니다. 이렇게 하면 클라이언트가 CloudFront와 mTLS 연결을 설정하려고 할 때마다 함수가 실행됩니다.

**Example**  
다음 의사 코드는 연결 함수의 구조를 보여줍니다.  

```
function connectionHandler(connection) {
    // Validate certificate and connection properties here.
    
    if (/* validation passes */) {
        connection.allow();
    } else {
        connection.deny();
    }
}
```
함수는 헬퍼 메서드를 사용하여 연결을 허용할지 거부할지를 결정합니다. 뷰어 요청 및 뷰어 응답 함수와 달리 연결 함수는 HTTP 요청 또는 응답을 수정할 수 없습니다.

## 관련 정보
<a name="related-information-cloudfront-functions-purpose"></a>

CloudFront Functions 작업에 대한 자세한 내용은 다음 주제를 참조하세요.
+ [이벤트 구조](functions-event-structure.md)
+ [JavaScript 런타임 기능](functions-javascript-runtime-features.md)
+ [CloudFront Functions 예제 ](service_code_examples_cloudfront_functions_examples.md)
+ [엣지 함수에 대한 제한 사항](edge-functions-restrictions.md)