

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

# AWS Encryption SDK for JavaScript
<a name="javascript"></a>

 AWS Encryption SDK for JavaScript 는 JavaScript로 웹 브라우저 애플리케이션을 작성하거나 Node.js로 웹 서버 애플리케이션을 작성하는 개발자를 위한 클라이언트 측 암호화 라이브러리를 제공하도록 설계되었습니다.

의 모든 구현과 마찬가지로 AWS Encryption SDK는 고급 데이터 보호 기능을 AWS Encryption SDK for JavaScript 제공합니다. 이러한 기능에는 [봉투 암호화](concepts.md#envelope-encryption), 추가 인증 데이터(AAD), 안전하고 인증된 대칭 키 [알고리즘 제품군](concepts.md#crypto-algorithm)(예: 키 유도 및 서명을 사용하는 256비트 AES-GCM)이 포함됩니다.

의 모든 언어별 구현 AWS Encryption SDK 은 언어의 제약 조건에 따라 상호 운용 가능하도록 설계되었습니다. JavaScript의 언어 제약에 대한 자세한 내용은 [의 호환성 AWS Encryption SDK for JavaScript](javascript-compatibility.md) 섹션을 참조하세요.

**자세히 알아보기**
+ 를 사용한 프로그래밍에 대한 자세한 내용은 GitHub의 [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 리포지토리를 AWS Encryption SDK for JavaScript참조하세요.
+ 프로그래밍 예제는 [AWS Encryption SDK for JavaScript 예제](js-examples.md) 문서와, [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 리포지토리의 [example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser) 및 [example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) 모듈을 참조하세요.
+  를 사용하여 웹 애플리케이션에서 데이터를 AWS Encryption SDK for JavaScript 암호화하는 실제 예제는 AWS 보안 블로그의 [AWS Encryption SDK for JavaScript 및 Node.js를 사용하여 브라우저에서 암호화를 활성화하는 방법을](https://aws.amazon.com/blogs/security/how-to-enable-encryption-browser-aws-encryption-sdk-javascript-node-js/) 참조하세요.

**Topics**
+ [호환성](javascript-compatibility.md)
+ [설치](javascript-installation.md)
+ [모듈](javascript-modules.md)
+ [예제](js-examples.md)

# 의 호환성 AWS Encryption SDK for JavaScript
<a name="javascript-compatibility"></a>

 AWS Encryption SDK for JavaScript 는의 다른 언어 구현과 상호 운용 가능하도록 설계되었습니다 AWS Encryption SDK. 대부분의 경우를 사용하여 데이터를 암호화 AWS Encryption SDK for JavaScript 하고 [AWS Encryption SDK 명령줄 인터페이스를](crypto-cli.md) 포함한 다른 언어 구현으로 데이터를 해독할 수 있습니다. 또한를 사용하여의 다른 언어 구현에서 생성된 [암호화된 메시지를](concepts.md#message) 복호화 AWS Encryption SDK for JavaScript 할 수 있습니다 AWS Encryption SDK.

그러나를 사용할 때는 JavaScript 언어 구현 및 웹 브라우저에서 몇 가지 호환성 문제를 알고 AWS Encryption SDK for JavaScript있어야 합니다.

또한 다른 언어 구현을 사용할 때는 호환 가능한 마스터 키 공급자, 마스터 키 및 키링을 구성해야 합니다. 자세한 내용은 [키링 호환성](choose-keyring.md#keyring-compatibility)을 참조하세요.

## AWS Encryption SDK for JavaScript 호환성
<a name="javascript-language-compatibility"></a>

의 JavaScript 구현은 다음과 같은 점에서 다른 언어 구현과 AWS Encryption SDK 다릅니다.
+ 의 암호화 작업은 프레임 처리되지 않은 사이퍼텍스트를 반환하지 AWS Encryption SDK for JavaScript 않습니다. 그러나 AWS Encryption SDK for JavaScript 는의 다른 언어 구현에서 반환된 프레임 처리된 사이퍼텍스트와 프레임 처리되지 않은 사이퍼텍스트를 해독합니다 AWS Encryption SDK.
+ Node.js 버전 12.9.0 이상 Node.js는 다음 RSA 키 래핑 옵션을 지원합니다.
  + OAEP와 SHA1, SHA256, SHA384 또는 SHA512
  + OAEP와 SHA1 및 MGF1과 SHA1
  + PKCS1v15
+ 버전 12.9.0 이전의 Node.js는 다음 RSA 키 래핑 옵션만 지원합니다.
  + OAEP와 SHA1 및 MGF1과 SHA1
  + PKCS1v15

## 브라우저 호환성
<a name="javascript-browser-compatibility"></a>

일부 웹 브라우저는 AWS Encryption SDK for JavaScript 에 필요한 기본 암호화 작업을 지원하지 않습니다. 브라우저에서 구현하는 WebCrypto API에 대한 폴백을 구성하여 일부 누락된 작업을 보완할 수 있습니다.

**웹 브라우저 제한 사항**

다음 제한 사항은 모든 웹 브라우저에 공통적으로 적용됩니다.
+ WebCrypto API는 PKCS1v15 키 래핑을 지원하지 않습니다.
+ 브라우저는 192비트 키를 지원하지 않습니다.

**필요한 암호화 작업**

를 사용하려면 웹 브라우저에서 다음 작업이 AWS Encryption SDK for JavaScript 필요합니다. 브라우저가 이러한 작업을 지원하지 않는 경우, AWS Encryption SDK for JavaScript와 호환되지 않습니다.
+ 브라우저는 암호화 방식으로 임의의 값을 생성하는 메서드인 `crypto.getRandomValues()`를 포함해야 합니다. `crypto.getRandomValues()`를 지원하는 웹 브라우저 버전에 대한 자세한 내용은 [crypto.getRandomValues()를 사용할 수 있나요?](https://caniuse.com/#feat=getrandomvalues)를 참조하세요.

**필요한 폴백**

에는 웹 브라우저에서 다음과 같은 라이브러리 및 작업이 AWS Encryption SDK for JavaScript 필요합니다. 이러한 요구 사항을 충족하지 않는 웹 브라우저를 지원하는 경우 폴백을 구성해야 합니다. 그렇지 않으면 브라우저 AWS Encryption SDK for JavaScript 에서를 사용하려는 시도가 실패합니다.
+ 웹 애플리케이션에서 기본 암호화 작업을 수행하는 WebCrypto API는 일부 브라우저에서 사용할 수 없습니다. 웹 암호화를 지원하는 웹 브라우저 버전에 대한 자세한 내용은 [웹 암호화를 사용할 수 있나요?](https://caniuse.com/#feat=cryptography)를 참조하세요.
+ 최신 버전의 Safari 웹 브라우저는에 AWS Encryption SDK 필요한 0바이트의 AES-GCM 암호화를 지원하지 않습니다. 브라우저가 WebCrypto API를 구현하지만 AES-GCM을 사용하여 0바이트를 암호화할 수 없는 경우는 0바이트 암호화에만 폴백 라이브러리를 AWS Encryption SDK for JavaScript 사용합니다. 다른 모든 작업에는 WebCrypto API를 사용합니다.

두 가지 중 한 제한 사항에 폴백을 구성하려면 코드에 다음 문을 추가합니다. [configureFallback](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/web-crypto-backend/src/backend-factory.ts#L78) 함수에서 누락된 기능을 지원하는 라이브러리를 지정합니다. 다음 예제는 Microsoft Research JavaScript 암호화 라이브러리(`msrcrypto`)를 사용하지만 호환 가능한 라이브러리로 바꿀 수 있습니다. 전체 예제는 [fallback.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-browser/src/fallback.ts)를 참조하세요.

```
import { configureFallback } from '@aws-crypto/client-browser'
configureFallback(msrCrypto)
```

# 설치 AWS Encryption SDK for JavaScript
<a name="javascript-installation"></a>

는 상호 종속 모듈 모음으로 AWS Encryption SDK for JavaScript 구성됩니다. 여러 모듈은 함께 작동하도록 설계된 모듈 모음일 뿐입니다. 일부 모듈은 독립적으로 작동하도록 설계됩니다. 모든 구현에는 몇 개의 모듈이 필요합니다. 다른 몇 개 모듈은 특수한 경우에만 필요합니다. JavaScript AWS Encryption SDK 용의 모듈에 대한 자세한 내용은 GitHub의 [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules) 리포지토리에 있는 각 모듈의 [의 모듈 AWS Encryption SDK for JavaScript](javascript-modules.md) 및 `README.md` 파일을 참조하세요.

**참고**  
2.0.0 AWS Encryption SDK for JavaScript 이전의 모든 버전은 [end-of-support 단계에](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) 있습니다.  
코드나 데이터를 변경하지 않고 버전 2.0.*x* 이상에서 AWS Encryption SDK for JavaScript 의 최신 버전으로 안전하게 업데이트할 수 있습니다. 그러나 버전 2.0.*x*에 도입된 [새로운 보안 기능](about-versions.md#version-2)은 이하 버전과 호환되지 않습니다. 1.7.*x* 이하 버전에서 2.0.*x* 이상 버전으로 업데이트하려면 먼저 AWS Encryption SDK for JavaScript의 최신 1.*x* 버전으로 업데이트해야 합니다. 자세한 내용은 [마이그레이션 AWS Encryption SDK](migration.md)을 참조하세요.

모듈을 설치하려면 [npm 패키지 관리자](https://www.npmjs.com/get-npm)를 사용하세요.

예를 들어 Node.js AWS Encryption SDK for JavaScript 에서 로 프로그래밍해야 하는 모든 모듈이 포함된 `client-node` 모듈을 설치하려면 다음 명령을 사용합니다.

```
npm install @aws-crypto/client-node
```

 AWS Encryption SDK for JavaScript 브라우저에서 로 프로그래밍해야 하는 모든 모듈이 포함된 `client-browser` 모듈을 설치하려면 다음 명령을 사용합니다.

```
npm install @aws-crypto/client-browser
```

사용 방법에 대한 실제 예제는 GitHub의 [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 리포지토리에 있는 `example-node` 및 `example-browser` 모듈의 예제를 AWS Encryption SDK for JavaScript참조하세요.

# 의 모듈 AWS Encryption SDK for JavaScript
<a name="javascript-modules"></a>

의 모듈을 AWS Encryption SDK for JavaScript 사용하면 프로젝트에 필요한 코드를 쉽게 설치할 수 있습니다.

## JavaScript Node.js 모듈
<a name="jsn-modules-node"></a>

[client-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/client-node)  
Node.js AWS Encryption SDK for JavaScript 에서를 사용하여 프로그래밍해야 하는 모든 모듈을 포함합니다.

[caching-materials-manager-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/caching-materials-manager-node)  
Node.js의에서 [데이터 키 캐싱](data-key-caching.md) 기능을 지원하는 함수 AWS Encryption SDK for JavaScript 를 내보냅니다.

[decrypt-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/decrypt-node)  
데이터 및 데이터 스트림을 나타내는 암호화된 메시지를 복호화하고 확인하는 함수를 내보냅니다. `client-node` 모듈에 포함됩니다.

[encrypt-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/encrypt-node)  
다양한 유형의 데이터를 암호화하고 서명하는 함수를 내보냅니다. `client-node` 모듈에 포함됩니다.

[example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node)  
Node.js AWS Encryption SDK for JavaScript 에서를 사용한 프로그래밍의 실제 예제를 내보냅니다. 다양한 유형의 키링 및 다양한 유형의 데이터 예제를 포함합니다.

[hkdf-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/hkdf-node)  
Node.js의가 특정 알고리즘 제품군 AWS Encryption SDK for JavaScript 에서 사용하는 [HMAC 기반 키 파생 함수](https://en.wikipedia.org/wiki/HKDF)(HKDF)를 내보냅니다. 브라우저 AWS Encryption SDK for JavaScript 의는 WebCrypto API의 기본 HKDF 함수를 사용합니다.

[integration-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/integration-node)  
Node.js AWS Encryption SDK for JavaScript 의가의 다른 언어 구현과 호환되는지 확인하는 테스트를 정의합니다 AWS Encryption SDK.

[kms-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring-node)  
Node.js에서 AWS KMS 키링을 지원하는 함수를 내보냅니다.

[raw-aes-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-aes-keyring-node)  
Node.js에서 [Raw AES 키링](use-raw-aes-keyring.md)을 지원하는 함수를 내보냅니다.

[raw-rsa-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-rsa-keyring-node)  
Node.js에서 [Raw RSA 키링](use-raw-rsa-keyring.md)을 지원하는 함수를 내보냅니다.

## JavaScript 브라우저용 모듈
<a name="jsn-modules-browser"></a>

[client-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/client-browser)  
 AWS Encryption SDK for JavaScript 브라우저에서를 사용하여 프로그래밍해야 하는 모든 모듈을 포함합니다.

[caching-materials-manager-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/caching-materials-manager-browser)  
브라우저에서 JavaScript용으로 [데이터 키 캐싱](data-key-caching.md) 기능을 지원하는 함수를 내보냅니다.

[decrypt-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/decrypt-browser)  
데이터 및 데이터 스트림을 나타내는 암호화된 메시지를 복호화하고 확인하는 함수를 내보냅니다.

[encrypt-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/encrypt-browser)  
다양한 유형의 데이터를 암호화하고 서명하는 함수를 내보냅니다.

[example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser)  
브라우저 AWS Encryption SDK for JavaScript 에서를 사용한 프로그래밍의 실제 예제입니다. 다양한 유형의 키링 및 다양한 유형의 데이터 예제를 포함합니다.

[integration-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/integration-browser)  
브라우저의 스크립트가 AWS Encryption SDK for Java의 다른 언어 구현과 호환되는지 확인하는 테스트를 정의합니다 AWS Encryption SDK.

[kms-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring-browser)  
브라우저에서 [AWS KMS 키링](use-kms-keyring.md)을 지원하는 함수를 내보냅니다.

[raw-aes-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-aes-keyring-browser)  
브라우저에서 [Raw AES 키링](use-raw-aes-keyring.md)을 지원하는 함수를 내보냅니다.

[raw-rsa-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-rsa-keyring-browser)  
브라우저에서 [Raw RSA 키링](use-raw-rsa-keyring.md)을 지원하는 함수를 내보냅니다.

## 모든 구현을 위한 모듈
<a name="jsn-modules-all"></a>

[cache-material](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/cache-material)  
[데이터 키 캐싱](data-key-caching.md) 기능을 지원합니다. 각 데이터 키로 캐시된 암호화 자료를 어셈블하기 위한 코드를 제공합니다.

[kms-keyring](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring)  
[KMS 키링](use-kms-keyring.md)을 지원하는 함수를 내보냅니다.

[material-management](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/material-management)  
[암호화 자료 관리자](concepts.md#crypt-materials-manager)(CMM)를 구현합니다.

[raw-keyring](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-keyring)  
Raw AES 및 RSA 키링에 필요한 함수를 내보냅니다.

[serialize](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/serialize)  
SDK가 출력을 직렬화하는 데 사용하는 함수를 내보냅니다.

[web-crypto-backend](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/web-crypto-backend)  
브라우저의에서 WebCrypto API를 사용하는 함수 AWS Encryption SDK for JavaScript 를 내보냅니다.

# AWS Encryption SDK for JavaScript 예제
<a name="js-examples"></a>

다음 예제에서는 AWS Encryption SDK for JavaScript 를 사용하여 데이터를 암호화 및 복호화하는 방법을 보여줍니다.

GitHub의 aws-encryption-sdk-javascript AWS Encryption SDK for JavaScript 리포지토리의 example-node 및 [example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser) 모듈에서를 사용하는 더 많은 예제를 찾을 수 있습니다. [https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 이러한 예제 모듈은 `client-browser` 또는 `client-node` 모듈을 설치할 때 설치되지 않습니다.

**전체 코드 샘플을 참조**: 노드: [kms\$1simple.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-node/src/kms_simple.ts), 브라우저: [kms\$1simple.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-browser/src/kms_simple.ts)

**Topics**
+ [AWS KMS 키링을 사용하여 데이터 암호화](#javascript-example-encrypt)
+ [AWS KMS 키링을 사용하여 데이터 복호화](#javascript-example-decrypt)

## AWS KMS 키링을 사용하여 데이터 암호화
<a name="javascript-example-encrypt"></a>

다음 예제에서는를 사용하여 짧은 문자열 또는 바이트 배열 AWS Encryption SDK for JavaScript 을 암호화하고 해독하는 방법을 보여줍니다.

이 예제에서는 [AWS KMS](use-kms-keyring.md)를 사용하여 데이터 키를 생성하고 암호화하는 키링 유형인 키링 AWS KMS key 이 특징입니다. 생성에 대한 도움말은 *AWS Key Management Service 개발자 안내서*의 키 생성을 AWS KMS key참조하세요. [https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) AWS KMS 키링 AWS KMS keys 에서를 식별하는 데 도움이 필요하면 섹션을 참조하세요. [AWS KMS 키링 AWS KMS keys 에서 식별](use-kms-keyring.md#kms-keyring-id) 

1단계: 커밋 정책을 설정합니다.  
버전 1.7.*x*부터 AWS Encryption SDK 클라이언트를 인스턴스화하는 새 `buildClient` 함수를 호출할 때 커밋 정책을 설정할 AWS Encryption SDK for JavaScript수 있습니다. `buildClient` 함수는 커밋 정책을 나타내는 열거형 값을 사용합니다. 암호화 및 복호화 시 커밋 정책을 적용하는 업데이트된 `encrypt` 및 `decrypt` 함수를 반환합니다.  
다음 예제에서는 `buildClient` 함수를 사용하여 [기본 커밋 정책](migrate-commitment-policy.md)인를 지정합니다`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`. 를 사용하여 암호화된 메시지의 암호화된 데이터 키 수를 제한`buildClient`할 수도 있습니다. 자세한 내용은 [암호화된 데이터 키 제한](configure.md#config-limit-keys) 단원을 참조하십시오.  

```
import {
  KmsKeyringBrowser,
  KMS,
  getClient,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-browser'

const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

```
import {
  KmsKeyringNode,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-node'
                                
const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

2단계: 키링을 구성합니다.  
암호화를 위한 AWS KMS 키링을 생성합니다.  
 AWS KMS 키링으로 암호화할 때는 *생성기 키*, 즉 일반 텍스트 데이터 키를 생성하고 암호화하는 데 AWS KMS key 사용되는를 지정해야 합니다. 동일한 일반 텍스트 데이터 키를 암호화하는 0개 이상의 *추가 키*를 지정할 수도 있습니다. 키링은 일반 텍스트 데이터 키와 생성기 키를 포함하여 키링의 각 AWS KMS key 에 대한 해당 데이터 키의 암호화된 사본 하나를 반환합니다. 데이터를 복호화하려면 암호화된 데이터 키 중 하나를 복호화해야 합니다.  
에서 암호화 키링에 AWS KMS keys 대해를 지정하려면 [지원되는 모든 AWS KMS 키 식별자](use-kms-keyring.md#kms-keyring-id)를 사용할 AWS Encryption SDK for JavaScript수 있습니다. 이 예에서는 [별칭 ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-alias-ARN)으로 식별되는 생성기 키와 [키 ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN)으로 식별되는 추가 키 하나를 사용합니다.  
복호화를 위해 AWS KMS 키링을 재사용하려는 경우 키 ARNs 사용하여 키링 AWS KMS keys 에서를 식별해야 합니다.
이 코드를 실행하기 전에 예제 AWS KMS key 식별자를 유효한 식별자로 바꿉니다. 키링에서 [AWS KMS keys를 사용하는 데 필요한 권한](use-kms-keyring.md#kms-keyring-permissions)이 있어야 합니다.  
브라우저에 자격 증명을 제공하여 시작하세요. 이 AWS Encryption SDK for JavaScript 예에서는 자격 증명 상수를 실제 자격 증명으로 대체하는 [webpack.DefinePlugin](https://webpack.js.org/plugins/define-plugin/)을 사용합니다. 그러나 모든 방법을 사용하여 자격 증명을 제공할 수 있습니다. 그런 다음 자격 증명을 사용하여 AWS KMS 클라이언트를 생성합니다.  

```
declare const credentials: {accessKeyId: string, secretAccessKey:string, sessionToken:string }

const clientProvider = getClient(KMS, {
  credentials: {
    accessKeyId,
    secretAccessKey,
    sessionToken
  }
})
```
그런 다음 생성기 키 및 추가 키에 AWS KMS keys 를 지정합니다. 그런 다음 클라이언트와를 사용하여 AWS KMS AWS KMS 키링을 생성합니다 AWS KMS keys.  

```
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/EncryptDecrypt'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds })
```

```
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/EncryptDecrypt'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringNode({ generatorKeyId, keyIds })
```

3단계: 암호화 컨텍스트를 설정합니다.  
[암호화 컨텍스트](concepts.md#encryption-context)는 비밀이 아닌 임의의 추가 인증 데이터입니다. 암호화에 암호화 컨텍스트를 제공하면 AWS Encryption SDK 는 암호화 컨텍스트를 사이퍼텍스트에 암호화 방식으로 바인딩하여 데이터를 복호화하는 데 동일한 암호화 컨텍스트가 필요합니다. 암호화 컨텍스트를 사용하는 것은 선택 사항이지만 권장되는 모범 사례입니다.  
암호화 컨텍스트 페어를 포함하는 단순 객체를 만듭니다. 각 페어의 키와 값은 문자열이어야 합니다.  

```
const context = {
  stage: 'demo',
  purpose: 'simple demonstration app',
  origin: 'us-west-2'
}
```

```
const context = {
  stage: 'demo',
  purpose: 'simple demonstration app',
  origin: 'us-west-2'
}
```

4단계: 데이터를 암호화합니다.  
일반 텍스트 데이터를 암호화하려면 `encrypt` 함수를 호출합니다. AWS KMS 키링, 일반 텍스트 데이터 및 암호화 컨텍스트를 전달합니다.  
이 `encrypt` 함수는 암호화된 데이터, 암호화된 데이터 키 및 암호화 컨텍스트 및 서명을 포함한 중요한 메타데이터를 포함하는 [암호화된 메시지](concepts.md#message)(`result`)를 반환합니다.  
지원되는 프로그래밍 언어 AWS Encryption SDK 에 대해를 사용하여 [이 암호화된 메시지를 복호](#javascript-example-decrypt)화할 수 있습니다.  

```
const plaintext = new Uint8Array([1, 2, 3, 4, 5])

const { result } = await encrypt(keyring, plaintext, { encryptionContext: context })
```

```
const plaintext = 'asdf'

const { result } = await encrypt(keyring, plaintext, { encryptionContext: context })
```

## AWS KMS 키링을 사용하여 데이터 복호화
<a name="javascript-example-decrypt"></a>

를 사용하여 암호화된 메시지를 해독하고 원본 데이터를 복구 AWS Encryption SDK for JavaScript 할 수 있습니다.

이 예에서는 [AWS KMS 키링을 사용하여 데이터 암호화](#javascript-example-encrypt) 예제에서 암호화된 데이터를 복호화합니다.

1단계: 커밋 정책을 설정합니다.  
버전 1.7.*x*부터 AWS Encryption SDK 클라이언트를 인스턴스화하는 새 `buildClient` 함수를 호출할 때 커밋 정책을 설정할 AWS Encryption SDK for JavaScript수 있습니다. `buildClient` 함수는 커밋 정책을 나타내는 열거형 값을 사용합니다. 암호화 및 복호화 시 커밋 정책을 적용하는 업데이트된 `encrypt` 및 `decrypt` 함수를 반환합니다.  
다음 예제에서는 `buildClient` 함수를 사용하여 [기본 커밋 정책](migrate-commitment-policy.md)인를 지정합니다`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`. 를 사용하여 암호화된 메시지의 암호화된 데이터 키 수를 제한`buildClient`할 수도 있습니다. 자세한 내용은 [암호화된 데이터 키 제한](configure.md#config-limit-keys) 단원을 참조하십시오.  

```
import {
  KmsKeyringBrowser,
  KMS,
  getClient,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-browser'

const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

```
import {
  KmsKeyringNode,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-node'
                                
const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

2단계: 키링을 구성합니다.  
데이터를 복호화하려면 `encrypt` 함수가 반환한 [암호화된 메시지](concepts.md#message)(`result`)를 전달하세요. 암호화된 메시지는 암호화된 데이터, 암호화된 데이터 키 및 암호화 컨텍스트 및 서명을 포함한 중요한 메타데이터를 포함합니다.  
또한 복호화할 때 [AWS KMS 키링](use-kms-keyring.md)을 지정해야 합니다. 데이터를 암호화하는 데 사용된 것과 동일한 키링이나 다른 키링을 사용할 수 있습니다. 성공하려면 복호화 키링 AWS KMS key 에 있는 하나 이상의가 암호화된 메시지의 암호화된 데이터 키 중 하나를 복호화할 수 있어야 합니다. 데이터 키가 생성되지 않으므로 복호화 키링에 생성기 키를 지정할 필요가 없습니다. 이렇게 하면 생성기 키와 추가 키가 같은 방식으로 처리됩니다.  
에서 복호화 키링에 AWS KMS key 대해를 지정하려면 [키 ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN)을 사용해야 AWS Encryption SDK for JavaScript합니다. 그렇지 않으면 AWS KMS key 가 인식되지 않습니다. AWS KMS 키링 AWS KMS keys 에서를 식별하는 데 도움이 필요하면 섹션을 참조하세요. [AWS KMS 키링 AWS KMS keys 에서 식별](use-kms-keyring.md#kms-keyring-id)   
암호화 및 복호화에 동일한 키링을 사용하는 경우 키 ARNs 사용하여 키링 AWS KMS keys 에서를 식별합니다.
이 예제에서는 암호화 키링 AWS KMS keys 에 중 하나만 포함하는 키링을 생성합니다. 이 코드를 실행하기 전에 예제 키 ARN을 유효한 키로 바꿉니다. AWS KMS key에 대한 `kms:Decrypt` 권한이 있어야 합니다.  
브라우저에 자격 증명을 제공하여 시작하세요. 이 AWS Encryption SDK for JavaScript 예에서는 자격 증명 상수를 실제 자격 증명으로 대체하는 [webpack.DefinePlugin](https://webpack.js.org/plugins/define-plugin/)을 사용합니다. 그러나 모든 방법을 사용하여 자격 증명을 제공할 수 있습니다. 그런 다음 자격 증명을 사용하여 AWS KMS 클라이언트를 생성합니다.  

```
declare const credentials: {accessKeyId: string, secretAccessKey:string, sessionToken:string }

const clientProvider = getClient(KMS, {
  credentials: {
    accessKeyId,
    secretAccessKey,
    sessionToken
  }
})
```
그런 다음 AWS KMS 클라이언트를 사용하여 AWS KMS 키링을 생성합니다. 이 예제에서는 AWS KMS keys 암호화 키링의 중 하나만 사용합니다.  

```
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringBrowser({ clientProvider, keyIds })
```

```
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringNode({ keyIds })
```

3단계: 데이터 암호화를 해제합니다.  
그런 다음 `decrypt` 함수를 호출합니다. 방금 생성한 복호화 키링(`keyring`)과, `encrypt` 함수가 반환한 [암호화된 메시지](concepts.md#message)(`result`)를 전달하세요. 는 키링을 AWS Encryption SDK 사용하여 암호화된 데이터 키 중 하나를 복호화합니다. 그런 다음 일반 텍스트 데이터 키를 사용하여 데이터를 복호화합니다.  
호출이 성공하면 `plaintext` 필드에 일반 텍스트(복호화된) 데이터가 포함됩니다. 이 `messageHeader` 필드에는 데이터 복호화에 사용된 암호화 컨텍스트를 포함하여 복호화 프로세스에 대한 메타데이터가 포함됩니다.  

```
const { plaintext, messageHeader } = await decrypt(keyring, result)
```

```
const { plaintext, messageHeader } = await decrypt(keyring, result)
```

4단계: 암호화 컨텍스트를 확인합니다.  
데이터를 복호화하는 데 사용된 [암호화 컨텍스트](concepts.md#encryption-context)는 `decrypt` 함수가 반환하는 메시지 헤더(`messageHeader`)에 포함됩니다. 애플리케이션에서 일반 텍스트 데이터를 반환하기 전에 암호화할 때 제공한 암호화 컨텍스트가 복호화할 때 사용된 암호화 컨텍스트에 포함되어 있는지 확인합니다. 불일치는 데이터가 변조되었거나 올바른 암호화 텍스트를 복호화하지 않았음을 나타낼 수 있습니다.  
암호화 컨텍스트를 확인할 때 정확히 일치할 필요는 없습니다. 서명과 함께 암호화 알고리즘을 사용하는 경우 [암호화 자료 관리자](concepts.md#crypt-materials-manager)(CMM)은 메시지를 암호화하기 전에 암호화 컨텍스트에 퍼블릭 서명 키를 추가합니다. 그러나 제출한 모든 암호화 컨텍스트 페어는 반환된 암호화 컨텍스트에 포함되어야 합니다.  
먼저 메시지 헤더에서 암호화 컨텍스트를 가져옵니다. 그런 다음 원래 암호화 컨텍스트(`context`)의 각 키-값 페어가 반환된 암호화 컨텍스트(`encryptionContext`)의 키-값 페어와 일치하는지 확인합니다.  

```
const { encryptionContext } = messageHeader

Object
  .entries(context)
  .forEach(([key, value]) => {
    if (encryptionContext[key] !== value) throw new Error('Encryption Context does not match expected values')
})
```

```
const { encryptionContext } = messageHeader

Object
  .entries(context)
  .forEach(([key, value]) => {
    if (encryptionContext[key] !== value) throw new Error('Encryption Context does not match expected values')
})
```
암호화 컨텍스트 검사가 성공하면 일반 텍스트 데이터를 반환할 수 있습니다.