MongoDB의 기본 역할과 사용자 정의 역할을 이용해 계정의 권한 범위를 나누는 방법입니다. 원노트의 여러 DB 실습을 appdb.account 조회 권한 하나로 정리했습니다. 관리 계정으로 admin DB에 접속한 상태에서 진행합니다.
역할의 범위 구분
read·readWrite는 데이터 작업에, userAdmin 계열은 사용자 관리에 사용합니다. dbAdmin이 모든 문서 읽기·쓰기를 자동으로 포함한다고 가정하지 않습니다. 전체 DB 역할을 주기 전에 대상 DB와 필요한 작업을 정합니다.
사용자 정의 역할 생성
resource는 데이터베이스와 컬렉션 범위, actions는 허용 작업입니다. 아래 예시는 appdb의 account 컬렉션만 조회할 수 있는 역할을 admin DB에 생성합니다.
use admin
db.createRole({
role: 'appAccountReader',
privileges: [
{resource: {db: 'appdb', collection: 'account'}, actions: ['find']}
],
roles: []
})
db.getRole('appAccountReader', {showPrivileges: true})빈 DB·컬렉션 문자열은 넓은 범위를 뜻할 수 있으므로 최소 범위가 필요한 예제에는 명시적인 이름을 사용합니다. 역할은 이름뿐 아니라 어느 DB에 생성했는지도 식별 정보입니다.
사용자 생성과 역할 할당
암호는 passwordPrompt()로 입력해 명령에 실제 값을 남기지 않습니다. 인증 DB는 admin, 데이터를 읽을 DB는 appdb이므로 접속 옵션에서 구분합니다.
db.createUser({
user: 'lieper', pwd: passwordPrompt(),
roles: [{role: 'appAccountReader', db: 'admin'}]
})
db.getUser('lieper')mongosh --host localhost --port 57017 -u lieper -p --authenticationDatabase admin appdb조회가 성공하는지 확인하고 다른 컬렉션이나 쓰기 작업은 허용되지 않는지 확인합니다. 기존 역할에 추가할 때는 grantRolesToUser, 전체 역할 목록을 교체할 때는 updateUser를 사용합니다. 교체와 추가를 혼동해 기존 서비스 권한을 없애지 않도록 합니다.