

# CloudFront Functions를 위한 JavaScript 런타임 1.0 기능
<a name="functions-javascript-runtime-10"></a>

CloudFront 함수 JavaScript 런타임 환경은 [ECMAScript(ES) 버전 5.1](https://262.ecma-international.org/5.1/)을 준수하며, ES 버전 6에서 9까지의 일부 기능을 지원합니다. 또한 ES 사양의 일부가 아닌 일부 비표준 방법을 제공합니다.

다음 항목에는 지원되는 모든 언어 기능이 나열되어 있습니다.

**Topics**
+ [핵심 기능](#writing-functions-javascript-features-core)
+ [기본 객체](#writing-functions-javascript-features-primitive-objects)
+ [기본 제공 객체](#writing-functions-javascript-features-builtin-objects)
+ [오류 유형](#writing-functions-javascript-features-error-types)
+ [Globals](#writing-functions-javascript-features-globals)
+ [기본 제공 모듈](#writing-functions-javascript-features-builtin-modules)
+ [제한된 기능](#writing-functions-javascript-features-restricted-features)

## 핵심 기능
<a name="writing-functions-javascript-features-core"></a>

ES의 다음과 같은 핵심 기능이 지원됩니다.

**유형**  
모든 ES 5.1 유형이 지원됩니다. 여기에는 부울 값, 숫자, 문자열, 객체, 배열, 함수, 함수 생성자 및 정규 표현식이 포함됩니다.

**연산자**  
모든 ES 5.1 연산자가 지원됩니다.  
ES 7 거듭제곱 연산자(`**`)가 지원됩니다.

**Statement**  
`const` 및 `let` 문은 지원되지 않습니다.
다음 ES 5.1 문이 지원됩니다.  
+ `break`
+ `catch`
+ `continue`
+ `do-while`
+ `else`
+ `finally`
+ `for`
+ `for-in`
+ `if`
+ `return`
+ `switch`
+ `throw`
+ `try`
+ `var`
+ `while`
+ 레이블이 지정된 명령문

**리터럴**  
ES 6 템플릿 리터럴은 여러 줄 문자열, 표현식 보간 및 중첩 템플릿에 대해 지원됩니다..

**함수**  
모든 ES 5.1 함수 기능이 지원됩니다.  
ES 6 화살표 함수가 지원되며 ES 6 나머지 파라미터 구문이 지원됩니다.

**유니코드**  
소스 텍스트 및 문자열 리터럴에는 유니코드로 인코딩된 문자가 포함될 수 있습니다. 6자의 유니코드 코드 포인트 이스케이프 시퀀스(예: `\uXXXX`)도 지원됩니다.

**엄격 모드**  
함수는 기본적으로 엄격 모드에서 작동하므로 함수 코드에 `use strict` 명령문을 추가할 필요가 없습니다. 이것은 변경할 수 없습니다.

## 기본 객체
<a name="writing-functions-javascript-features-primitive-objects"></a>

ES의 다음과 같은 기본 객체가 지원됩니다.

**객체**  
객체에 대해 다음과 같은 ES 5.1 메서드가 지원됩니다.  
+ `create`(속성 목록 제외)
+ `defineProperties`
+ `defineProperty`
+ `freeze`
+ `getOwnPropertyDescriptor`
+ `getOwnPropertyNames`
+ `getPrototypeOf`
+ `hasOwnProperty`
+ `isExtensible`
+ `isFrozen`
+ `prototype.isPrototypeOf`
+ `isSealed`
+ `keys`
+ `preventExtensions`
+ `prototype.propertyIsEnumerable`
+ `seal`
+ `prototype.toString`
+ `prototype.valueOf`
객체에 대해 다음 ES 6 메서드가 지원됩니다.  
+ `assign`
+ `is`
+ `prototype.setPrototypeOf`
객체에 대해 다음과 같은 ES 8 메서드가 지원됩니다.  
+ `entries`
+ `values`

**문자열**  
문자열에 대해 다음 ES 5.1 메서드가 지원됩니다.  
+ `fromCharCode`
+ `prototype.charAt`
+ `prototype.concat`
+ `prototype.indexOf`
+ `prototype.lastIndexOf`
+ `prototype.match`
+ `prototype.replace`
+ `prototype.search`
+ `prototype.slice`
+ `prototype.split`
+ `prototype.substr`
+ `prototype.substring`
+ `prototype.toLowerCase`
+ `prototype.trim`
+ `prototype.toUpperCase`
문자열에 대해 다음 ES 6 메서드가 지원됩니다.  
+ `fromCodePoint`
+ `prototype.codePointAt`
+ `prototype.endsWith`
+ `prototype.includes`
+ `prototype.repeat`
+ `prototype.startsWith`
문자열에 대해 다음 ES 8 메서드가 지원됩니다.  
+ `prototype.padStart`
+ `prototype.padEnd`
문자열에 대해 다음 ES 9 메서드가 지원됩니다.  
+ `prototype.trimStart`
+ `prototype.trimEnd`
문자열에 대해 다음과 같은 비표준 메서드가 지원됩니다.  
+ `prototype.bytesFrom(array | string, encoding)`

  옥텟 배열 또는 인코딩된 문자열에서 바이트 문자열을 만듭니다. 문자열 인코딩 옵션은 `hex`, `base64` 및 `base64url`입니다.
+ `prototype.fromBytes(start[, end])`

  각 바이트가 해당 유니코드 코드 포인트로 대체되는 바이트 문자열에서 유니코드 문자열을 만듭니다.
+ `prototype.fromUTF8(start[, end])`

  UTF-8 인코딩된 바이트 문자열에서 유니코드 문자열을 만듭니다. 인코딩이 올바르지 않으면 `null`이(가) 반환됩니다.
+ `prototype.toBytes(start[, end])`

  유니코드 문자열에서 바이트 문자열을 만듭니다. 모든 문자는 [0,255] 범위에 있어야 합니다. 그렇지 않은 경우 `null`이 반환됩니다.
+ `prototype.toUTF8(start[, end])`

  유니코드 문자열에서 UTF-8 인코딩된 바이트 문자열을 만듭니다.

**번호**  
숫자에 대한 모든 ES 5.1 메서드가 지원됩니다.  
숫자에 대해 다음 ES 6 메서드가 지원됩니다.  
+ `isFinite`
+ `isInteger`
+ `isNaN`
+ `isSafeInteger`
+ `parseFloat`
+ `parseInt`
+ `prototype.toExponential`
+ `prototype.toFixed`
+ `prototype.toPrecision`
+ `EPSILON`
+ `MAX_SAFE_INTEGER`
+ `MAX_VALUE`
+ `MIN_SAFE_INTEGER`
+ `MIN_VALUE`
+ `NEGATIVE_INFINITY`
+ `NaN`
+ `POSITIVE_INFINITY`

## 기본 제공 객체
<a name="writing-functions-javascript-features-builtin-objects"></a>

ES의 다음 내장 객체가 지원됩니다.

**수학 연산**  
모든 ES 5.1 수학 메서드가 지원됩니다.  
CloudFront 함수 런타임 환경에서 `Math.random()` 구현은 함수가 실행될 때의 타임스탬프와 함께 시드된 OpenBSD `arc4random`을(를) 사용합니다.
다음 ES 6 수학 메서드가 지원됩니다.  
+ `acosh`
+ `asinh`
+ `atanh`
+ `cbrt`
+ `clz32`
+ `cosh`
+ `expm1`
+ `fround`
+ `hypot`
+ `imul`
+ `log10`
+ `log1p`
+ `log2`
+ `sign`
+ `sinh`
+ `tanh`
+ `trunc`
+ `E`
+ `LN10`
+ `LN2`
+ `LOG10E`
+ `LOG2E`
+ `PI`
+ `SQRT1_2`
+ `SQRT2`

**날짜**  
모든 ES 5.1 `Date` 기능이 지원됩니다.  
보안상의 이유로 단일 함수 실행의 수명 동안 `Date`은(는) 항상 동일한 값(함수의 시작 시간)을 반환합니다. 자세한 내용은 [제한된 기능](#writing-functions-javascript-features-restricted-features) 단원을 참조하세요.

**함수**  
`apply`, `bind` 및 `call` 메서드가 지원됩니다.  
함수 생성자는 지원되지 않습니다.

**정규식**  
모든 ES 5.1 정규 표현식 기능이 지원됩니다. 정규 표현식 언어는 Perl과 호환됩니다. ES 9 명명된 캡처 그룹이 지원됩니다.

**JSON**  
`parse` 및 `stringify`을(를) 포함하여 모든 ES 5.1 JSON 기능이 지원됩니다.

**배열**  
배열에 대해 다음 ES 5.1 메서드가 지원됩니다.  
+ `isArray`
+ `prototype.concat`
+ `prototype.every`
+ `prototype.filter`
+ `prototype.forEach`
+ `prototype.indexOf`
+ `prototype.join`
+ `prototype.lastIndexOf`
+ `prototype.map`
+ `prototype.pop`
+ `prototype.push`
+ `prototype.reduce`
+ `prototype.reduceRight`
+ `prototype.reverse`
+ `prototype.shift`
+ `prototype.slice`
+ `prototype.some`
+ `prototype.sort`
+ `prototype.splice`
+ `prototype.unshift`
배열에 대해 다음 ES 6 메서드가 지원됩니다.  
+ `of`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.find`
+ `prototype.findIndex`
배열에 대해 다음 ES 7 메서드가 지원됩니다.  
+ `prototype.includes`

**형식화된 배열**  
다음 ES 6 형식화된 배열이 지원됩니다.  
+ `Int8Array`
+ `Uint8Array`
+ `Uint8ClampedArray`
+ `Int16Array`
+ `Uint16Array`
+ `Int32Array`
+ `Uint32Array`
+ `Float32Array`
+ `Float64Array`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.join`
+ `prototype.set`
+ `prototype.slice`
+ `prototype.subarray`
+ `prototype.toString`

**배열 버퍼**  
`ArrayBuffer`에 대해 메서드가 지원됩니다.  
+ `prototype.isView`
+ `prototype.slice`

**Promise**  
Promise에 대해 다음 메서드가 지원됩니다.  
+ `reject`
+ `resolve`
+ `prototype.catch`
+ `prototype.finally`
+ `prototype.then`

**crypto**  
암호화 모듈은 표준 해싱 및 HMAC(해시 기반 메시지 인증 코드) 헬퍼를 제공합니다. `require('crypto')`을(를) 사용하여 모듈을 로드할 수 있습니다. 모듈은 해당 Node.js 대응으로 정확하게 동작하는 다음과 같은 메서드를 노출합니다.  
+ `createHash(algorithm)`
+ `hash.update(data)`
+ `hash.digest([encoding])`
+ `createHmac(algorithm, secret key)`
+ `hmac.update(data)`
+ `hmac.digest([encoding])`
자세한 내용은 기본 제공 모듈 단원의 [암호화(해시 및 HMAC)](#writing-functions-javascript-features-builtin-modules-crypto)를 참조하세요.

**콘솔**  
디버깅을 위한 헬퍼 객체입니다. 로그 메시지를 기록하는 `log()` 메서드만 지원합니다.  
CloudFront 함수는 `console.log('a', 'b')`와 같은 쉼표 구문을 지원하지 않습니다. 대신 `console.log('a' + ' ' + 'b')` 형식을 사용합니다.

## 오류 유형
<a name="writing-functions-javascript-features-error-types"></a>

다음과 같은 오류 객체가 지원됩니다.
+ `Error`
+ `EvalError`
+ `InternalError`
+ `MemoryError`
+ `RangeError`
+ `ReferenceError`
+ `SyntaxError`
+ `TypeError`
+ `URIError`

## Globals
<a name="writing-functions-javascript-features-globals"></a>

`globalThis` 객체가 지원됩니다.

다음 ES 5.1 전역 함수가 지원됩니다.
+ `decodeURI`
+ `decodeURIComponent`
+ `encodeURI`
+ `encodeURIComponent`
+ `isFinite`
+ `isNaN`
+ `parseFloat`
+ `parseInt`

다음과 같은 글로벌 제약이 지원됩니다.
+ `NaN`
+ `Infinity`
+ `undefined`

## 기본 제공 모듈
<a name="writing-functions-javascript-features-builtin-modules"></a>

다음 기본 제공 모듈이 지원됩니다.

**Topics**
+ [암호화(해시 및 HMAC)](#writing-functions-javascript-features-builtin-modules-crypto)
+ [쿼리 문자열](#writing-functions-javascript-features-builtin-modules-query-string)

### 암호화(해시 및 HMAC)
<a name="writing-functions-javascript-features-builtin-modules-crypto"></a>

암호화 모듈(`crypto`)은 표준 해싱 및 HMAC(해시 기반 메시지 인증 코드) 헬퍼를 제공합니다. `require('crypto')`을(를) 사용하여 모듈을 로드할 수 있습니다. 이 모듈은 Node.js 대응물과 정확히 동일하게 동작하는 다음과 같은 메서드를 제공합니다.

**해싱 메서드**

`crypto.createHash(algorithm)`  
지정된 알고리즘(`md5`, `sha1` 또는 `sha256`)을 사용하여 해시 다이제스트를 생성하는 데 사용할 수 있는 해시 객체를 생성하고 반환합니다.

`hash.update(data)`  
지정된 `data`(으)로 해시 콘텐츠를 업데이트합니다.

`hash.digest([encoding])`  
`hash.update()`을(를) 사용하여 전달된 모든 데이터의 다이제스트를 계산합니다. 인코딩은 `hex`, `base64` 또는 `base64url`일 수 있습니다.

**HMAC 메서드**

`crypto.createHmac(algorithm, secret key)`  
지정된 `algorithm` 및 `secret key`을(를) 사용하는 HMAC 객체를 생성 및 반환합니다. 알고리즘은 `md5`, `sha1` 또는 `sha256`일 수 있습니다.

`hmac.update(data)`  
지정된 `data`(으)로 HMAC 콘텐츠를 업데이트합니다.

`hmac.digest([encoding])`  
`hmac.update()`을(를) 사용하여 전달된 모든 데이터의 다이제스트를 계산합니다. 인코딩은 `hex`, `base64` 또는 `base64url`일 수 있습니다.

### 쿼리 문자열
<a name="writing-functions-javascript-features-builtin-modules-query-string"></a>

**참고**  
[CloudFront 함수 이벤트 객체](functions-event-structure.md)는 URL 쿼리 문자열을 자동으로 구문 분석합니다. 즉, 대부분의 경우 이 모듈을 사용할 필요가 없습니다.

쿼리 문자열 모듈(`querystring`)은 URL 쿼리 문자열을 구문 분석하고 서식을 지정하는 메서드를 제공합니다. `require('querystring')`을 사용하여 모듈을 로드할 수 있습니다. 이 모듈은 다음과 같은 방법을 제공합니다.

`querystring.escape(string)`  
지정된 `string`을 URL-인코딩하여 이스케이프된 쿼리 문자열을 반환합니다. 이 방법은 `querystring.stringify()`에서 사용되며 직접 사용해서는 안 됩니다.

`querystring.parse(string[, separator[, equal[, options]]])`  
쿼리 문자열(`string`)을 구문 분석하고 객체를 반환합니다.  
`separator` 파라미터는 쿼리 문자열에서 키와 값 페어를 구분하기 위한 하위 문자열입니다. 기본 설정은 `&`입니다.  
`equal` 파라미터는 쿼리 문자열에서 키와 값을 구분하기 위한 하위 문자열입니다. 기본 설정은 `=`입니다.  
`options` 파라미터는 다음 키를 가진 객체입니다.    
`decodeURIComponent function`  
쿼리 문자열에서 백분율로 인코딩된 문자를 디코딩하는 함수입니다. 기본 설정은 `querystring.unescape()`입니다.  
`maxKeys number`  
구문 분석할 최대 키 수입니다. 기본 설정은 `1000`입니다. `0` 값을 사용하여 키 카운트 제한을 제거합니다.
기본적으로 쿼리 문자열 내의 백분율로 인코딩된 문자는 UTF-8 인코딩을 사용하는 것으로 간주됩니다. 잘못된 UTF-8 시퀀스는 `U+FFFD` 대체 문자로 대체됩니다.  
예를 들어 다음 쿼리 문자열의 경우:  

```
'name=value&abc=xyz&abc=123'
```
`querystring.parse()`의 반환 값:  

```
{
name: 'value',
abc: ['xyz', '123']
}
```
`querystring.decode()`는 `querystring.parse()`의 별칭입니다.

`querystring.stringify(object[, separator[, equal[, options]]])`  
`object`를 직렬화하고 쿼리 문자열을 반환합니다.  
`separator` 파라미터는 쿼리 문자열에서 키와 값 쌍을 구분하기 위한 하위 문자열입니다. 기본 설정은 `&`입니다.  
`equal` 파라미터는 쿼리 문자열에서 키와 값을 구분하기 위한 하위 문자열입니다. 기본 설정은 `=`입니다.  
`options` 파라미터는 다음 키를 가진 객체입니다.    
`encodeURIComponent function`  
URL에 안전하지 않은 문자를 쿼리 문자열에서 백분율 인코딩으로 변환하는 데 사용할 함수입니다. 기본 설정은 `querystring.escape()`입니다.
기본적으로 쿼리 문자열 내에서 백분율 인코딩이 필요한 문자는 UTF-8로 인코딩됩니다. 다른 인코딩을 사용하려면 `encodeURIComponent` 옵션을 지정합니다.  
예를 들어, 다음 코드의 경우:  

```
querystring.stringify({ name: 'value', abc: ['xyz', '123'], anotherName: '' });
```
반환 값:  

```
'name=value&abc=xyz&abc=123&anotherName='
```
`querystring.encode()`는 `querystring.stringify()`의 별칭입니다.

`querystring.unescape(string)`  
지정된 `string`의 URL 백분율로 인코딩된 문자를 디코딩하여 이스케이프되지 않은 쿼리 문자열을 반환합니다. 이 방법은 `querystring.parse()`에서 사용되며 직접 사용해서는 안 됩니다.

## 제한된 기능
<a name="writing-functions-javascript-features-restricted-features"></a>

다음 JavaScript 언어 기능은 보안 문제로 인해 지원되지 않거나 제한됩니다.

**동적 코드 평가**  
동적 코드 평가는 지원되지 않습니다. 시도하면 `eval()` 및 `Function` 생성자 모두 오류가 발생합니다. 예를 들어 `const sum = new Function('a', 'b', 'return a + b')`에서 오류가 발생합니다.

**타이머**  
`setTimeout()`, `setImmediate()` 및 `clearTimeout()` 함수는 지원되지 않습니다. 함수 실행 내에서 연기하거나 출력할 프로비전이 없습니다. 함수가 완료되려면 동기적으로 실행되어야 합니다.

**날짜 및 타임스탬프**  
보안상의 이유로 고해상도 타이머에 액세스할 수 없습니다. 현재 시간을 쿼리하는 모든 `Date` 메서드는 단일 함수 실행의 수명 동안 항상 동일한 값을 반환합니다. 반환된 타임 스탬프는 함수가 실행을 시작한 시간입니다. 따라서 함수에서 경과 시간을 측정할 수 없습니다.

**파일 시스템 액세스**  
파일 시스템 액세스가 없습니다. 예를 들어 Node.js에서처럼 파일 시스템 액세스를 위한 `fs` 모듈이 없습니다.

**프로세스 액세스**  
프로세스 액세스가 없습니다. 예를 들어 Node.js와는 달리 정보 액세스를 처리하기 위한 `process` 글로벌 객체가 없습니다.

**환경 변수**  
환경 변수에 액세스할 수 없습니다.  
대신 CloudFront KeyValueStore를 사용하여 CloudFront Functions에 대한 키 값 페어의 중앙 집중식 데이터 스토어를 생성할 수 있습니다. CloudFront KeyValueStore를 사용하면 코드 변경 사항을 배포할 필요 없이 구성 데이터를 동적으로 업데이트할 수 있습니다. CloudFront KeyValueStore를 사용하려면 [JavaScript 런타임 2.0](functions-javascript-runtime-20.md)을 사용해야 합니다. 자세한 내용은 [Amazon CloudFront KeyValueStore](kvs-with-functions.md) 섹션을 참조하세요.

**네트워크 액세스**  
네트워크 통화에 대한 지원이 없습니다. 예를 들어 XHR, HTTP(S) 및 소켓은 지원되지 않습니다.