๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Node.js

mongodb atlas whitelist์— 0.0.0.0์„ ๋„ฃ์–ด๋„ ์—ฐ๊ฒฐ์ด ์•ˆ๋  ๋•Œ

by pocket.dev 2025. 6. 7.
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ์ƒํ™ฉ

Node.js ํ”„๋กœ์ ํŠธ์—์„œ mongoose๋ฅผ ํ†ตํ•ด์„œ mongodb atlas์— ์—ฐ๊ฒฐ์„ ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, whitelist ์—๋Ÿฌ ๋ฐœ์ƒ.

ํ•˜์ง€๋งŒ ์ด๋ฏธ whitelist์— 0.0.0.0/0์œผ๋กœ ๋ชจ๋“  IP๋ฅผ ํ—ˆ์šฉํ•ด๋†“์€ ์ƒํƒœ.

Could not connect to any servers in your MongoDB Atlas cluster.
One common reason is that you're trying to access the database from an IP that isn't whitelisted.
Make sure your current IP address is on your Atlas cluster's IP whitelist

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‹œ๋„ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์ฐจ๋ก€๋กœ ์ ์–ด๋ณด์•˜๋‹ค.

 

1. ์ฒซ ๋ฒˆ์งธ ์‹œ๋„: ๋‚ด IP์ฃผ์†Œ ์ง์ ‘ ์ถ”๊ฐ€ โžก๏ธ ์‹คํŒจ

MongoDB Atlas ์ ‘๊ทผ ํ—ˆ์šฉ IP์— 0.0.0.0/0 (์ „์ฒด ํ—ˆ์šฉ)์ด ์ด๋ฏธ ๋“ค์–ด๊ฐ€์žˆ์—ˆ์œผ๋‚˜ ์ง์ ‘ ๋‚ด IP ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์—ฐ๊ฒฐ์€ ์•ˆ๋œ๋‹ค.

 

2. ๋‘ ๋ฒˆ์งธ ์‹œ๋„: MongoDB ์—ฐ๊ฒฐ URI๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ํ™•์ธ โžก๏ธ ์‹คํŒจ

mongodb+srv://๋กœ ์‹œ์ž‘ํ•˜๋Š” MongoDB ์—ฐ๊ฒฐ URI๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ ๋ฉ”๋‰ด์—์„œ URI ํ™•์ธ.

  • MongoDB Atlas ํ™ˆํŽ˜์ด์ง€  > DATABASE > Cluters > Connect > Compass

๊ธฐ์กด์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ URI๊ฐ€ ์ œ๋Œ€๋กœ ๋œ URI์ธ ๊ฒƒ ํ™•์ธํ•˜๊ณ , ๋”๋ธ” ์ฒดํฌ๋ฅผ ์œ„ํ•ด์„œ MongoDB Compass์—์„œ ํ•ด๋‹น URI๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ Node.js ํ”„๋กœ์ ํŠธ๋Š” whitelist ์—๋Ÿฌ๋ฅผ ๋„์šฐ๋ฉฐ ์—ฐ๊ฒฐ์ด ์•ˆ๋˜๋Š” ์ƒํ™ฉ์ด๋‹ค.

 

3. ์„ธ ๋ฒˆ์งธ ์‹œ๋„: mongoose ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ โžก๏ธ ์ ˆ๋ฐ˜ ์„ฑ๊ณต

ํ”„๋กœ์ ํŠธ์— ์„ค์น˜๋œ mongodb์™€ mongoose ํŒจํ‚ค์ง€ ๋ฒ„์ „์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ•˜๋‹ค๋ณด๋‹ˆ mongoose ๋ฒ„์ „์„ ์•ˆ์ •ํ™” ๋ฒ„์ „์ธ 8.1.1๋กœ ๋‚ฎ์ถ”๋ฉด DB ์—ฐ๊ฒฐ์ด ๋œ๋‹ค๋Š” ๊ธ€์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

"mongodb": "^6.16.0",
"mongoose": "^8.15.1",

์ฐธ๊ณ  ํŽ˜์ด์ง€: https://www.reddit.com/r/mongodb/comments/1g3y76a/getting_ip_error_for_mongodb_atlas_connection/

 

mongoose ๋ฒ„์ „์„ 8.1.1๋กœ ๋‚ฎ์ถ”๋‹ˆ Node.js ํ”„๋กœ์ ํŠธ์—์„œ MongoDB ์—ฐ๊ฒฐ ์„ฑ๊ณต!

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. mongoose ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜๋‹ˆ ์ €๊ธฐ ์‹ ๊ฒฝ์“ฐ์ด๋Š” 1 critical์ด ๋ณด์ธ๋‹ค. ์›๋ž˜ ์—†๋˜ critical ์š”์†Œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

 

์›์ธ ํŒŒ์•…์„ ์œ„ํ•ด npm audit์œผ๋กœ ์ƒ์„ธ ๋‚ด์—ญ์„ ํ™•์ธํ–ˆ๋‹ค.

$ npm audit

 

