์ํธํ ์คํค๋ง
์ด ํ์ด์ง์ ๋ด์ฉ
๊ฐ์
์ด ํ์ด์ง์์๋ ์๋ CSFLE(ํด๋ผ์ด์ธํธ ์ธก ํ๋ ๋ ๋ฒจ ์ํธํ)๋ฅผ ์ํ ์ํธํ ์คํค๋ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ CSFLE ๋น ๋ฅธ ์์์์ ์ฌ์ฉ๋๋ ์ํธํ ์คํค๋ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ํธํ ์คํค๋ง
JSON schema 4 ์ํธํ ์คํค๋ง๋ JSON ์ด์ ํ์ค ๊ตฌ๋ฌธ ์ ์๊ฒฉํ ํ์ ์งํฉ์ ์ฌ์ฉํ๋ encrypt
encryptMetadata
๊ฐ์ฒด์
๋๋ค. ๋ฐ ํค์๋์ ํจ๊ป CSFLE ์ง์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฌธ์๋ฅผ ์ํธํํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ ์ํธํ ๊ท์น ์ ์ ์ํฉ๋๋ค.
์ํธํ ๊ท์น์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋๋ฅผ ์ํธํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ JSON ํค-๊ฐ ์์ ๋๋ค. ์ํธํ ๊ท์น์์ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํ๊ฑฐ๋ ์์ํด์ผ ํฉ๋๋ค.
ํ๋๋ฅผ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ
ํด๋ผ์ด์ธํธ๊ฐ ํ๋๋ฅผ ์ํธํํ๋ ๋ฐ ์ฌ์ฉํ๋ DEK(๋ฐ์ดํฐ ์ํธํ ํค)
ํ๋์ BSON ์ ํ
์ํธํ ๊ท์น์๋ encrypt
๋๋ encryptMetadata
ํค์๋๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
์ํธํ ์คํค๋ง์์ ์ ์ํ ์ ์๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ํ๋ ๋ฐ ์ํธํ ์ ํ์ ์ฐธ์กฐํ์ธ์.
๋ฐ์ดํฐ ์ํธํ ํค์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ํค ๋ฐ ํค ๋ณผํธ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ํธํ ํค์๋
encrypt
ํค์๋๋ BSON ๋ฌธ์์ ๋จ์ผ ํ๋์ ๋ํ ์ํธํ ๊ท์น์ ์ ์ํฉ๋๋ค. encrypt
ํค์๋๊ฐ ํฌํจ๋ ์ํธํ ๊ท์น์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"<field-name-to-encrypt>": { "encrypt": { "algorithm": "<encryption algorithm to use>", "bsonType": "<bson type of field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] } }
์ํธํ ๋ฉํ๋ฐ์ดํฐ ํค์๋
encryptMetadata
ํค์๋๋ ํ์ properties
ํ๊ทธ์ ํ์ ์์๊ฐ ์์ํ๋ ์ํธํ ๊ท์น์ ์ ์ํฉ๋๋ค. encryptMetadata
๋ฅผ ํฌํจํ๋ ์ํธํ ๊ท์น์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"bsonType": "object", "encryptMetadata": { "algorithm": "<encryption algorithm inherited by children of properties field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] }, "properties": { <object to inherit encryptMetadata values> }
patternProperties ํค์๋
์ํธํ ์คํค๋ง์์ patternProperties
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ท ํํ์๊ณผ ์ผ์นํ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ชจ๋ ํ๋์ ๋ํ ์ํธํ ๊ท์น์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋จ์ผ ์ ๊ท ํํ์์ ๊ธฐ๋ฐ์ผ๋ก ์ํธํํ ํ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์ง์ ํ๊ฑฐ๋ ํ๋ ์ด๋ฆ์ ์ผ๋ถ๋ง ์ฌ์ฉํ์ฌ ์ง์ ํ ์ ์์ต๋๋ค. patternProperties
ํค์๋๋ ์ํธํ ์คํค๋ง์์ properties
์(๋ฅผ) ๋์ฒดํฉ๋๋ค.
๋ค์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ patternProperties
๋ก ์ํธํ ๊ท์น์ ์ง์ ํฉ๋๋ค.
"bsonType": "object", "patternProperties": { "<regular expression to match>": { "encrypt": { "algorithm": "<encryption algorithm to use>", "bsonType": "<bson type of field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] } }
patternProperties
์ฌ์ฉ ๋ฐฉ๋ฒ์ ์๋ ์ํธํ ์คํค๋ง - ํจํด ์์ฑ์ ์ฌ์ฉํ ์ํธํ๋ฅผ์ฐธ์กฐํ์ธ์.
์์
์ด ์์์๋ CSFLE ๋น ๋ฅธ ์์ ์ ๋ฌธ์์ ๋ํ ์ํธํ ์คํค๋ง ์์ฑ ๋จ๊ณ์์ ์ฌ์ฉ๋๋ ์ํธํ ์คํค๋ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๋น ๋ฅธ ์์์์๋ ๋ค์ ๊ตฌ์กฐ์ ๋ฌธ์๋ฅผ medicalRecords
๋ฐ์ดํฐ๋ฒ ์ด์ค์ patients
collection์ ์ฝ์
ํฉ๋๋ค.
{ "_id": { "$oid": "<_id of your document>" }, "name": "<name of patient>", "ssn": <integer>, "bloodType": "<blood type>", "medicalRecords": [ { "weight": <integer>, "bloodPressure": "<blood pressure>" } ], "insurance": { "provider": "<provider name>", "policyNumber": <integer> } }
๋ค์์คํ์ด์ค ์ง์
์ํธํ ์คํค๋ง์ ๋ฃจํธ์์ ์ํธํ ์คํค๋ง๊ฐ ์ ์ฉ๋๋ ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํฉ๋๋ค. medicalRecords
๋ฐ์ดํฐ๋ฒ ์ด์ค์ patients
collection์ ์๋ ๋ฌธ์๋ฅผ ์ํธํํ๊ณ ํด๋
ํ๋ ค๋ฉด ๋ค์์ ์ง์ ํฉ๋๋ค.
{ "medicalRecords.patients": { <the schema created in the following steps of this example> } }
๋ฐ์ดํฐ ์ํธํ ํค ์ง์
์ด ๋น ๋ฅธ ์์์์๋ ๋จ์ผ DEK(๋ฐ์ดํฐ ์ํธํ ํค)๋ก ๋ฌธ์์ ๋ชจ๋ ํ๋๋ฅผ ์ํธํํฉ๋๋ค. ์ํธํ ๋ฐ ์ํธ ํด๋
์ ๋จ์ผ DEK๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฌธ์์ ๋ชจ๋ ํ๋๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ํธํ ์คํค๋ง์ ๋ฃจํธ์์ encryptMetadata
ํค์๋์ ํจ๊ป DEK์ _id
๋ฅผ ์ง์ ํฉ๋๋ค.
{ "medicalRecords.patients": { "bsonType": "object", "encryptMetadata": { "keyId": [UUID("<_id of your Data Encryption Key>" )] }, "properties": { <the schema created in the following steps of this example> } } }
์ํธํ ๊ท์น ์ ํ
๋ค์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ค์ ํ๋๋ฅผ ์ํธํํ๊ธฐ๋ก ๊ฒฐ์ ํฉ๋๋ค.
ํ๋ ์ด๋ฆ | ์ํธํ ์๊ณ ๋ฆฌ์ฆ | BSON ์ ํ |
---|---|---|
| ๊ฒฐ์ ๋ก ์ | Int |
| ๋๋ค | ๋ฌธ์์ด |
| ๋๋ค | ๋ฐฐ์ด |
| ๊ฒฐ์ ๋ก ์ | Int |
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ฒฐ์ ๋ก ์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ ssn
๋ฐ insurance.policyNumber
ํ๋๋ฅผ ์ํธํํ๊ธฐ๋ก ์ ํํฉ๋๋ค.
์ด๋ฌํ ํ๋์ ๋ํด ์ฟผ๋ฆฌํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ด๋ฌํ ํ๋์ ๊ฐ์ ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ผ๋ฏ๋ก ์ด ๋ฐ์ดํฐ๋ ๋น๋ ๋ถ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๋ฌด์์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ bloodType
ํ๋๋ฅผ ์ํธํํ๊ธฐ๋ก ์ ํํฉ๋๋ค.
์ด ํ๋์ ๋ํด ์ฟผ๋ฆฌํ ๊ณํ์ด ์์ต๋๋ค.
์ด ํ๋์ ๊ฐ์ ์นด๋๋๋ฆฌํฐ๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๊ฒฐ์ ๋ก ์ ์ผ๋ก ์ํธํํ ๊ฒฝ์ฐ ๋น๋ ๋ถ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค.
CSFLE๋ array
์ ํ์ ํ๋์ ๋ํ ๊ฒฐ์ ๋ก ์ ์ํธํ๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก ๋ฌด์์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ medicalRecords
ํ๋๋ฅผ ์ํธํํด์ผ ํฉ๋๋ค.
ํ
์ง์๋๋ ์๋ ์ํธํ ์์ ๊ณผ ์ง์๋์ง ์๋ ์๋ ์ํธํ ์์ ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ์๋ ์ํธํ์ ์ง์๋๋ ์์ ์ ์ฐธ์กฐํ์ธ์.
์ํธํ ๊ท์น ์ง์
๊ฒฐ์ ๋ก ์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ ssn
ํ๋๋ฅผ ์ํธํํ๋ ค๋ฉด ์ํธํ ์คํค๋ง์ ๋ค์์ ์ง์ ํฉ๋๋ค.
"ssn": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }
๋ฌด์์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ bloodType
ํ๋๋ฅผ ์ํธํํ๋ ค๋ฉด ์ํธํ ์คํค๋ง์์ ๋ค์์ ์ง์ ํฉ๋๋ค.
"bloodType": { "encrypt": { "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }
๋ฌด์์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ medicalRecords
ํ๋๋ฅผ ์ํธํํ๋ ค๋ฉด ์ํธํ ์คํค๋ง์์ ๋ค์์ ์ง์ ํฉ๋๋ค.
"medicalRecords": { "encrypt": { "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }
๊ฒฐ์ ๋ก ์ ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ insurance.policyNumber
ํ๋๋ฅผ ์ํธํํ๋ ค๋ฉด ์ํธํ ์คํค๋ง์ ๋ค์์ ์ง์ ํฉ๋๋ค.
"insurance": { "bsonType": "object", "properties": { "policyNumber": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } }
์ ์ฒด ์คํค๋ง ๋ณด๊ธฐ
์ด Quick Start์ ์ ์ฒด ์ํธํ ์คํค๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
{ "medicalRecords.patients": { "bsonType": "object", "encryptMetadata": { "keyId": [UUID("<_id of your Data Encryption Key>" )] }, "properties": { "insurance": { "bsonType": "object", "properties": { "policyNumber": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } }, "medicalRecords": { "encrypt": { "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "bloodType": { "encrypt": { "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "ssn": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } }
์์ธํ ์์๋ณด๊ธฐ
์ํธํ ์คํค๋ง์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด CSFLE ์ํธํ ์คํค๋ง๋ฅผ ์ฐธ์กฐํ์ธ์.
์๋ ์ํธํ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ์๋ ์ํธํ๋ฅผ ์ฐธ์กฐํ์ธ์ .
๋น ๋ฅธ ์์์ ๋ณด๋ ค๋ฉด ๋น ๋ฅธ ์์์ ์ฐธ์กฐํ์ธ์.