Docs Menu

์ž์ฒด ๊ด€๋ฆฌํ˜• ๋ฐฐํฌ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ๋งŒ๋“ค๊ธฐ

์•ก์„ธ์Šค ์ œ์–ด๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์„ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ญํ• ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ญํ• ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ MongoDB resources์— ๋Œ€ํ•ด ํŠน์ • ์กฐ์น˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

MongoDB ์‹œ์Šคํ…œ์˜ ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‚ฌ์šฉ์ž๋Š” ๊ณ ์œ ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งคํ•‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•ก์„ธ์Šค ๊ฒฉ๋ฆฌ ์›์น™์€ ์•ก์„ธ์Šค ํ•ด์ง€ ๋ฐ ์ง€์†์ ์ธ ์‚ฌ์šฉ์ž ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ ๊ถŒํ•œ์˜ ์‹œ์Šคํ…œ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ์ตœ์†Œ ๊ถŒํ•œ ์„ธํŠธ๋งŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹ค์Œ ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ์ž์ฒด ๊ด€๋ฆฌ ๋ฐฐํฌ์„œ๋ฒ„์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • MongoDB Enterprise: MongoDB์˜ ๊ตฌ๋… ๊ธฐ๋ฐ˜ ์ž์ฒด ๊ด€๋ฆฌ ๋ฒ„์ „

  • MongoDB Community: MongoDB์˜ ์†Œ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฌด๋ฃŒ ์ž์ฒด ๊ด€๋ฆฌ ๋ฒ„์ „

๋‹ค์Œ ํ•œ๋„๋Š” MongoDB Atlas์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๋ฐฐํฌ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•œ๋„ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‚ฌ์šฉ์ž์˜ ์กฐ์ง์— ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด Atlas ์ง€์›ํŒ€์— ๋ฌธ์˜ํ•˜์„ธ์š”.

  • MongoDB Atlas cluster์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œ Atlas CLI, Atlas ๊ด€๋ฆฌ API, Atlas UI ๋˜๋Š” ์ง€์›๋˜๋Š” ํ†ตํ•ฉ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด MongoDB Atlas ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค. MongoDB Atlas ์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด MongoDB Atlas ์„ค๋ช…์„œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MongoDB Atlas ๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ•  ๋ฐ ํŠน์ • ๊ถŒํ•œ์€ MongoDB ๋ช…๋ น์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ M10+ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ช…๋ น์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • MongoDB Atlas๋Š” MongoDB Atlas ํ”„๋กœ์ ํŠธ๋‹น ์ตœ๋Œ€ 100๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— 100๋ช… ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Atlas ์ง€์›ํŒ€์— ๋ฌธ์˜ํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ์ƒ์ ์ธ ์‚ฌ์šฉ์ž ์ƒ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด createUser์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์—ญํ• ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— grantRole ์กฐ์น˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

userAdmin ๋ฐ userAdminAnyDatabase ๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ• ์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ createUser ๋ฐ grantRole ์กฐ์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋‹ค์Œ ์ ˆ์ฐจ๋Š” SCRAM ์ธ์ฆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”๊ฐ€ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์ฒด ๊ด€๋ฆฌํ˜• MongoDB Enterprise ๋˜๋Š” MongoDB Community ๋ฐฐํฌ์„œ๋ฒ„ ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

1

mongosh๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋จธ๋ฆฌ mongod์— ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜, ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ mongos์— ์—ฐ๊ฒฐํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ์ž ๋˜๋Š” ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

-u <username>, -p ๋ฐ --authenticationDatabase <database> ๋ช…๋ น์ค„ ์˜ต์…˜์œผ๋กœ mongosh(์„)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

mongosh --port 27017 --authenticationDatabase \
"admin" -u "myUserAdmin" -p

๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

