Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / / / /

암호화된 컬렉션

이 페이지의 내용

  • 개요
  • 메타데이터 컬렉션
  • 동등성 및 범위 쿼리 영향
  • 동일성 쿼리 가능 필드에 대한 쓰기 비용
  • 삽입 작업
  • 업데이트 작업
  • 삭제 작업
  • 동일성 쿼리 가능 필드의 저장 비용
  • 모범 사례
  • 메타데이터 컬렉션 압축
  • 메타데이터 압축 예약
  • 메타데이터 압축 실행

필드 수준 암호화에는 성능 및 스토리지 비용이 따릅니다. 암호화하도록 선택한 모든 필드:

  • 삽입 및 업데이트 작업에 쓰기를 추가합니다.

  • MongoDB는 쿼리 성능을 개선하기 위해 암호화된 필드의 인덱스를 유지하므로 추가 스토리지가 필요합니다.

This section summarizes the storage and write impact of encrypting collections, and explains how to compact encrypted collection indexes to minimize these costs. If you want to encrypt fields and configure them for querying, see Encrypted Fields and Enabled Queries.

Queryable Encryption은 무작위 암호화를 사용하여 문서의 민감한 필드를 암호화하는 동시에 암호화된 필드를 쿼리할 수 있는 기능을 도입합니다.

Queryable Encryption을 사용하면 지정된 일반 텍스트 값이 항상 다른 암호 텍스트로 암호화되면서 쿼리가 가능해집니다. 이 기능을 활성화하기 위해 Queryable Encryption은 세 가지 데이터 구조를 사용합니다.

  • 두 개의 메타데이터 컬렉션

  • 암호화된 collection에 있는 모든 문서의 필드입니다. __safeContent__

경고

이러한 데이터 구조를 수정하거나 삭제하지 않는 것이 중요하며, 그렇지 않으면 쿼리 결과가 부정확해질 수 있습니다.

암호화된 collection을 생성하면 MongoDB는 두 개의 메타데이터 컬렉션을 생성합니다.

  • enxcol_.<collectionName>.esc~로 지칭 ESC

  • enxcol_.<collectionName>.ecoc~로 지칭 ECOC

예제

" 환자 " 라는 컬렉션을 생성하는 경우 MongoDB는 다음과 같은 메타데이터 컬렉션을 생성합니다.

  • enxcol_.patients.esc

  • enxcol_.patients.ecoc

쿼리 가능한 암호화된 필드가 있는 문서를 삽입하면 MongoDB는 메타데이터 컬렉션을 업데이트하여 쿼리를 가능하게 하는 인덱스를 유지합니다. 해당 필드는 "인덱싱된 필드"가 됩니다. 이로 인해 해당 필드 모두에서 저장 및 쓰기 속도가 저하됩니다.

중요

암호화됨 컬렉션 을 삭제하는 경우 연결된 메타데이터 컬렉션을 즉시 삭제하세요.

  • enxcol_.<collectionName>.esc

  • enxcol_.<collectionName>.ecoc

그렇지 않으면 같은 이름의 컬렉션 을 다시 만들면 메타데이터 컬렉션이 충돌 상태 가 되어 과도한 저장 공간을 소비하고 CRUD 성능이 저하됩니다.

동일성 쿼리는 저장 및 쓰기 (write) 작업에 고정된 추가 비용을 수반합니다. 범위 쿼리 비용은 쿼리 가능 필드의 매개변수 에 따라 달라집니다. 이러한 쿼리를 엄격하게 제한하면 성능 영향 이 크게 줄어듭니다.

문서를 삽입할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 대한 두 번의 추가 쓰기가 필요합니다.

  • 1개의 쓰기 대상 ESC

  • 1개의 쓰기 대상 ECOC

예제

두 개의 인덱스 필드가 있는 문서를 삽입하려면 다음이 필요합니다.

  • 암호화된 collection에 한 번 쓰기.

  • 메타데이터 컬렉션에 네 번 쓰기.

문서를 업데이트할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 대한 두 번의 추가 쓰기가 필요합니다.

  • 1개의 쓰기 대상 ESC

  • 1개의 쓰기 대상 ECOC

예제

두 개의 인덱스 필드가 있는 문서를 업데이트하려면 다음이 필요합니다.

  • 암호화된 collection에 한 번 쓰기.

  • 메타데이터 컬렉션에 네 번 쓰기.

문서를 삭제할 때 인덱싱된 필드에는 추가 쓰기가 필요하지 않습니다.

