

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

# 멀티테넌트 데이터베이스를 위한 검색 가능한 암호화
<a name="searchable-encryption-multitenant"></a>


****  

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

데이터베이스에서 검색 가능한 암호화를 구현하려면 [AWS KMS 계층적 키링](use-hierarchical-keyring.md)을 사용해야 합니다. AWS KMS 계층적 키링은 레코드를 보호하는 데 사용되는 데이터 키를 생성, 암호화 및 해독합니다. 또한 비컨을 생성하는 데 사용되는 비컨 키도 생성합니다. 멀티테넌트 데이터베이스에서 AWS KMS 계층적 키링을 사용하는 경우 각 테넌트에 대해 고유한 브랜치 키와 비컨 키가 있습니다. 멀티테넌트 데이터베이스에서 암호화된 데이터를 쿼리하려면 쿼리하는 비컨을 생성하는 데 사용된 비컨 키 자료를 식별해야 합니다. 자세한 내용은 [검색 가능한 암호화를 위한 계층적 키링 사용](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings) 단원을 참조하십시오.

멀티테넌트 데이터베이스의 [비컨 버전](using-beacons.md#beacon-version)을 정의할 때는 구성한 모든 표준 비컨 목록, 구성한 모든 복합 비컨 목록, 비컨 버전 및 `keySource`을 지정합니다. [비콘 키 소스를 `MultiKeyStore`로 정의하고](use-hierarchical-keyring.md#beacon-key-source) `keyFieldName`을 포함해야 하며, 로컬 비컨 키 캐시에 대한 캐시 수명과 로컬 비컨 키 캐시에 대한 최대 캐시 크기를 포함해야 합니다.

[서명된 비컨](configure.md#signed-beacons)을 구성한 경우 해당 비컨이`compoundBeaconList` 에 포함되어야 합니다. 서명된 비컨은 `SIGN_ONLY` 및 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`필드에 대해 복잡한 쿼리를 인덱싱하고 수행하는 복합 비컨의 한 유형입니다.

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

```
List<BeaconVersion> beaconVersions = new ArrayList<>();
    beaconVersions.add(
        BeaconVersion.builder()
                .standardBeacons(standardBeaconList)
                .compoundBeacons(compoundBeaconList)
                .version(1) // MUST be 1
                .keyStore(branchKeyStoreName)
                .keySource(BeaconKeySource.builder()
                        .multi(MultiKeyStore.builder()
                                .keyFieldName(keyField)
                                .cacheTTL(6000)
                                .maxCacheSize(10)
                        .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
        {
            Multi = new MultiKeyStore
            {
                KeyId = branch-key-id,
                CacheTTL = 6000,
                MaxCacheSize = 10
            }
        }
    }
};
```

------
#### [ 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::Multi(
        MultiKeyStore::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)
            .max_cache_size(10)
            .build()?,
    ))
    .build()?;
let beacon_versions = vec![beacon_version];
```

------

**keyFieldName**  
[`keyFieldName`](use-hierarchical-keyring.md#keyFieldName)는 지정된 테넌트에 대한 비컨을 생성하는 데 사용된 비컨 키와 관련된 `branch-key-id`를 저장하는 필드의 이름을 정의합니다.  
데이터베이스에 새 레코드를 쓰는 경우 해당 레코드에 대한 비컨을 생성하는 데 사용되는 비컨 키를 식별하는 `branch-key-id`가 이 필드에 저장됩니다.  
기본적으로 `keyField`는 데이터베이스에 명시적으로 저장되지 않는 개념적 필드입니다. AWS Database Encryption SDK는 [자료 설명](concepts.md#material-description)의 암호화된 [데이터 키](concepts.md#data-key)`branch-key-id`에서를 식별하고 복합 비컨 및 [서명된 비컨](configure.md#signed-beacons)에서 참조할 수 `keyField` 있도록 개념에 값을 저장합니다. 자료 설명은 서명된 것이므로 개념적 `keyField`은 서명된 부분으로 간주됩니다.  
암호화 작업에 `keyField`를 `SIGN_ONLY` 또는 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 필드로 포함하여 데이터베이스에 필드를 명시적으로 저장할 수도 있습니다. 이렇게 하면 데이터베이스에 레코드를 쓸 때마다 `keyField`dp 수동으로 `branch-key-id`를 포함시켜야 합니다.

## 멀티테넌트 데이터베이스의 비컨 쿼리
<a name="query-multitenant-beacons"></a>

비컨을 쿼리하려면 비컨을 재계산하는 데 필요한 적절한 비컨 키 자료를 식별할 수 있도록 쿼리에 `keyField`을 포함해야 합니다. 레코드의 비컨을 생성하는 데 사용되는 비컨 키와 관련된 `branch-key-id`을 지정해야 합니다. 브랜치 키 ID 공급자의 테넌트 `branch-key-id`를 식별하는 [친숙한 이름](use-hierarchical-keyring.md#branch-key-id-supplier)은 지정할 수 없습니다. 다음과 같은 방법으로 쿼리에 `keyField`을 포함시킬 수 있습니다.

**복합 비컨**  
레코드에 `keyField`을 명시적으로 저장하든 저장하지 않든, 복합 비컨에 서명된 부분으로`keyField`을 직접 포함시킬 수 있습니다. `keyField` 서명된 부분이 필요합니다.  
예를 들어, 필드 2개와 `encryptedField` 및 `signedField`를 사용하여 복합 비컨 `compoundBeacon`을 생성하려면 `keyField`를 서명된 부분으로 포함해야 합니다. 이렇게 하면 `compoundBeacon`에서 다음 쿼리를 수행할 수 있습니다.  

```
compoundBeacon = E_encryptedFieldValue.S_signedFieldValue.K_branch-key-id
```

**서명된 비컨**  
 AWS Database Encryption SDK는 표준 및 복합 비컨을 사용하여 검색 가능한 암호화 솔루션을 제공합니다. 이러한 비컨에는 하나 이상의 암호화된 필드가 포함되어야 합니다. 그러나 AWS Database Encryption SDK는 일반 텍스트 `SIGN_ONLY` 및 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 필드에서 완전히 구성할 수 있는 [서명된 비컨](configure.md#signed-beacons)도 지원합니다.  
서명된 비컨은 단일 부분으로 구성할 수 있습니다. `keyField`를 레코드에 명시적으로 저장하든 저장하지 않든, `keyField`에서 서명된 비컨을 생성하고 이를 사용하여 `keyField` 서명된 비컨에 대한 쿼리를 다른 비컨 중 하나에 대한 쿼리와 결합하는 복합 쿼리를 만들 수 있습니다. 예를 들어 다음 쿼리를 수행할 수 있습니다.  

```
keyField = K_branch-key-id AND compoundBeacon = E_encryptedFieldValue.S_signedFieldValue
```
서명된 비컨을 구성하는 데 도움이 필요하면 [서명된 비컨 만들기](configure.md#signed-beacons) 섹션을 참조하세요

**`keyField`에서 직접 쿼리하기**  
암호화 `keyField` 작업에서 `keyField`를 지정하고 레코드에 필드를 명시적으로 저장한 경우, 비컨의 쿼리와 비컨의 쿼리를 결합하는 복합 쿼리를 만들 수 있습니다. 표준 비컨을 쿼리하려는 경우 `keyField`에서 직접 쿼리하도록 선택할 수 있습니다. 예를 들어 다음 쿼리를 수행할 수 있습니다.  

```
keyField = branch-key-id AND standardBeacon = S_standardBeaconValue
```