mongosh(์„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐํฌ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

mongosh --port 27017

mongosh ์—์„œ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (์ด ๊ฒฝ์šฐ admin)๋กœ ์ „ํ™˜ํ•˜๊ณ  db.auth(<username>, <pwd>) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

use admin
db.auth("myUserAdmin", passwordPrompt()) // or cleartext password

ํŒ

passwordPrompt() ๋ฉ”์„œ๋“œ๋Š” ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์–ด ์…ธ ๊ธฐ๋ก์— ์•”ํ˜ธ๊ฐ€ ์œ ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด passwordPrompt() ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

2

์ฐธ๊ณ 

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” SCRAM ์ธ์ฆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”๊ฐ€ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž ๊ด€๋ฆฌ์ž๋กœ ์ธ์ฆํ•œ ํ›„ db.createUser() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ•  ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์—ญํ• ์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž‘์—…์€ test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ readWrite ์—ญํ• ๊ณผ reporting ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ read ์—ญํ• ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž myTester๋ฅผ test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

use test
db.createUser(
{
user: "myTester",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)

ํŒ

passwordPrompt() ๋ฉ”์„œ๋“œ๋Š” ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์–ด ์…ธ ๊ธฐ๋ก์— ์•”ํ˜ธ๊ฐ€ ์œ ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด passwordPrompt() ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์ด ์˜ˆ์‹œ์—์„œ๋Š” test)๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ธ์ฆํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—ญํ• ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•œ ํ›„ mongosh๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

3

์ค‘์š”

๋™์ผํ•œ mongosh ์„ธ์…˜์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ฐ„์—๋Š” ์ „ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•˜๋ฉด ์„ธ์…˜์— ์ธ์ฆ๋œ ๋‘ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์ด ๋ชจ๋‘ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฐ„์— ์ „ํ™˜ํ•˜๋ ค๋ฉด mongosh๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์„ธ์š”.

mongosh๋ฅผ myUserAdmin์œผ๋กœ ์ข…๋ฃŒํ•œ ํ›„ myTester๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

-u <username>, -p ๋ฐ --authenticationDatabase <database> ๋ช…๋ น์ค„ ์˜ต์…˜์œผ๋กœ mongosh(์„)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

mongosh --port 27017 -u "myTester" \
--authenticationDatabase "test" -p

๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

mongosh(์„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐํฌ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

mongosh --port 27017

mongosh ์—์„œ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (์ด ๊ฒฝ์šฐ admin)๋กœ ์ „ํ™˜ํ•˜๊ณ  db.auth(<username>, <pwd>) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

use test
db.auth("myTester", passwordPrompt()) // or cleartext password

ํŒ

passwordPrompt() ๋ฉ”์„œ๋“œ๋Š” ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์–ด ์…ธ ๊ธฐ๋ก์— ์•”ํ˜ธ๊ฐ€ ์œ ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด passwordPrompt() ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

4

์‚ฌ์šฉ์ž myTester๋Š” test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค(reporting ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ ์ž‘์—…๋„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ). myTester์œผ๋กœ ์ธ์ฆ๋˜๋ฉด test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปฌ๋ ‰์…˜์— ๋ฌธ์„œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด test ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฝ์ž… ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.foo.insertOne( { x: 1, y: 1 } )

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์ž‘์—…์€ ์ง€์ •๋œ ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ reporting ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํŒ

passwordPrompt() ๋ฉ”์„œ๋“œ๋Š” ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์–ด ์…ธ ๊ธฐ๋ก์— ์•”ํ˜ธ๊ฐ€ ์œ ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด passwordPrompt() ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

use reporting
db.createUser(
{
user: "reportsUser",
pwd: passwordPrompt(), // or cleartext password
roles: [
{ role: "read", db: "reporting" },
{ role: "read", db: "products" },
{ role: "read", db: "sales" },
{ role: "readWrite", db: "accounts" }
]
}
)

Kerberos์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ MongoDB์— ์ธ์ฆํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” mongos ๋˜๋Š” mongod๋ฅผ ํ—ˆ์šฉํ•ด ์ธ์ฆ์„ ์œ„ํ•œ ์™ธ๋ถ€ ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” $external ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ์‚ฌ์šฉ์ž(Kerberos, LDAP ๋˜๋Š” X.์‚ฌ์šฉ์ž)์™€ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ ์„ธ์…˜ ๋ฐ ์ธ๊ณผ์  ์ผ๊ด€์„ฑ ๋ณด์žฅ์„ $external 509 ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด 10k ๋ฐ”์ดํŠธ๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Kerberos ์ธ์ฆ์˜ ๊ฒฝ์šฐ Kerberos ์ฃผ์ฒด๋ฅผ ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž‘์—…์€ records ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง„ Kerberos ์ฃผ์ฒด reportingapp@EXAMPLE.NET์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

use $external
db.createUser(
{
user: "reportingapp@EXAMPLE.NET",
roles: [
{ role: "read", db: "records" }
]
}
)

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB deployment์— ๋Œ€ํ•œ Kerberos ์ธ์ฆ ์„ค์ •์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์ฐธ๊ณ 

MongoDB 8.0 ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. LDAP ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LDAP ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ MongoDB 8 ์˜ ์ˆ˜๋ช… ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ณ€๊ฒฝ ์—†์ด ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. LDAP ๋Š” ํ–ฅํ›„ ์ฃผ์š” ์ถœ์‹œํ•˜๋‹ค ์—์„œ ์ œ๊ฑฐ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ LDAP ์‚ฌ์šฉ ์ค‘๋‹จ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

LDAP์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ MongoDB์— ์ธ์ฆํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” mongos ๋˜๋Š” mongod๋ฅผ ํ—ˆ์šฉํ•ด ์ธ์ฆ์„ ์œ„ํ•œ ์™ธ๋ถ€ ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” $external ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ์‚ฌ์šฉ์ž(Kerberos, LDAP ๋˜๋Š” X.์‚ฌ์šฉ์ž)์™€ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ ์„ธ์…˜ ๋ฐ ์ธ๊ณผ์  ์ผ๊ด€์„ฑ ๋ณด์žฅ์„ $external 509 ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด 10k ๋ฐ”์ดํŠธ๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

LDAP ์ธ์ฆ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” LDAP ์„œ๋น„์Šค์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž‘์—…์€ records ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” reporting ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

use $external
db.createUser(
{
user: "reporting",
roles: [
{ role: "read", db: "records" }
]
}
)

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB deployment์— ๋Œ€ํ•œ LDAP ์ธ์ฆ ์„ค์ •์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

X. ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ธ์ฆ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‚ฌ์šฉํ•˜์—ฌ MongoDB ์— ์ธ์ฆํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š”509 $external ๋˜๋Š” mongos ์ด mongod ์ธ์ฆ ์œ„ํ•ด ์™ธ๋ถ€ ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์— ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ์‚ฌ์šฉ์ž(Kerberos, LDAP ๋˜๋Š” X.์‚ฌ์šฉ์ž)์™€ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ ์„ธ์…˜ ๋ฐ ์ธ๊ณผ์  ์ผ๊ด€์„ฑ ๋ณด์žฅ์„ $external 509 ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด 10k ๋ฐ”์ดํŠธ๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

X.509 ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ธ์ฆ ์˜ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ์˜ subject ๊ฐ’์„ MongoDB ์‚ฌ์šฉ์ž๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ณ ์œ  X.509 ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋Š” ๋‹จ์ผ MongoDB ์‚ฌ์šฉ์ž์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ž‘์—…์€ records ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ฃผ์ฒด CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

use $external
db.createUser(
{
user: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry",
roles: [
{ role: "read", db: "records" }
]
}
)

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB deployment ์œ„ํ•œ X.509 ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ธ์ฆ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์ฒด ๊ด€๋ฆฌํ˜• MongoDB Enterprise ๋˜๋Š” MongoDB Community ๋ฐฐํฌ์„œ๋ฒ„ ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๊ด€๋ฆฌ ํ•˜๊ณ , ์—ญํ• ์„ ํ• ๋‹นํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ๋งŒ๋“ค๋ ค๋ฉด ์ž์ฒด ๊ด€๋ฆฌ ๋ฐฐํฌ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ๋ฐ ์—ญํ•  ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.