연결에서 TLS 활성화
이 페이지의 내용
개요
이 가이드에서는 TLS 보안 프로토콜을 사용해 MongoDB 인스턴스에 연결하는 방법을 배울 수 있습니다.
TLS를 사용하도록 연결을 구성하려면 TLS 옵션을 활성화하고 유효성 검사를 위해 인증서를 제공합니다.
팁
TLS에 학습 보려면 전송 계층 보안에 대한 Wikipedia 항목을 참조하세요.
TLS 활성화
다음과 같은 방법으로 MongoDB 인스턴스에 대한 연결에서 TLS를 활성화할 수 있습니다:
MongoClientOptions
객체에서tls
옵션을true
(으)로 설정연결 문자열에서
tls
옵션을true
(으)로 설정
MongoClientOptions
객체에서 tls
를 true
로 설정하면 MongoClient
인스턴스가 TLS와 연결할 수 있습니다.
const client = new MongoClient(uri, { tls: true });
연결 string 에서 tls
옵션을 true
로 설정하면 MongoClient
인스턴스를 TLS로 연결할 수 있습니다.
const uri = "mongodb://<hostname>:<port>?tls=true"; const client = new MongoClient(uri, myClientSettings);
참고
연결 문자열에 +srv
수정을 지정하여 MongoDB에 연결할 때 DNS SRV 기록을 사용하는 경우에는 기본적으로 연결에서 TLS를 활성화하게 됩니다. 이를 비활성화하려면 연결 문자열 또는 MongoClientOptions
객체에서 tls
또는 ssl
매개변수 값을 false
로 설정하세요.
DNS 시드 목록을 사용할 때의 연결 동작에 대한 자세한 내용은 서버 매뉴얼의 SRV 연결 형식 섹션을 참조하세요.
참고
'안전하지 않은 레거시 재협상 비활성화됨' 오류에 대한 해결 방법
Node.js 운전자 는 기본값 으로 OpenSSL에 의존합니다. 오래된 SSL 프록시는 OpenSSL 3.0 이상을 사용하는 환경에서 unsafe legacy renegotiation disabled
오류를 일으킬 수 있습니다. 다음 예시 와 같이 SSL_OP_LEGACY_SERVER_CONNECT
옵션을 설정하여 이 오류를 해결할 수 있습니다.
import { MongoClient } from 'mongodb'; import crypto from 'crypto'; const client = new MongoClient("mongodb+srv://...", { secureContext: { secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT } });
드라이버는 tls
클라이언트 옵션 외에도 연결에 TLS를 구성할 수 있는 옵션을 다양하게 제공합니다. 테스트 목적으로 tlsAllowInvalidHostnames
, tlsAllowInvalidCertificates
및 tlsInsecure
클라이언트 옵션을 설정할 수 있습니다.
tlsAllowInvalidHostnames
옵션을 true
로 설정하면 호스트 이름 확인이 비활성화되며, tlsAllowInvalidCertificates
를 true
로 설정하면 인증서 유효성 검사가 비활성화됩니다. tlsInsecure
옵션을 true
로 설정하면 인증서 및 호스트 이름 유효성 검사를 모두 비활성화합니다.
경고
프로덕션 환경에서 이러한 옵션을 지정하면 애플리케이션이 안전하지 않고 만료된 인증서 및 유효한 클라이언트 인스턴스로 위장하는 외부 프로세스에 잠재적으로 취약해집니다.
클라이언트 옵션의 전체 목록은 연결 옵션을 참조하세요.
인증서 구성
TLS 요청을 성공적으로 시작하려면 애플리케이션은 암호화 인증서를 참조해 ID를 증명해야 합니다. TLS로 MongoDB에 연결하려면 인증서를 PEM 파일로 저장해야 합니다.
중요
프로덕션 용도의 경우 MongoDB 배포는 동일한 인증 기관에서 생성하고 서명한 유효한 인증서를 사용하는 것이 좋습니다. 테스트를 위해 자체 서명된 인증서를 사용할 수 있습니다.
다음 목록에서는 TLS와의 연결을 설정하는 데 필요한 구성 요소를 설명합니다.
TLS 구성 요소 | 설명 |
---|---|
인증 기관(CA) | TLS 연결을 만들 때 신뢰할 수 있는 하나 인증 기관입니다. |
클라이언트 인증서 | 서버가 애플리케이션의 신원을 확인하여 암호화된 네트워크 연결을 설정할 수 있도록 하는 디지털 인증서 및 키입니다. |
인증서 키 | 클라이언트 인증서 비공개 키 파일입니다. 해당 키는 인증서 파일 자체에 포함되어 있는 경우가 많습니다. |
암호 구문 | 개인 클라이언트 키가 암호화된 경우 복호화하기 위한 비밀번호입니다. |
팁
PEM 형식에 대해 자세히 알아보려면 개인정보 보호 강화 메일에 대한 Wikipedia 항목을 참조하세요.
클라이언트의 참조 인증서
클라이언트가 연결되기 전에 서버에서 인증서를 검증할 수 있도록 MongoClientOptions
객체의 인증서를 참조해야 합니다. 다음과 같은 방법으로 인증서를 참조할 수 있습니다.
인증서를 저장할
SecureContext
객체 만들기(권장)인증서를 가리키는 파일 경로 문자열을 제공합니다.
인증서를 저장할
Buffer
객체 만들기
인증서를 저장할 SecureContext 객체 만들기
TLS 연결을 구성하려면 secureContext
옵션을 사용하는 것이 좋습니다. SecureContext
객체는 Node.js 고유의 객체이므로 모든 TLS 옵션을 재사용 가능한 단일 객체에 보관할 수 있습니다.
SecureContext
객체를 만들려면 tls
모듈에서 createSecureContext()
메서드를 가져옵니다. 다음으로, createSecureContext()
메서드를 호출하고 옵션 매개변수에 인증서 내용을 전달합니다. 이 메서드는 MongoClientOptions
객체에서 사용할 수 있는 SecureContext
객체를 반환합니다.
다음 코드는 SecureContext
객체를 만들어 클라이언트에 전달하는 방법을 보여 줍니다:
// Create a SecureContext object const secureContext = tls.createSecureContext({ ca: fs.readFileSync(`<path to CA certificate>`), cert: fs.readFileSync(`<path to public client certificate>`), key: fs.readFileSync(`<path to private client key>`), }); // Pass the SecureContext as a client option const client = new MongoClient(uri, { tls: true, secureContext });
createSecureContext()
메서드 및 tls
패키지에 대해 자세히 알아보려면 Node.js TLS API 설명서를 참조하세요.
SecureContext
객체를 사용하는 실행 가능한 예시는 SecureContext 예시를 참조하세요.
인증서 파일 경로 제공
TLS에 연결하는 동안 인증서를 검색하기 위해 클라이언트 옵션으로 인증서의 파일 경로를 포함할 수 있습니다. MongoClient
인스턴스에서 connect()
메서드를 호출하면 드라이버가 이러한 파일을 읽습니다.
다음 코드는 MongoClient
에서 인증서 파일 경로를 옵션으로 제공하는 방법을 보여줍니다.
// Pass filepaths as client options const client = new MongoClient(uri, { tls: true, tlsCAFile: `<path to CA certificate>`, tlsCertificateKeyFile: `<path to private client key>`, });
참고
CRL 파일
TLS 구성에서는 MongoDB에 연결할 때 인증서 해지 목록(CRL)을 제시해야 할 수 있습니다. 드라이버 버전 6.0부터 CRL 파일의 파일 경로를 연결 문자열의 tlsCRLFile
옵션 또는 MongoClientOptions
인스턴스에 전달할 수 있습니다.
인증서를 저장할 버퍼 객체 만들기
TLS와 연결하기 위해 클라이언트 옵션에서 인증서 파일의 콘텐츠를 Buffer
객체로 전달할 수 있습니다.
다음 코드는 인증서 파일의 내용을 읽고 결과 Buffer
객체를 MongoClient
옵션으로 전달하는 방법을 보여줍니다.
// Read file contents const ca = fs.readFileSync(`<path to CA certificate>`); const cert = fs.readFileSync(`<path to public client certificate>`); const key = fs.readFileSync(`<path to private client key>`); // Pass Buffers as client options const client = new MongoClient(uri, { tls: true, ca, cert, key });
SecureContext 예시
이 예시에서는 TLS 옵션을 포함하는 SecureContext
객체와 MongoClient
인스턴스를 생성하는 방법을 보여 줍니다. 이 예시에서는 MongoDB에 연결하여 찾기 쿼리를 실행합니다.
import { MongoClient } from "mongodb"; import * as fs from "fs"; import * as tls from "tls"; // Replace the uri string with your connection string. const uri = "<connection uri>"; // Replace the filepaths with your certificate filepaths. const secureContext = tls.createSecureContext({ ca: fs.readFileSync(`<path to CA certificate>`), cert: fs.readFileSync(`<path to public client certificate>`), key: fs.readFileSync(`<path to private client key>`), }); // Create a client with the secureContext option const client = new MongoClient(uri, { tls: true, secureContext }); async function run() { try { const db = client.db("myDB"); const myColl = db.collection("myColl"); const doc = await myColl.findOne({}); console.log(doc); } finally { await client.close(); } } run().catch(console.dir);
추가 정보
연결에서 TLS를 활성화하는 방법에 대한 자세한 내용은 다음 서버 설명서를 참조하세요.