39. MongoDB Replication Part 9. - Replication with Authentication

MongoDB에서 인증을 통해 master와 slave 노드 간 복제를 하고자 할 경우에는 slave 노드가 master 노드의 데이터에 접근할 수 있는 권한을 설정할 수 있는 방법이 있습니다.

접근을 하고자 하는 master 노드의 db에 username과 password를 지정하여 user를 추가하고 slave 노드에도 동일한 usernamepassword를 갖는 user를 추가합니다.

user를 추가하는 방법은 createUser() 메써드를 사용하는 것입니다. 예를 들어, test라는 db에 다음과 같이 user를 추가해 보도록 하겠습니다:

> use test
switched to db test
> db.createUser(
...    {
...      user: "cinema4d",
...      pwd: "12345",
...      roles: [ ]
...    }
... )
Successfully added user: { "user" : "cinema4d", "roles" : [ ] }

user 추가에 성공하면 위와 같이 Successfully added user: {...}라는 메시지가 출력됩니다.

그러면 현재 db (test)에 user가 어떻게 기록되어 있는지 살펴보기 위해 다음과 같이 입력해 보도록 하겠습니다:

> db.getCollectionNames()
[ ]

어떻게 된 일인지 db의 내용이 비어있습니다다. 다음과 같이 입력했더니,

> show dbs
admin  0.078GB
local  0.328GB
test   (empty)

test db는 비어있는 것으로 나옵니다. 그러면 과연 user는 어느 db에 저장될까요? useradmin db에 통합으로 저장되고 관리됩니다.

다음과 같이 입력하여 저장된 user의 정보를 확인해 보도록 하겠습니다:

> use admin
switched to db admin
> db.getCollectionNames()
[ "system.indexes", "system.users", "system.version" ]
> db.system.users.find().pretty()
{
        "_id" : "test.cinema4d",
        "user" : "cinema4d",
        "db" : "test",
        "credentials" : {
                "MONGODB-CR" : "ba6dbf8d9b4a23d806cd25700dd9f891"
        },
        "roles" : [ ]
}

위에서 보는 바와 같이, useradmin dbsystem.users 컬렉션에 저장되어 있습니다.

단, _id를 살펴보면 이 user가 어느 db에 할당되어 있는지 알 수 있습니다.

  • 참고: MongoDB 버전 2.6부터 addUser() 메써드는 사라지고, 대신 createUser() 메써드를 사용하도록 하고 있으니, 버전에 따른 혼동이 없길 바랍니다.
필드 타입 설명
user 문자열 새 user의 이름.
pwd 문자열 user의 password.
customData 도큐먼트 옵션. 임의의 정보.
roles 배열 user의 역할.

새로운 user 추가 시, 역할(Role)을 추가하는 예는 다음과 같습니다:

> use test2
switched to db test2
> db.createUser(
...    {
...      user: "gchoi",
...      pwd: "0123",
...      roles: [ "readWrite", "dbAdmin" ]
...    }
... )
Successfully added user: { "user" : "gchoi", "roles" : [ "readWrite", "dbAdmin" ] }
> use admin
switched to db admin
> db.getCollectionNames()
[ "system.indexes", "system.users", "system.version" ]
> db.system.users.find().pretty()
{
        "_id" : "test.cinema4d",
        "user" : "cinema4d",
        "db" : "test",
        "credentials" : {
                "MONGODB-CR" : "ba6dbf8d9b4a23d806cd25700dd9f891"
        },
        "roles" : [ ]
}
{
        "_id" : "test2.gchoi",
        "user" : "gchoi",
        "db" : "test2",
        "credentials" : {
                "MONGODB-CR" : "ceddf25b1d6234e46546d6714ff6a94e"
        },
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test2"
                },
                {
                        "role" : "dbAdmin",
                        "db" : "test2"
                }
        ]
}

이로써 Replication에 대한 내용을 마무리하고, 다음 글부터는 Sharding에 대하여 다루도록 하겠습니다.