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

필드 암호화 및 쿼리 가능성

이 페이지의 내용

  • 개요
  • 암호화할 필드 지정
  • 예시
  • 쿼리 가능 암호화 필드 지정
  • 예시
  • Queryable Encryption 활성화
  • 쿼리 유형
  • 쿼리 사용 시 고려 사항

이 가이드에서는 다음과 같은 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에 추가하여 patientIdpatientInfo.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"
},
]
}

쿼리 유형에 대한 자세한 내용은 쿼리 유형을 참조하세요 .

다음과 같은 방법으로 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 수정하지 마세요.

돌아가기

Fundamentals