AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.

사용 중 암호화

사용 중 암호화라는 기능 세트를 사용하여 Node.js 드라이버로 특정 문서 필드를 암호화할 수 있습니다. 사용 중 암호화를 사용하면 애플리케이션에서 데이터를 MongoDB로 보내기 전에 암호화하고 암호화된 필드가 있는 문서를 쿼리할 수 있습니다.

경고

MongoDB 8.2 알려진 문제

mongocryptd 의 8.2.0 버전은 Windows 에서 실행 되지 않을 수 있습니다. 이 버그는 mongocryptd를 시작할 때 --logpath NUL 인수를 지정하는 경우 운전자 의 사용 중 암호화 영향을 줍니다.

이 문제와 해결 방법에 대해 자세히 학습하려면 MongoDB 8.2 의 알려진 문제 를 참조하세요. 릴리스 노트.

사용 중 암호화는 권한이 없는 사용자가 일반 텍스트 데이터가 MongoDB로 전송되거나 암호화된 데이터베이스에 있는 동안에는 볼 수 없도록 합니다. 애플리케이션에서 사용 중 암호화를 활성화하고 데이터 암호 해독 권한을 부여하려면 애플리케이션만 액세스할 수 있는 암호화 키를 만들어야 합니다. 암호화 키에 액세스할 수 있는 애플리케이션만 해독된 일반 텍스트 데이터에 액세스할 수 있습니다. 공격자가 데이터베이스에 액세스하는 경우 암호화 키에 대한 액세스 권한이 없기 때문에 암호화된 암호 텍스트 데이터만 볼 수 있습니다.

사용 중 암호화를 사용하여 다음과 같은 유형의 민감한 데이터가 포함된 MongoDB 문서의 필드를 암호화할 수 있습니다.

  • 신용 카드 번호

  • 주소

  • 건강 정보

  • 재무 정보

  • 기타 민감한 정보 또는 개인 식별 정보(PII)

MongoDB는 사용 중 암호화를 활성화하기 위해 다음과 같은 기능을 제공합니다.

Queryable Encryption(QE)은 사용 중 암호화 기능으로서 등호, 범위, 접두사, 접미사 및 부분 문자열 쿼리를 포함하여 암호화된 필드 값에 대한 쿼리를 실행할 수 있습니다. 범위 쿼리 지원에는 MongoDB Server 8.0 이상이 필요합니다. 접두사, 접미사 및 부분 문자열 쿼리 지원에는 MongoDB Server 9.0 이상이 필요합니다.

Queryable Encryption 에 학습 보려면 MongoDB Server 매뉴얼의 Queryable Encryption 을 참조하세요.

클라이언트 사이드 필드 레벨 암호화(CSFLE)는 MongoDB Server 버전 4.2에 도입되었으며, 암호화된 필드에 대한 동일성 검색을 지원합니다. CSFLE는 필드를 암호화하기 위해 결정론적 또는 무작위 암호화 알고리즘을 선택할 수 있다는 점에서 Queryable Encryption와 다릅니다. CSFLE를 사용하는 경우 결정론적 암호화 알고리즘을 사용하는 암호화된 필드만 쿼리할 수 있습니다. 무작위 암호화 알고리즘을 사용하여 CSFLE의 필드를 암호화하는 경우 해독할 수는 있지만 해당 필드에 대해 동일성 쿼리를 수행할 수는 없습니다. Queryable Encryption을 사용하면 암호화 알고리즘을 지정할 수 없지만 암호화된 모든 필드를 쿼리할 수 있습니다.

값을 결정론적으로 암호화하면 동일한 입력 값이 동일한 출력 값을 생성합니다. 결정론적 암호화를 사용하면 암호화된 필드에 대해 쿼리를 수행할 수 있지만 카디널리티가 낮은 암호화된 데이터는 빈도 분석으로 인한 코드 손상에 취약합니다.

팁

이러한 개념에 대해 자세히 알아보려면 다음 Wikipedia 항목을 참조하세요.

CSFLE에 대해 자세히 알아보려면 서버 매뉴얼에서 CSFLE를 참조하세요.

MongoDB Server 8.1부터는 사용 중 암호화 위해 구성된 클라이언트와 함께 $lookup 집계 단계를 사용할 수 있습니다. 이 기능 사용하려면 mongodb-client-encryption 패키지 버전 6.3.0 이상이 필요합니다.

$lookup 단계를 사용하면 애플리케이션 코드에서 수동으로 문서를 가져오고 결합할 필요 없이 암호화됨 컬렉션 전체에서 관련 데이터를 결합할 수 있습니다. 소스 컬렉션 과 from 컬렉션 모두 사용 중 암호화 사용하도록 구성해야 합니다. localField 및 foreignField 에 지정된 필드는 암호화됨 필드가 아니어야 합니다.

다음 예시 암호화됨 컬렉션 에 대한 $lookup 작업을 보여줍니다.

const pipeline = [ { $lookup: { from: "encryptedCollection", localField: "userId", foreignField: "_id", as: "userDetails" } }]; const results = await collection.aggregate(pipeline).toArray();

중요