๋กœ๊ทธ์—์„œ ์ œ์‹œํ•˜๋Š” ๊นƒํ—ˆ๋ธŒ ๋งํฌ์— ๋“ค์–ด๊ฐ€์„œ ๋ณด๋‹ˆ injection vulnerability์— ๋Œ€ํ•œ ๋‚ด์šฉ๋“ค์ด ์ ํ˜€์žˆ๋‹ค. ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • mongoose์˜ search injection(๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ ์กฐ์ž‘ ๊ณต๊ฒฉ) ์ทจ์•ฝ์ 
  • 8.0.0-rc0 - 8.9.4 ๋ฒ„์ „์— ํ•ด๋‹น(8.1.1 ๋ฒ„์ „๋„ ์—ฌ๊ธฐ์— ์†ํ•จ)
  • ์‹ค์ œ ์œ„ํ—˜๋„๋Š” ์‚ฌ์šฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.
  • ์‹ค์ œ ์œ„ํ—˜์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ง์ ‘ mongoose ์ฟผ๋ฆฌ์— ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์œ„ํ—˜ํ•œ ์ฝ”๋“œ (์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ง์ ‘ ์‚ฌ์šฉ)
User.find(req.query); // โŒ

// ์•ˆ์ „ํ•œ ์ฝ”๋“œ (์ž…๋ ฅ ๊ฒ€์ฆ ํ›„ ์‚ฌ์šฉ)
const { name, email } = req.query;
User.find({ name, email }); // โœ…

 

์ฝ”๋“œ ์ƒ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์ด๊ฒƒ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ critical ์š”์†Œ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‹ค๋…”๋‹ค.

 

4. ๋„ค ๋ฒˆ์งธ ์‹œ๋„: mongoose ์—ฐ๊ฒฐ ์‹œ IPv4 ์‚ฌ์šฉ โžก๏ธ  ์„ฑ๊ณต

์šฐ์„  ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์ธ mongoose 8.15.1๋กœ ๋‹ค์‹œ ์›๋ณต์„ ์‹œ์ผฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ƒ์—์„œ mongoose ์—ฐ๊ฒฐ ์‹œ IPv4๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

// IPv4 ๊ฐ•์ œ ์‚ฌ์šฉ
mongoose.connect(process.env.DB_URI, {
  family: 4
});

 

๋ง™์†Œ์‚ฌ DB ์—ฐ๊ฒฐ์ด ๋๋‹ค.

 

4-1. ์™œ ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚ฌ๋Š”๊ฐ€?

mongoose 8.15.1์—์„œ๋Š” ์—ฐ๊ฒฐํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ IPv6๋ฅผ ์šฐ์„  ์‹œ๋„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋Š” IPv6 ์—ฐ๊ฒฐ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. MongoDB Atlas์˜ mongodb+srv://๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฃผ์†Œ๊ฐ€ IPv6๋กœ ํ•ด์„๋  ๋•Œ ์—ฐ๊ฒฐ์ด ์‹คํŒจ๋œ๋‹ค.

  • 8.1.1: IPv4 ์šฐ์„  ๋˜๋Š” IPv6 ์ฒ˜๋ฆฌ๊ฐ€ ๋œ ์—„๊ฒฉ 
  • 8.15.1: IPv6 ์ง€์›์ด ๊ฐ•ํ™”๋˜๋ฉด์„œ IPv6๋ฅผ ๋จผ์ € ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์ง

IPv6๋Š” ์ด๋ก ์ ์œผ๋กœ๋Š” ์ง€์›๋˜์ง€๋งŒ ๊ฐ€์ •์šฉ ์ธํ„ฐ๋„ท๊ณผ ๊ธฐ์—… ๋„คํŠธ์›Œํฌ์—์„œ ์‹ค์ œ ๊ตฌํ˜„์ด ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ๋ฐฉํ™”๋ฒฝ์—์„œ ์ฐจ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ISP์—์„œ IPv6 DNS๋Š” ์ œ๊ณตํ•˜์ง€๋งŒ ์‹ค์ œ ๋ผ์šฐํŒ…์ด ์ œ๋Œ€๋กœ ์•ˆ๋˜์–ด์„œ ์—ฐ๊ฒฐ ์‹œ๋„๋Š” ํ•˜์ง€๋งŒ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ด ๋นˆ๋ฒˆํ•˜๋‹ค. ๋”ฐ๋ผ์„œ family: 4 ์˜ต์…˜์œผ๋กœ ๊ฒ€์ฆ๋œ IPv4 ๊ฒฝ๋กœ๋ฅผ ๊ฐ•์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ฐ๊ฒฐ ์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ ๋‚ซ๋‹ค.

4-2. IPv4๋กœ ๊ฐ•์ œ๋กœ ์—ฐ๊ฒฐํ•ด๋„ ๋ณด์•ˆ ์ƒ ๋ฌธ์ œ๋Š” ์—†๋Š”๊ฐ€?

family:4๋Š” ๋‹จ์ˆœํžˆ IPv4 ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๊ณ , IPv6 ๋Œ€์‹  IPv4๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. IPv4๋กœ ์—ฐ๊ฒฐํ•˜๋„๋ก ์„ค์ •ํ•ด๋„ ๋ณด์•ˆ์— ๋ฌธ์ œ๋Š” ์—†๋‹ค.

์ด๋ ‡๊ฒŒ ํ”„๋กœํ† ์ฝœ์„ ๋ณ€๊ฒฝํ•ด๋„ MongoDB Atlas ์—ฐ๊ฒฐ์€ ์—ฌ์ „ํžˆ TLS/SSL๋กœ ์•”ํ˜ธํ™” ๋˜์–ด์žˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์ž๋ช…/๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ์ ์šฉ์ด ๋˜์–ด์žˆ๊ณ , whitelist ๋ณด์•ˆ๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜คํžˆ๋ ค mongoose 8.15.1์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๊ฒŒ ๋” ์ตœ์‹  ๋ฒ„์ „์ด๋ผ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋” ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
Buy Me A Coffee