필드 암호화 및 쿼리 가능성
개요
이 가이드에서는 다음과 같은 Queryable Encryption 주제에 대해 알아볼 수 있습니다.
암호화할 필드를 지정하는 방법입니다.
collection을 만들 때 암호화된 필드를 쿼리할 수 있는지 여부를 지정하는 방법.
쿼리 유형 및 암호화된 필드에 사용할 수 있는 쿼리 유형입니다.
암호화된 필드에 쿼리를 사용할지 여부를 결정할 때 고려해야 할 사항입니다.
암호화할 필드 지정
Queryable Encryption을 사용하면 MongoDB 문서에서 자동으로 암호화할 필드를 지정할 수 있습니다.
중요
_id
필드를 제외하고 문서에서 암호화할 필드를 지정할 수 있습니다.
암호화 및 쿼리를 위한 필드를 지정하려면 다음 속성을 포함하는 JSON schema를 정의하세요.
키 이름 | 유형 | 필수 사항입니다. |
---|---|---|
path | 문자열 | 필수 사항 |
bsonType | 문자열 | 필수 사항 |
keyId | 바이너리 | 필수 사항 |
queries | 객체 | 선택 사항, 필드를 쿼리할 수 있도록 하려는 경우가 아니라면 생략합니다. |
예시
이 예제에서는 Queryable Encryption 기능이 자동으로 암호화해야 하는 필드를 지정하는 JSON schema를 만드는 방법을 보여 줍니다.
개인 식별 정보(PII), 신용 카드 정보 및 민감한 의료 정보가 포함된 다음 문서를 고려해 보세요.
{ "firstName": "Jon", "lastName": "Snow", "patientId": 12345187, "address": "123 Cherry Ave", "medications": [ "Adderal", "Lipitor" ], "patientInfo": { "ssn": "921-12-1234", "billing": { "type": "visa", "number": "1234-1234-1234-1234" } } }
PII와 민감한 의료 정보를 안전하게 보호하려면 해당 필드를 자동으로 암호화하도록 Queryable Encryption을 구성하는 JSON schema를 생성하세요. 다음 샘플 JSON schema는 암호화할 필드를 지정하는 방법을 보여줍니다.
const encryptedFieldsObject = { fields: [ { path: "patientId", keyId: "<unique data encryption key>", bsonType: "int" }, { path: "patientInfo.ssn", keyId: "<unique data encryption key>", bsonType: "string" }, { path: "medications", keyId: "<unique data encryption key>", bsonType: "array" }, { path: "patientInfo.billing", keyId: "<unique data encryption key>", bsonType: "object" }, ] }
keyId
필드 에는 Queryable Encryption 이 필드를 암호화하는 데 사용하는 고유한 DEK 가 필요합니다. DEK에 대한 자세한 내용은 암호화 키 관리를 참조하세요.
쿼리 가능 암호화 필드 지정
JSON schema에서 쿼리 가능하게 만들 필드에 queries
속성을 포함합니다. 이를 통해 권한이 부여된 클라이언트는 암호화된 필드를 사용하여 읽기 및 쓰기 쿼리를 실행할 수 있습니다. 필드를 쿼리하려는 경우가 아니라면 queries
속성을 생략할 수 있습니다.
예시
다음 코드 스니펫은 queries
속성을 JSON schema에 추가하여 patientId
및 patientInfo.ssn
필드를 쿼리 가능하게 만드는 방법을 보여줍니다.
const encryptedFieldsObject = { fields: [ { path: "patientId", keyId: "<unique data encryption key>", bsonType: "int", queries: { queryType: "equality" } }, { path: "patientInfo.ssn", keyId: "<unique data encryption key>", bsonType: "string", queries: { queryType: "equality" } }, { path: "medications", keyId: "<unique data encryption key>", bsonType: "array" }, { path: "patientInfo.billing", keyId: "<unique data encryption key>", bsonType: "object" }, ] }
쿼리 유형에 대한 자세한 내용은 쿼리 유형을 참조하세요 .
Queryable Encryption 활성화
다음과 같은 방법으로 JSON schema에서 지정한 필드에 Queryable Encryption을 활성화할 수 있습니다.
다음 코드 스니펫에 표시된 대로 애플리케이션이 collection을 생성하는 데 사용하는 클라이언트에
encryptedFieldsObject
상수로 표시되는 JSON schema를 전달합니다.
const client = new MongoClient(uri, { autoEncryption: { keyVaultNameSpace: "<your keyvault namespace>", kmsProviders: "<your kms provider>", extraOptions: { cryptSharedLibPath: "<path to FLE Shared Library>" }, encryptedFieldsMap: { "<databaseName.collectionName>": { encryptedFieldsObject } } } ... await client.db("<database name>").createCollection("<collection name>"); }
참고
collection을 생성하기 전에 Queryable Encryption을 활성화하는 것이 중요합니다. collection을 생성한 후 Queryable Encryption을 활성화해도 해당 collection에 이미 있던 문서의 필드는 암호화되지 않습니다.
autoEncryption
구성 옵션에 대한 자세한 내용은 Queryable Encryption용 MongoClient 옵션 섹션을 참조하세요.
다음 코드 스니펫에 표시된 대로 암호화된 필드 객체를 호출에 전달하여 새 collection을 생성합니다.
await encryptedDB.createCollection("<collection name>", { encryptedFields: encryptedFieldsObject });
팁
최고 수준의 보안을 위해 collection을 생성할 때와 collection에 액세스하기 위해 클라이언트를 생성할 때 모두 암호화된 필드를 지정합니다. 이렇게 하면 서버의 보안이 손상되더라도 정보는 클라이언트를 통해 계속 암호화됩니다.
중요
MongoDB는 삽입 작업을 통해 collection을 암시적으로 생성하는 것보다 Queryable Encryption을 사용할 때 명시적으로 collection을 생성할 것을 권장합니다. createCollection()
을 사용하여 collection을 생성하면 작업은 암호화된 필드에 인덱스를 생성합니다. 인덱스가 없으면 암호화된 필드에 대한 쿼리가 느리게 실행될 수 있습니다.
쿼리 유형
Queryable Encryption을 사용하면 암호화된 필드 객체의 queries
옵션에 쿼리 유형을 전달하여 쿼리를 활성화할 필드를 지정할 수 있습니다.
Queryable Encryption은 현재 none
또는 equality
쿼리 유형을 지원합니다. MongoDB 6.0 Queryable Encryption의 일부로 도입된 새로운 암호화 프레임워크는 범위 및 문자열 연산자와 같은 표현력이 풍부한 암호화 검색을 추가로 수용하도록 설계되었습니다.
쿼리 유형이 none
이면 데이터가 암호화되지만 쿼리할 수 있도록 의도되지 않았음을 나타냅니다. 쿼리 유형이 none
인 암호화된 데이터에 대해서는 쿼리를 실행할 수 없습니다. 다음에서 쿼리가 실행되는 경우 암호화된 데이터가 반환됩니다.
암호화되지 않은 필드
필드는 쿼리 유형이
equality
인 동일한 collection에 있으며 클라이언트에서 해독됩니다.
중요
쿼리 유형 지정 없음
쿼리 유형을 명시적으로 지정하지 않으면 쿼리 유형의 기본값은 none
이며, 데이터를 쿼리할 수 없습니다.
equality
쿼리 유형을 사용하면 다음 표현식을 사용하여 암호화된 필드를 쿼리할 수 있습니다.
참고
암호화된 필드를 null
또는 정규 표현식과 비교하는 쿼리는 지원되는 쿼리 연산자를 사용하는 경우에도 오류가 발생합니다.
equality
쿼리 유형을 사용한 Queryable Encryption은 암호화된 필드를 다음 BSON types 중 하나와 비교할 때 필드에 대한 읽기 또는 쓰기 작업을 지원하지 않습니다.
double
decimal128
object
array
javascriptWithScope
(지원 중단됨)
쿼리 사용 시 고려 사항
Queryable Encryption을 사용하면 암호화된 필드를 쿼리 가능하게 만들지 여부를 선택할 수 있습니다. 읽기 작업이나 암호화된 필드를 읽어야 하는 쓰기 작업을 수행할 필요가 없는 경우 해당 필드에서 쿼리를 활성화하지 않도록 결정할 수 있습니다. 쿼리 가능하거나 암호화되지 않은 다른 필드를 쿼리하여 전체 문서를 검색할 수 있습니다.
암호화된 필드를 쿼리 가능하게 설정하면 Queryable Encryption은 암호화된 각 필드에 대한 인덱스를 생성하므로 해당 필드에 대한 쓰기 작업이 더 오래 걸릴 수 있습니다. 쓰기 작업이 인덱싱된 필드를 업데이트하면 MongoDB도 관련 인덱스를 업데이트합니다.
암호화된 필드에 대한 쿼리를 활성화하면 컬렉션에 더 많은 저장 공간이 필요합니다. enxcol_.
로 시작하는 이러한 collection 이름에는 중요한 암호화 메타데이터가 포함되어 있습니다.
경고
enxcol_.
로 시작하는 collection 수정하지 마세요.