암호화된 컬렉션 관리
필드 수준 암호화의 성능과 저장 비용을 이해하는 것이 중요합니다. 각 암호화된 필드:
삽입 및 업데이트 작업에 쓰기를 추가합니다.
MongoDB가 암호화된 필드 인덱스를 유지 관리하므로 추가 스토리지가 필요합니다.
이 섹션에서는 작업당 쓰기를 나열하고 쓰기 및 스토리지 비용을 최소화할 수 있도록 암호화된 collection 인덱스를 압축하는 방법에 대해 설명합니다.
개요
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는 메타데이터 컬렉션을 업데이트하여 쿼리를 가능하게 하는 인덱스를 유지합니다. 해당 필드는 "인덱싱된 필드"가 됩니다. 이로 인해 해당 필드 모두에서 저장 및 쓰기 속도가 저하됩니다.
암호화된 collection 삭제
암호화된 컬렉션을 삭제하는 경우 연결된 메타데이터 컬렉션 enxcol_.<collectionName>.esc
및 enxcol_.<collectionName>.ecoc
이후에 즉시 삭제합니다. 그렇지 않으면 같은 이름의 collection을 다시 만들면 메타데이터 collection이 충돌 상태가 되어 과도한 저장 공간을 소비하고 CRUD 성능이 저하됩니다.
저장 공간 비용
저장 및 쓰기 비용은 문서당 인덱싱된 필드 수에 따라 증가합니다.
중요
Queryable Encryption 컬렉션은 메타데이터 컬렉션을 고려하여 문서 저장 요구 사항의 2~3배에 해당합니다. 예를 들어, 1 GB collection의 스토리지 요구 사항은 2-3 GB일 수 있습니다.
쓰기 비용
삽입 작업
문서를 삽입할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 대한 두 번의 추가 쓰기가 필요합니다.
1개의 쓰기 대상
ESC
1개의 쓰기 대상
ECOC
예시
두 개의 인덱스 필드가 있는 문서를 삽입하려면 다음이 필요합니다.
암호화된 collection에 한 번 쓰기.
메타데이터 컬렉션에 네 번 쓰기.
업데이트 작업
문서를 업데이트할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 대한 두 번의 추가 쓰기가 필요합니다.
1개의 쓰기 대상
ESC
1개의 쓰기 대상
ECOC
예시
두 개의 인덱스 필드가 있는 문서를 업데이트하려면 다음이 필요합니다.
암호화된 collection에 한 번 쓰기.
메타데이터 컬렉션에 네 번 쓰기.
삭제 작업
문서를 삭제할 때 인덱싱된 필드에는 추가 쓰기가 필요하지 않습니다.
메타데이터 컬렉션 압축
문서를 삽입하거나 업데이트하면 메타데이터 컬렉션이 변경되고 증가합니다. 메타데이터 컬렉션 압축은 메타데이터 컬렉션을 정리하고 크기를 줄입니다.
중요
메타데이터 컬렉션 압축을 수동으로 실행해야 합니다. 압축은 Queryable Encryption을 위해 구성된 클라이언트에서만 작동합니다.
ECOC
크기가 1GB를 초과하면 압축을 실행합니다.
mongosh
를 사용하고 db.collection.totalSize()
명령을 실행하여 컬렉션의 크기를 확인할 수 있습니다.
예시
이 예제에서 암호화된 collection의 이름은 " 환자 " 입니다.
db.enxcol_.patients.ecoc.totalSize()
1407960328
메타데이터 컬렉션 압축 을 실행 하려면 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, ... }