$rerank 단계는 클라이언트 사이드 필드 레벨 암호화 또는 Queryable Encryption을 사용하여 자동 암호화하도록 구성된 클라이언트에서는 지원되지 않습니다. $rerank을(를) 포함하는 파이프라인은 Unrecognized pipeline stage name: '$rerank'와 같은 오류와 함께 실패합니다.

이 제한은 암호화된 필드가 없는 컬렉션을 포함한 모든 컬렉션과 $unionWith과 같은 하위 파이프라인 내에서 $rerank을 사용하는 경우에 적용됩니다.

Node.js 드라이버 버전 7.6부터 Node.js 드라이버가 키 관리 시스템(KMS)에 보내는 요청을 HTTP proxy를 통해서 라우팅할 수 있습니다. 사용자 환경에서 외부 KMS 트래픽이 HTTP 전진 프록시를 통해 지나가도록 할 필요가 있는 경우에 이 기능을 사용합니다. proxyOptions 설정은 SOCKS5 프로토콜만 지원하며, 이 경우는 지원하지 않습니다.

드라이버가 KMS 호스팅하다에 연결하는 방법을 제어하려면 ClientEncryptionOptions 객체 또는 AutoEncryptionOptions 객체에서 kmsConnectCallback 옵션을 설정합니다. 이 옵션을 설정하면 드라이버가 KMS 호스트에 직접 연결하는 대신에 사용자의 콜백을 호출합니다. 콜백은 다음 속성을 받습니다:

속성
설명

host

드라이버가 연결해야 하는 KMS 호스팅하다의 호스팅하다 이름.

port

드라이버가 연결해야 하는 KMS 호스트의 포트입니다.

timeoutMS

Node.js 드라이버 7.8 이상에서 더 이상 사용되지 않습니다. 이 속성은 아무런 효과가 없으며 향후 릴리스에서 제거될 예정입니다. 이전 드라이버 버전에서는 작업의 클라이언트 사이드 작업 시간 제한 예산에 남은 시간을 밀리초 단위로 포함했습니다.

signal

작업이 중단되면 중단되는 AbortSignal 입니다. 신호가 발생하면 콜백은 연결을 중지하고 거부해야 합니다.

다음 예시는 프록시에 HTTP CONNECT 요청을 보내여 KMS 호스트로 터널을 열고 콜백을 ClientEncryption 인스턴스로 전달하는 콜백을 정의합니다.

import * as net from "net"; const kmsConnectCallback = ({ host, port, signal }) => new Promise((resolve, reject) => { // Opens a plain connection to the proxy, not to the KMS host. // Passing signal lets Node abort the connection attempt when the // driver aborts the operation. const socket = net.connect({ host: "proxy.example.com", port: 8080, signal }); // Guards against a proxy that accepts the connection but stops // responding. The driver applies no timeout to the KMS connection, // so use an application-chosen idle timeout. It stays active after // the CONNECT exchange, so it also covers the TLS handshake and // KMS request that the driver performs over this socket. socket.setTimeout(10000, () => { socket.destroy(new Error("KMS connection timed out")); }); socket.once("error", reject); socket.once("connect", () => { // Asks the proxy to tunnel to the KMS host socket.write( `CONNECT ${host}:${port} HTTP/1.1\r\n` + `Host: ${host}:${port}\r\n\r\n` ); socket.once("data", chunk => { if (chunk.toString("utf8").startsWith("HTTP/1.1 200")) { // Returns the socket so that the driver can perform the // TLS handshake resolve(socket); } else { socket.destroy(); reject(new Error("Proxy refused the CONNECT request")); } }); }); }); const clientEncryption = new ClientEncryption(keyVaultClient, { keyVaultNamespace, kmsProviders, kmsConnectCallback});

signal 속성은 프록시 연결에 적용됩니다. 작업이 중단되면 신호가 발생하고 Node는 연결 시도를 중지합니다.

setTimeout() 호출은 연결을 수락하지만 응답을 중지하는 프록시로부터 보호합니다. 드라이버는 kmsConnectCallback 또는 후속 KMS 요청에 시간 제한을 적용하지 않습니다. 사용자가 선택한 유휴 시간 제한이 없으면 작업이 중단될 수 있습니다. 10 초 동안 소켓에 데이터가 도착하지 않으면 시간 제한이 발생합니다. CONNECT 교환 후에도 활성 상태를 유지하므로 TLS 핸드셰이크와 드라이버가 터널을 통해 보내는 KMS 요청도 포함합니다. 시간 제한이 발생하면 예시는 socket.destroy()에 오류를 전달하고, 이는 보류 중인 작업을 거부합니다. 드라이버는 각 KMS 요청 후에 소켓을 닫습니다.

이전 예시는 호출 시퀀스를 보여주기 위해 압축되어 있습니다. 사용 코드에서는 헤더 블록의 끝을 받을 때까지 프록시의 응답을 버퍼링하세요. 응답이 여러 청크에 걸쳐 도착할 수 있기 때문입니다.

중요

kmsConnectCallback 및 proxyOptions 옵션은 상호 배타적입니다. kmsConnectCallback을(를) 설정하고 proxyOptions에서 proxyHost 값을 지정하면 드라이버가 MongoCryptInvalidArgumentError를 발생시킵니다.