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

클라이언트 라이브러리 권장사항

이 페이지에서는 MongoDB 클라이언트 라이브러리를 사용할 때 애플리케이션 개발하기 위한 권장사항 설명합니다. 애플리케이션 신뢰할 수 없는 입력을 처리할 때 발생할 수 있는 주입 공격 및 기타 보안 문제의 위험을 줄이려면 다음 권장 사항을 따르세요.

배포서버 에서 지원하는 경우 표준 mongodb:// 형식 대신 mongodb+srv:// 연결 문자열 형식을 사용합니다. +srv 형식은 연결을 위해 자동으로 TLS(전송 계층 보안)를 활성화하여 기본값 으로 애플리케이션 과 MongoDB deployment 간의 트래픽을 암호화합니다. 표준 형식은 명시적으로 설정하다 하지 않는 한 TLS를 활성화 하지 않습니다.

+srv 형식은 또한 DNS SRV 기록 에서 시드 호스트의 전체 목록을 확인합니다. 기본 호스트가 변경될 때 연결 문자열 업데이트할 필요가 없습니다.

경고

드라이버는 원래 시드 호스트 이름과 동일한 상위 도메인을 주식 SRV 조회 결과를 신뢰합니다. 예시 를 들어 foo.example.com 에 대한 조회는 node1.foo.example.com을 반환할 수 있습니다. 또한 foo.example.com 하위에 있지 않더라도 example.com 상위 도메인을 공유하는 node1.example.com를 반환할 수도 있습니다.

악의적이거나 손상된 DNS 서버 연결 설정 중에 공격자가 제어하는 호스팅하다 로 애플리케이션 리디렉션하려고 시도할 수 있습니다. 상위 도메인 제약 조건은 이러한 위험을 제한합니다. 시드 호스트 이름의 상위 도메인이 클러스터 내 호스트 또는 신뢰할 수 있는 동일한 엔터티가 제어하는 클러스터로만 확인되는지 확인합니다.

자세한 학습 은 MongoDB Server 매뉴얼의 SRV 연결 형식 및 연결 문자열을 참조하세요.

많은 클라이언트 라이브러리는 예시 를 들어 확장 JSON 통해 JSON 문자열을 BSON 문서 로 변환하는 편리한 메서드를 제공합니다. 애플리케이션 이 결과 문서 유효성 검사 없이 쿼리, 업데이트 또는 명령에 전달하는 경우 공격자가 해당 작업의 의미를 변경할 수 있습니다.

JSON 요청 본문을 수락하고 문자열 값이 포함된 name 필드 예상하는 API 엔드포인트를 가정해 보겠습니다. 엔드포인트가 요청 본문을 BSON 으로 변환하고 유효성 검사 없이 쿼리 필터하다 에서 결과를 사용한다고 가정합니다. 공격자는 다음 예시 와 같이 예상 문자열 대신 객체 제출 수 있습니다.

{"name": {"$ne": null}}

MongoDB $ne 필드 리터럴 값이 아닌 쿼리 연산자 로 평가합니다. 이 필터하다 단일 문서 이름으로 일치시키는 대신, null이 아닌 name 필드 있는 모든 문서 일치시켜 의도한 것보다 더 많은 데이터를 노출합니다.

신뢰할 수 없는 입력을 BSON 으로 변환하기 전에 JSON 문자열로 연결하면 동일한 위험이 발생합니다. 다음 C++ 예시 문자열 연결을 사용하여 사용자가 제공한 값을 JSON 문자열에 삽입하는 방식으로 쿼리 필터하다 빌드합니다.

std::string json_query =
"{ \"name\": \"" + user_supplied_name + "\" }";
bsoncxx::document::value filter =
bsoncxx::from_json(json_query);
mongocxx::cursor cursor = collection.find(filter.view());

user_supplied_name에 큰따옴표 또는 JSON 연산자 포함되어 있으면 결과 문자열이 의도한 필드 값을 이스케이프 처리하고 임의의 쿼리 을 삽입할 수 있습니다.

이 위험은 JSON 문자열이 사용자, API 요청 또는 애플리케이션 제어할 수 없는 다른 소스에서 비롯될 때마다 적용됩니다. 이러한 위험을 줄이려면 신뢰할 수 없는 입력을 BSON 으로 변환하기 전에 유형을 확인하고 유효성을 검사합니다. 대부분의 드라이버는 쿼리를 빌드 데 사용할 수 있는 형식화된 문서 API 또는 쿼리 빌더를 제공합니다. 변환을 위해 JSON 입력을 허용하기 전에 애플리케이션 내에 JSON Schema 또는 유사한 유효성 검사 계층을 적용 할 수도 있습니다.

다음 예시 앞의 연결 예시 와 동일한 필터하다 빌드하지만 대신 형식이 지정된 문서 빌더를 사용합니다.

bsoncxx::builder::basic::document filter_builder;
filter_builder.append(
bsoncxx::builder::basic::kvp("name", user_supplied_name));
mongocxx::cursor cursor = collection.find(filter_builder.view());

빌더는 user_supplied_name 을 구문 분석할 문자열의 일부가 아닌 값으로 처리하기 때문에 이 값은 쿼리 의 구조를 변경할 수 없습니다.

문자열 대신 BSON 문서로 쿼리를 작성하면 공격자가 조작할 쿼리 문자열이 없기 때문에 기존의 SQL 인젝션을 방지할 수 있습니다. 자세한 학습 은 MongoDB Server 매뉴얼의 FAQ: MongoDB 기본 사항을 참조하세요. 확장 JSON 유형 및 변환에 대해 자세히 학습 보려면 MongoDB Server 매뉴얼에서 MongoDB 확장 JSON 참조하세요.

MongoDB supports operators and commands that execute JavaScript, including $where, $function, $accumulator, and mapReduce. When your application builds one of these expressions from user input, the server executes that input as code. This behavior creates the same class of risk as passing untrusted input to an eval function in application code.

이러한 위험을 줄이려면 다음 권장 사항을 따르세요.

  • 문자열 연결 방지: JavaScript 문자열에 신뢰할 수 없는 입력을 연결하거나 보간하여 $where 표현식, $function 본문 또는 $accumulator 함수를 빌드 하지 마세요. MongoDB JavaScript 실행하지 않고 평가하므로 대신 표준 쿼리 연산자를 사용하세요.

  • 서버 측 스크립팅 비활성화: 애플리케이션 $where, $function, $accumulator 또는 mapReduce를 사용하지 않는 경우 서버 측 스크립팅을 비활성화합니다.security.javascriptEnabled 구성 옵션을 false로 설정하거나 mongod 또는 mongos 프로세스 시작하고 --noscripting 옵션을 전달합니다.

서버 측 JavaScript 실행을 보호하는 방법에 대해 자세히 학습 보안 구성 옵션으로 MongoDB 실행을 참조하세요.

$where 연산자 에 대해 자세히 학습 MongoDB Server 매뉴얼의 $where를 참조하세요.

자체 관리형 배포서버의 보안에 대한 권장사항 목록은 MongoDB Server 매뉴얼의 보안 체크리스트를 참조하세요.