์ฐ๊ฒฐ์์ TLS ํ์ฑํ
์ด ํ์ด์ง์ ๋ด์ฉ
๊ฐ์
์ด ๊ฐ์ด๋์์๋ TLS ๋ณด์ ํ๋กํ ์ฝ์ ์ฌ์ฉํด MongoDB ์ธ์คํด์ค์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
TLS๋ฅผ ์ฌ์ฉํ๋๋ก ์ฐ๊ฒฐ์ ๊ตฌ์ฑํ๋ ค๋ฉด TLS ์ต์ ์ ํ์ฑํํ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด ์ธ์ฆ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ
TLS์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ ์ก ๊ณ์ธต ๋ณด์์ ๋ํ Wikipedia ํญ๋ชฉ์ ์ฐธ์กฐํ์ธ์.
TLS ํ์ฑํ
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก MongoDB ์ธ์คํด์ค์ ๋ํ ์ฐ๊ฒฐ์์ TLS๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค:
MongoClientOptions
๊ฐ์ฒด์์tls
์ต์ ์true
(์ผ)๋ก ์ค์ ์ฐ๊ฒฐ ๋ฌธ์์ด์์
tls
์ต์ ์true
(์ผ)๋ก ์ค์
์ฐธ๊ณ
์ฐ๊ฒฐ ๋ฌธ์์ด์ +srv
์์ ์ ์ง์ ํ์ฌ MongoDB์ ์ฐ๊ฒฐํ ๋ DNS SRV ๊ธฐ๋ก์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ฒฐ์์ TLS๋ฅผ ํ์ฑํํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด ์ฐ๊ฒฐ ๋ฌธ์์ด ๋๋ MongoClientOptions
๊ฐ์ฒด์์ tls
๋๋ ssl
๋งค๊ฐ๋ณ์ ๊ฐ์ false
๋ก ์ค์ ํ์ธ์.
DNS ์๋ ๋ชฉ๋ก์ ์ฌ์ฉํ ๋์ ์ฐ๊ฒฐ ๋์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ฒ ๋งค๋ด์ผ์ SRV ์ฐ๊ฒฐ ํ์ ์น์ ์ ์ฐธ์กฐํ์ธ์.
tls
ํด๋ผ์ด์ธํธ ์ต์
์ธ์๋ ๋๋ผ์ด๋ฒ๋ ์ฐ๊ฒฐ์์ TLS๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ์ถ๊ฐ ์ต์
์ ์ ๊ณตํฉ๋๋ค. ํ
์คํธ ๋ชฉ์ ์ผ๋ก tlsAllowInvalidHostnames
, tlsAllowInvalidCertificates
๋ฐ tlsInsecure
ํด๋ผ์ด์ธํธ ์ต์
์ ์ค์ ํ ์ ์์ต๋๋ค.
tlsAllowInvalidHostnames
์ต์
์ true
๋ก ์ค์ ํ๋ฉด ํธ์คํธ ์ด๋ฆ ํ์ธ์ด ๋นํ์ฑํ๋๋ฉฐ, tlsAllowInvalidCertificates
๋ฅผ true
๋ก ์ค์ ํ๋ฉด ์ธ์ฆ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๋นํ์ฑํ๋ฉ๋๋ค. tlsInsecure
์ต์
์ true
๋ก ์ค์ ํ๋ฉด ์ธ์ฆ์ ๋ฐ ํธ์คํธ ์ด๋ฆ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ชจ๋ ๋นํ์ฑํํฉ๋๋ค.
๊ฒฝ๊ณ
ํ๋ก๋์ ํ๊ฒฝ์์ ์ด๋ฌํ ์ต์ ์ ์ง์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ์ง ์๊ณ ๋ง๋ฃ๋ ์ธ์ฆ์ ๋ฐ ์ ํจํ ํด๋ผ์ด์ธํธ ์ธ์คํด์ค๋ก ์์ฅํ๋ ์ธ๋ถ ํ๋ก์ธ์ค์ ์ ์ฌ์ ์ผ๋ก ์ทจ์ฝํด์ง๋๋ค.
ํด๋ผ์ด์ธํธ ์ต์ ์ ์ ์ฒด ๋ชฉ๋ก์ ์ฐ๊ฒฐ ์ต์ ์ ์ฐธ์กฐํ์ธ์.
์ธ์ฆ์ ๊ตฌ์ฑ
TLS ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์์ํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํธํ ์ธ์ฆ์๋ฅผ ์ฐธ์กฐํด ID๋ฅผ ์ฆ๋ช ํด์ผ ํฉ๋๋ค. TLS๋ก MongoDB์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ธ์ฆ์๋ฅผ PEM ํ์ผ๋ก ์ ์ฅํด์ผ ํฉ๋๋ค.
์ค์
ํ๋ก๋์ ์ฉ๋์ ๊ฒฝ์ฐ MongoDB deployment๋ ๋์ผํ ์ธ์ฆ ๊ธฐ๊ด์์ ์์ฑํ๊ณ ์๋ช ํ ์ ํจํ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ ์คํธ๋ฅผ ์ํด ์์ฒด ์๋ช ๋ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ๋ชฉ๋ก์์๋ 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
์์ ์ธ์ฆ์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ต์
์ผ๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
// Pass filepaths as client options const client = new MongoClient(uri, { tls: true, tlsCAFile: `<path to CA certificate>`, tlsCertificateFile: `<path to public client certificate>`, tlsCertificateKeyFile: `<path to private client key>`, });
์ธ์ฆ์๋ฅผ ์ ์ฅํ ๋ฒํผ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
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๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์ ์๋ฒ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ธ์.