메타데이터 압축 전에 및 ESC ECOC 에는 인덱싱된 모든 필드 의 모든 필드 /값 쌍에 대해 하나의 메타데이터 문서 가 포함됩니다.1000 문서에서 암호화됨 필드/값 쌍 하나를 인덱싱하려면 에 1000 문서가 필요하고 ESC 1000 에 개의 문서가 ECOC 필요합니다.

참고

모든 필드 를 암호화하는 Queryable Encryption 컬렉션 은 메타데이터 컬렉션을 설명하기 위해 저장 공간을 최대 2~3 배까지 차지할 수 있습니다. 예를 예시 1 GB 컬렉션 의 저장 요구 사항은 2~3 GB 일 수 있습니다.

  • 필요하지 않은 필드는 암호화하지 마세요. 대부분의 데이터는 개인 식별 정보가 포함된 필드와 같이 일부 필드만 암호화됨 하면 됩니다.

  • 사용자가 동일성 쿼리로 충분한 경우 필드 에서 범위 쿼리를 활성화 하지 마세요.

  • 범위 쿼리가 활성화 암호화됨 필드의 경우 필드 구성, 특히 최소, 최대정밀도 매개변수를 검토 합니다. 범위 쿼리에 대한 엄격한 경계를 설정하면 해당 필드가 성능에 영향 이 크게 줄어듭니다.

  • 데이터를 모델링 하고 프로토타입을 생성하여 배포서버 를 위한 실제 저장 및 쓰기 (write) 증가를 파악합니다.

문서를 삽입하거나 업데이트 하면 메타데이터 컬렉션이 변경되고 증가합니다. 메타데이터 컬렉션 압축 은 ECOC 을 비우고 ESC 의 크기를 줄입니다.

중요

최악의 경우 메타데이터 압축 을 실행 하면 이전 압축 이후 모든 문서에 삽입된 고유 필드 /값 쌍의 수가 표시됩니다.

For details on the exact information revealed by metadata compaction, see "Section 6: Theoretical Analysis" and "Section 9: Guidelines" in MongoDB's Queryable Encryption Technical Paper.

다음 정보를 추적 하는 것이 가장 좋습니다.

  • encfields: the number of encrypted fields per document.

  • docinserts: the number of documents inserted since the last compaction.

  • valinserts: the number of unique field/value pairs inserted since the last compaction.

ESC 메타데이터 컬렉션 의 크기를 최소 t 문서만큼 줄이려면 다음 수식이 충족될 때 메타데이터 압축 을 실행 합니다.

(encfields · docinserts) - valinsertst

문서 당 암호화됨 필드 수에 마지막 압축 이후 삽입 수를 곱한 값에서 마지막 압축 이후 모든 문서에 삽입된 고유 필드 /값 쌍의 수를 뺀 값은 다음 값에서 제거 문서 수보다 크거나 같아야 합니다. ESC.

예를 예시 , 6개의 암호화됨 필드가 있는 컬렉션 에서 마지막 압축 이후 삽입된 총 문서와 삽입된 고유 필드 /값 쌍이 다음 조건을 충족하면 ESC 문서의 크기를 최소 1000 개 줄일 수 있습니다.

(6 · docinserts) - valinserts1000

예를 예시 , 모든 문서에서 총 200 개의 고유 필드 /값 쌍이 있는 마지막 압축 이후 200 개의 문서가 삽입되었거나 마지막 압축 이후 400 문서가 700 2} 개의 문서가 삽입된 경우 공식이 충족됩니다. 고유 필드/값 쌍.

메타데이터 압축 을 수동으로 실행 해야 합니다. mongosh 를 사용하고 db.collection.compactStructuredEncryptionData() 명령을 실행 합니다.

예제

const eDB = "encryption"
const eKV = "__keyVault"
const secretDB = "records"
const secretCollection = "patients"
const localKey = fs.readFileSync("master-key.txt")
const localKeyProvider = { key: localKey }
const queryableEncryptionOpts = {
kmsProviders: { local: localKeyProvider },
keyVaultNamespace: `${eDB}.${eKV}`,
}
const encryptedClient = Mongo("localhost:27017", queryableEncryptionOpts)
const encryptedDB = encryptedClient.getDB(secretDB)
const encryptedCollection = encryptedDB.getCollection(secretCollection)
encryptedCollection.compactStructuredEncryptionData()
{
"stats": {
...
},
"ok": 1,
...
}

mongosh 를 사용하고 db.collection.totalSize() 명령을 실행 하여 메타데이터 컬렉션 의 크기를 확인할 수 있습니다.

예제

이 예제에서 암호화된 collection의 이름은 " 환자 " 입니다.

db.enxcol_.patients.esc.totalSize()
1407960328

돌아가기

생성 시 컬렉션 암호화