암호화된 컬렉션 관리
이 가이드에서는 암호화된 collection을 managed하는 방법, Queryable Encryption의 저장 및 쓰기 비용에 대해 알아볼 수 있습니다.
개요
Queryable Encryption은 무작위 암호화를 사용하여 문서의 민감한 필드를 암호화하는 동시에 암호화된 필드를 쿼리할 수 있는 기능을 도입합니다.
Queryable Encryption을 사용하면 지정된 일반 텍스트 값이 항상 다른 암호 텍스트로 암호화되면서 쿼리가 가능해집니다. 이 기능을 활성화하기 위해 Queryable Encryption은 네 가지 데이터 구조를 사용합니다.
세 가지 메타데이터 컬렉션
암호화된 collection에 있는 모든 문서의 필드입니다.
__safeContent__
중요
이러한 데이터 구조를 수정하거나 삭제하지 않는 것이 중요하며, 그렇지 않으면 쿼리 결과 가 부정확해질 수 있습니다 .
메타데이터 컬렉션
Queryable Encryption을 사용하여 암호화된 collection을 생성하면 MongoDB는 세 개의 메타데이터 collection을 생성합니다.
enxcol_.<collectionName>.esc
~로 지칭ESC
enxcol_.<collectionName>.ecc
~로 지칭ECC
enxcol_.<collectionName>.ecoc
~로 지칭ECOC
예시
" 환자 " 라는 컬렉션을 생성하는 경우 MongoDB는 다음과 같은 메타데이터 컬렉션을 생성합니다.
enxcol_.patients.esc
enxcol_.patients.ecc
enxcol_.patients.ecoc
쿼리하려는 암호화된 필드가 있는 문서를 삽입하면 MongoDB는 쿼리할 수 있는 인덱스를 유지하기 위해 메타데이터 컬렉션을 업데이트합니다. MongoDB는 이를 "인덱싱된 필드"라고 합니다. 이는 저장 및 쓰기 속도를 희생합니다.
저장 공간 비용
저장 및 쓰기 비용은 문서당 인덱싱된 필드 수에 따라 증가합니다.
중요
테크니컬 프리뷰
테크니컬 프리뷰에서 MongoDB의 지침은 Queryable Encryption collection 및 관련 메타데이터 컬렉션에 필요한 스토리지 요구 사항의 2~3배를 예상하는 것입니다. 예를 들어, 1GB collection의 경우 관련 메타데이터 컬렉션에 2~3GB의 저장 용량이 필요할 수 있습니다.
이 지침은 향후 릴리스에서 조정될 예정입니다.
쓰기 비용
삽입 작업
문서를 삽입할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 대한 두 번의 쓰기가 필요합니다.
1개의 쓰기 대상
ESC
1개의 쓰기 대상
ECOC
예시
두 개의 인덱스 필드가 있는 문서를 삽입하려면 다음이 필요합니다.
암호화된 collection에 한 번 쓰기.
메타데이터 컬렉션에 네 번 쓰기.
업데이트 작업
문서를 업데이트할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 네 번의 쓰기가 필요합니다.
1개의 쓰기 대상
ESC
1개의 쓰기 대상
ECC
다음에 두 번 쓰기
ECOC
예시
두 개의 인덱스 필드가 있는 문서를 업데이트하려면 다음이 필요합니다.
암호화된 collection에 한 번 쓰기.
메타데이터 컬렉션에 대한 쓰기 8건입니다.
삭제 작업
문서를 삭제할 때 인덱싱된 각 필드에는 메타데이터 컬렉션에 대한 두 번의 쓰기가 필요합니다.
1개의 쓰기 대상
ECC
1개의 쓰기 대상
ECOC
예시
두 개의 인덱스 필드가 있는 문서를 삭제하려면 다음이 필요합니다.
암호화된 collection에 한 번 쓰기.
메타데이터 컬렉션에 네 번 쓰기.
인덱스 압축
중요
테크니컬 프리뷰
기술 미리 보기 중에 인덱스 압축을 실행해야 합니다. MongoDB는 향후 릴리스에서 인덱스 압축을 자동으로 실행할 계획입니다.
문서를 삽입, 업데이트 및 삭제하면 메타데이터 컬렉션 변경되고 증가합니다. 인덱스 압축은 메타데이터 컬렉션을 정리하고 크기를 줄이는 프로세스입니다.
ECOC
크기가 1GB를 초과하는 경우 인덱스 압축을 실행해야 합니다.
컬렉션의 크기는 mongosh
를 사용하고 db.collection.totalSize()
명령을 실행하여 확인할 수 있습니다.
예시
이 예제에서 암호화된 collection의 이름은 " 환자 " 입니다.
db.enxcol_.patients.ecoc.totalSize()
1407960328
중요
인덱스 압축을 실행하려면 Queryable Encryption을 위해 클라이언트를 구성해야 합니다.
인덱스 압축을 실행하려면 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, ... }