

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

# 비컨 사용
<a name="using-beacons"></a>


****  

|  | 
| --- |
| 클라이언트 측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 이 개발자 안내서는 여전히 [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md)에 대한 정보를 제공합니다. | 

비컨을 사용하면 쿼리 중인 전체 데이터베이스를 복호화하지 않고도 암호화된 레코드를 검색할 수 있습니다. 비컨은 채워지지 않은 새 데이터베이스에 구현되도록 설계되었습니다. 기존 데이터베이스에 구성된 모든 비컨은 데이터베이스에 기록된 새 레코드만 매핑합니다. 비컨은 필드의 일반 텍스트 값에서 계산됩니다. 필드가 암호화되면 비컨이 기존 데이터를 매핑할 방법이 없습니다. 비컨으로 새 레코드를 작성한 후에는 비컨의 구성을 업데이트할 수 없습니다. 하지만 레코드에 추가하는 새 필드에 새 비컨을 추가할 수 있습니다.

비컨을 구성한 후에는 데이터베이스를 채우고 비컨에 대한 쿼리를 수행하기 전에 다음 단계를 완료해야 합니다.

1. ** AWS KMS 계층적 키링 생성**

   [검색 가능한 암호화를 사용하려면 [AWS KMS 계층적 키링](use-hierarchical-keyring.md)을 사용하여 레코드 보호에 사용되는 데이터 키](concepts.md#data-key)를 생성, 암호화 및 복호화해야 합니다.

   비컨을 구성한 후 [계층적 키링 사전 요구 사항](use-hierarchical-keyring.md#hierarchical-keyring-prereqs)을 조합하고 [계층적 키링을 생성합니다](use-hierarchical-keyring.md#initialize-hierarchical-keyring).

   계층적 키링이 필요한 이유에 대한 자세한 내용은 [검색 가능한 암호화를 위한 계층적 키링 사용](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings)을 참조하세요.

1. 

   **비컨 버전 정의**

   `keyStore`, `keySource`, 구성한 모든 표준 비컨 목록, 구성한 모든 복합 비컨 목록, 암호화된 부분 목록, 서명된 부분 목록 및 비컨 버전을 지정합니다. 비컨 버전에 대해 `1`을 지정해야 합니다. `keySource` 정의에 대한 지침은 [비컨 키 소스 정의하기](use-hierarchical-keyring.md#beacon-key-source) 섹션을 참조하세요.

   다음 Java 예제는 단일 테넌트 데이터베이스의 비컨 버전을 정의합니다. 멀티테넌트 데이터베이스의 비컨 버전을 정의하는 데 도움이 필요하면 [멀티테넌트 데이터베이스의 검색 가능한 암호화](searchable-encryption-multitenant.md)를 참조하세요.

------
#### [ Java ]

   ```
    List<BeaconVersion> beaconVersions = new ArrayList<>();
   beaconVersions.add(
       BeaconVersion.builder()
           .standardBeacons(standardBeaconList)
           .compoundBeacons(compoundBeaconList)
           .encryptedParts(encryptedPartsList)
           .signedParts(signedPartsList)
           .version(1) // MUST be 1
           .keyStore(keyStore)
           .keySource(BeaconKeySource.builder()
               .single(SingleKeyStore.builder()
                   .keyId(branchKeyId)
                   .cacheTTL(6000)
                   .build())
               .build())
           .build()
   );
   ```

------
#### [ C\$1 / .NET ]

   ```
   var beaconVersions = new List<BeaconVersion>
   {
       new BeaconVersion
       {
           StandardBeacons = standardBeaconList,
           CompoundBeacons = compoundBeaconList,
           EncryptedParts = encryptedPartsList,
           SignedParts = signedPartsList,
           Version = 1, // MUST be 1
           KeyStore = branchKeyStoreName,
           KeySource = new BeaconKeySource
           {
               Single = new SingleKeyStore
               {
                   KeyId = branch-key-id,
                   CacheTTL = 6000
               }
           }
       }
   };
   ```

------
#### [ Rust ]

   ```
   let beacon_version = BeaconVersion::builder()
       .standard_beacons(standard_beacon_list)
       .compound_beacons(compound_beacon_list)
       .version(1) // MUST be 1
       .key_store(key_store.clone())
       .key_source(BeaconKeySource::Single(
           SingleKeyStore::builder()
               // `keyId` references a beacon key.
               // For every branch key we create in the keystore,
               // we also create a beacon key.
               // This beacon key is not the same as the branch key,
               // but is created with the same ID as the branch key.
               .key_id(branch_key_id)
               .cache_ttl(6000)
               .build()?,
       ))
       .build()?;
   let beacon_versions = vec![beacon_version];
   ```

------

1. **보조 인덱스 구성**

   [비컨을 구성](configure-beacons.md)한 후 암호화된 필드를 검색하려면 먼저 각 비컨을 반영하는 보조 인덱스를 구성해야 합니다. 자세한 내용은 [비컨을 사용한 보조 인덱스 구성](ddb-searchable-encryption.md#ddb-beacon-indexes) 단원을 참조하십시오.

1. **[암호화 작업](concepts.md#crypt-actions) 정의**

   표준 비컨을 구성하는 데 사용되는 모든 필드를 `ENCRYPT_AND_SIGN`으로 표시해야 합니다. 비컨을 구성하는 데 사용되는 다른 모든 필드는 `SIGN_ONLY` 또는 로 표시되어야 합니다`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

1. ** AWS Database Encryption SDK 클라이언트 구성**

   DynamoDB 테이블의 테이블 항목을 보호하는 AWS Database Encryption SDK 클라이언트를 구성하려면 [ DynamoDB용 Java 클라이언트 측 암호화 라이브러리](ddb-java.md)를 참조하세요.

## 비컨 쿼리
<a name="querying-beacons"></a>

구성하는 비컨의 유형에 따라 수행할 수 있는 쿼리 유형이 결정됩니다. 표준 비컨은 필터 표현식을 사용하여 동등 검색을 수행합니다. 복합 비컨은 리터럴 일반 텍스트 문자열과 표준 비컨을 결합하여 복잡한 쿼리를 수행합니다. 암호화된 데이터를 쿼리할 때는 비컨 이름을 검색합니다.

두 표준 비컨에 동일한 기본 일반 텍스트가 포함되어 있더라도 두 표준 비컨의 값을 비교할 수는 없습니다. 두 개의 표준 비컨은 동일한 일반 텍스트 값에 대해 서로 다른 두 개의 HMAC 태그를 생성합니다. 따라서 표준 비컨은 다음 쿼리를 수행할 수 없습니다.
+ `beacon1 = beacon2`
+ `beacon1 IN (beacon2)`
+ `value IN (beacon1, beacon2, ...)`
+ `CONTAINS(beacon1, beacon2)`

복합 비컨은 다음 쿼리를 수행할 수 있습니다.
+ `BEGINS_WITH(a)`, 여기서 `a`는 조립된 복합 비컨이 시작하는 필드의 전체 값을 반영합니다. `BEGINS_WITH` 연산자를 사용하여 특정 하위 문자열로 시작하는 값을 식별할 수 없습니다. 하지만 `BEGINS_WITH(S_)`을 사용할 수 있으며, 여기서 `S_`는 조립된 복합 비컨이 시작하는 부분의 접두사를 반영합니다.
+ `CONTAINS(a)`, 여기서 `a`는 조립된 복합 비컨에 포함된 필드의 전체 값을 반영합니다. `CONTAINS` 연산자를 사용하여 세트 내의 특정 하위 문자열이나 값이 포함된 레코드를 식별할 수 없습니다.

  예를 들어 `a`이 세트의 값을 반영하는 쿼리 `CONTAINS(path, "a"`는 수행할 수 없습니다.
+ 복합 비컨의 [서명된 부분](configure-beacons.md#signed-parts)을 비교할 수 있습니다. 서명된 부분을 비교할 때 선택적으로 하나 이상의 [서명된 부분에 암호화된 부분](configure-beacons.md#encrypted-parts)의 접두사를 추가할 수 있지만 암호화된 필드의 값을 쿼리에 포함할 수는 없습니다.

  예를 들어 서명된 부분을 비교하고 `signedField1 = signedField2` 또는 `value IN (signedField1, signedField2, ...)`에 대해 쿼리할 수 있습니다.

  `signedField1.A_ = signedField2.B_`에 대한 쿼리에 의해 서명된 부분과 암호화된 부분의 접두사를 비교할 수도 있습니다.
+ `field BETWEEN a AND b`, 여기서 `a` 및 `b`는 서명된 부분입니다. 암호화된 부분의 접두사를 하나 이상의 서명된 부분에 선택적으로 추가할 수 있지만 암호화된 필드의 값을 쿼리에 포함할 수는 없습니다.

복합 비컨에 대한 쿼리에 포함시키는 각 부분의 접두사를 포함해야 합니다. 예를 들어, 두 개의 필드, `encryptedField` 및 `signedField`로부터 복합 비컨 `compoundBeacon`을 구성한 경우, 비컨을 쿼리할 때 이 두 부분에 대해 구성된 접두사를 포함해야 합니다.

```
compoundBeacon = E_encryptedFieldValue.S_signedFieldValue
```