역할 기반 권한
이 페이지의 내용
개요
들어오는 사용자 요청과 Device Sync 세션에 자동으로 할당되는 역할을 정의해 앱의 데이터를 보호합니다. 각 역할에는 세분화된 데이터 액세스 권한과 역할이 적용되는 시기를 결정하는 동적 조건이 있습니다.
Device Sync를 사용하여 일반적인 시나리오에 대한 권한을 구성하는 방법에 대한 예는 Device Sync 권한 가이드를 참조하세요.
권한이란 무엇인가요?
권한은 Atlas App Services가 개별 사용자에게 할당하여 앱 데이터로 할 수 있는 것과 할 수 없는 것을 제어하는 상태입니다. App Services는 문서 수준 및 필드 수준 권한을 모두 사용합니다.
문서 수준 권한
역할의 문서 수준 권한에 따라 전체 문서에 영향을 미치는 어떤 조치를 수행할 수 있는지 결정됩니다. 이러한 권한은 내용과 관계없이 항상 전체 문서에 적용됩니다. 역할은 다음과 같은 문서 수준 권한을 가질 수 있습니다.
Insert(삽입): 새 문서를 삽입할 수 있습니다.
삭제: 기존 문서를 삭제할 수 있습니다.
검색: Atlas Search를 사용하여 문서를 검색할 수 있습니다.
필드 수준 권한
역할의 필드 수준 권한은 사용자가 문서 내의 필드를 읽거나 쓸 수 있는지 여부를 결정합니다. 이러한 권한은 해당 권한이 적용되는 필드에만 영향을 미치므로 사용자는 전체 문서의 일부에 대해서만 읽기 또는 쓰기 권한을 가질 수 있습니다.
특정 필드에 대한 필드 수준 권한과 명시적으로 정의하지 않은 추가 필드에 대한 기본 읽기/쓰기 권한을 정의할 수 있습니다.
권한 순서도 읽기
다음 다이어그램에는 App Services에서 사용자가 특정 문서를 읽을 수 있는지 여부를 결정하는 방법이 나와 있습니다.
쓰기 권한 순서도
다음 다이어그램에는 App Services에서 사용자가 특정 문서를 작성할 수 있는지 여부를 결정하는 방법이 나와 있습니다.
역할
역할은 사용자가 MongoDB 컬렉션의 문서에서 가질 수 있는 명명된 권한 집합을 말합니다. 역할은 App Services에서 사용자에게 역할을 할당할지 여부를 결정하는 "apply when" 표현식을 가지고 있습니다. 또한, 역할이 할당될 때 사용자에게 부여되는 문서/필드 수준 권한 집합도 가지고 있습니다.
App Services는 할당된 역할에 따라 사용자에게 권한이 부여된 작업만 커밋합니다. 역할에 문서 또는 일부 필드를 읽을 수 있는 권한이 없는 경우 App Services는 결과에서 해당 문서 또는 필드를 생략합니다.
예시
이름이 employees
인 컬렉션이 있고 각 직원이 자신의 모든 고용 데이터가 담긴 문서를 가지고 있다고 가정해 보겠습니다. 이 컬렉션에는 직원과 관리자라는 두 가지 역할이 있을 수 있습니다. 우리는 Device Sync를 사용하지 않으므로 App Services는 문서별로 역할을 선택합니다.
사용자가 자신의 문서를 요청하는 경우 해당 사용자의 역할은 직원이 됩니다. 직원은 자신의 데이터를 읽고 쓸 수 있지만 자신의 문서를 만들거나 삭제할 수는 없습니다.
사용자가 사용자의
manages
배열에 이름이 포함된 사람에 대한 문서를 요청하는 경우 해당 사용자의 역할은 관리자입니다. 관리자는 부하 직원의 데이터를 읽고 쓸 수 있으며, 문서를 생성하고 삭제할 수 있습니다.사용자가 특정 문서를 담당하는 Employee(직원)이나 Manager(관리자)가 아닌 경우 이 사용자는 아무 역할도 없으며 해당 문서를 읽거나, 쓰거나, 검색할 수도 없습니다.
{ "name": "Manager", "apply_when": { "email": "%%user.custom_data.manages" }, "insert": true, "delete": true, "read": true, "write": true, "search": true, "fields": {}, "additional_fields": { "read": true, "write": true } } { "name": "Employee", "apply_when": { "email": "%%user.data.email" }, "insert": false, "delete": false, "read": true, "write": true, "search": true, "fields": {}, "additional_fields": { "read": true, "write": true } }
{ "_id": ObjectId(...), "employeeId": "0528", "name": "Phylis Lapin", "team": "sales", "email": "phylis.lapin@dundermifflin.com", "manages": [] } { "_id": ObjectId(...), "employeeId": "0713", "name": "Stanley Hudson", "team": "sales", "email": "stanley.hudson@dundermifflin.com", "manages": [] } { "_id": ObjectId(...), "employeeId": "0865", "name": "Andy Bernard", "team": "sales", "email": "andy.bernard@dundermifflin.com", "manages": [ "phylis.lapin@dundermifflin.com", "stanley.hudson@dundermifflin.com" ] }
App Services에서 역할을 할당하는 방법
App Services는 Device Sync(유연 모드)를 사용하는지 여부에 따라 서로 다른 시간에 역할을 할당합니다.
Device Sync를 사용할 경우, App Services는 동기화할 각 컬렉션에 대해 동기화 세션이 시작될 때 역할을 할당합니다. 동기화 세션은 동기화 연결을 연 시점부터 닫은 시점까지의 기간입니다.
Device Sync를 사용하지 않는 경우, App Services는 문서별, 요청별로 역할을 할당합니다.
Device Sync 사용 여부에 관계없이 컬렉션에 특정한 역할 세트와 지정되지 않은 다른 컬렉션에 적용되는 기본 역할 집합을 정의할 수 있습니다. 역할을 할당하려면 App Services에서 각 역할의 "apply when" 표현식을 지정한 순서대로 평가합니다. "apply when" 표현식이 참으로 평가되는 첫 번째 역할이 할당된 역할이 됩니다. 일치하는 역할이 없으면 액세스가 거부됩니다.
특정 요청이나 동기화 세션에서 평가된 역할 집합은 사용자가 어떤 컬렉션에 액세스하는지에 따라 다릅니다. 컬렉션에 컬렉션 수준 역할을 정의한 경우 컬렉션 수준 역할이 평가됩니다. 그렇지 않으면 데이터 소스의 기본 역할(있는 경우)이 평가됩니다.
Atlas App Services는 컬렉션 수준 역할이 적용되지 않는 경우 기본 역할로 "대체"되지 않습니다. 컬렉션 수준 역할이 정의된 경우 컬렉션 수준 역할만 평가됩니다. 기본 역할은 컬렉션 수준 역할이 정의되지 않은 경우에만 평가됩니다.
Device Sync 없음
Device Sync를 사용하지 않는 경우 App Services는 모든 문서에 동적으로 역할을 할당합니다. 사용자는 수신 쿼리와 일치하는 각 문서에 대해 별도의 역할을 할당받거나 아무 역할도 할당받지 않습니다.
먼저 앱에서는 필터를 평가하고 적용한 후에 쿼리를 실행합니다.
예시
다음 요청을 실행하면 App Services에서 restaurants
city
필드가 "Chicago"
(으)로 설정된 restaurants
컬렉션의 모든 문서에 대한 역할을 평가하게 됩니다.
db.restaurants.updateMany( { "city": "Chicago" }, { "$set": { "city": "Chicago, IL" } } );
앱은 쿼리 에서 반환된 각 문서 에 대해 가능한 역할을 역할 순서대로 평가하고 첫 번째 적용 가능한 역할(있는 경우)을 할당합니다. 역할 은 특정 역할의 " 적용 시기 " 표현식 이 문서 에 대해 실행 때 true
로 평가될 경우 해당 문서 에 역할이 적용됩니다.
예시
직원은 언제나 각자의 팀에 속해 있으므로 문서에 직원과 팀원 역할이 모두 적용됩니다. 하지만 역할은 하나만 사용할 수 있기 때문에 보다 구체적인 직원 역할을 사용하겠습니다.
이를 구성하려면 collection의 역할 정의에서 Teammate(팀원)보다 먼저 Employee(직원)를 지정하세요.
{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [ { "name": "Manager", ... }, { "name": "Employee", ... }, { "name": "Teammate", ... } ] }
Device Sync 사용
Device Sync를 사용할 경우, App Services는 동기화된 각 컬렉션에 대해 Flexible Sync 세션이 시작될 때 역할을 할당합니다. 이 역할은 세션 기간 동안 각 컬렉션에 어떤 권한을 적용할지 결정합니다.
App Services는 당 컬렉션최대 하나의 역할을 할당합니다. 동기화된 지정 컬렉션에 대한 역할을 지정하지 않은 경우 Atlas App Services는 기본 역할을 대신 사용합니다. 만약 컬렉션에 적용되는 역할이 없으면 사용자는 해당 컬렉션의 항목을 동기화(또는 읽기 또는 쓰기)할 수 없습니다.
역할은 세션 기간 동안 할당된 상태로 유지됩니다. 사용자의 세션 도중에 사용자의 세션 역할과 관련된 사항이 변경되는 경우, 새 세션을 시작할 때까지는 업데이트된 역할이 사용자에게 할당되지 않습니다. 그 예로 사용자의 메타데이터 또는 이 역할의 "apply when" 표현식이 변경되는 경우, 사용자는 다음번에 세션을 시작할 때까지 해당 컬렉션에 대해 기존 역할을 계속 사용합니다.
권한 시스템에 대해 Device Sync를 사용할 때는 몇 가지를 특별히 고려해야 합니다. Device Sync-Compatible Permissions(Device Sync와 호환되는 권한)를 참조하세요.
일반 권한 모델을 사용하여 Flexible Sync를 설정하는 방법은 Device Sync 권한 가이드를 참조하세요.
When 표현식 적용
역할의 "apply when" 표현식은 역할을 할당해야 하는지 여부를 결정하는 규칙 표현식입니다.
표현식 변수를 사용하여 역할의 상태를 동적으로 만들 수 있습니다. 그 예로 %%user
확장을 사용하여 요청을 발행한 특정 사용자를 참조할 수 있습니다. 이로써 사용자별로 데이터 액세스 권한을 사용자 지정할 수 있습니다.
Device Sync를 사용하지 않는 경우 현재 역할이 할당된 문서를 참조할 수 있습니다. 예를 들어, %%root
를 사용할 수 있습니다. 이를 통해 문서별로 데이터 액세스 권한을 사용자 지정할 수 있습니다.
문서 필터
역할의 document_filters
표현식은 역할의 후속 문서 및 필드 수준 권한을 평가할 수 있는지 여부를 결정합니다. 이는 Device Sync에 필요합니다.
참고: App Services는 문서별로 문서 필터를 평가합니다. 이러한 필터를 최상위 쿼리 필터와 혼동하지 마세요.
역할 순서
특정 컬렉션의 역할에는 각각 평가 및 적용 순서를 결정하는 위치가 있습니다. 역할이 적용되거나 역할이 남아 있지 않을 때까지 표현식이 역할 순서대로 평가될 때 각 역할이 적용됩니다.
사용자는 특정 쿼리에서 문서당 하나의 역할만 가질 수 있습니다. 역할 순서는 여러 역할의 'apply when' 표현식이 참인 경우 적용되는 역할을 결정합니다. 따라서 역할을 정의할 때는 가장 구체적인 역할을 먼저 지정합니다.
동기화 호환성
Device Sync(유연 모드)가 활성화된 경우, 할당된 역할은 동기화와 호환 가능해야 합니다. 자세한 내용은 동기화 호환 가능 역할을 참조하세요.
역할/권한 지정
App Services UI에서 또는 App Services CLI로 구성 파일을 배포하여 앱의 데이터 액세스 규칙을 구성할 수 있습니다.
왼쪽 탐색 메뉴에서 Rules 을 클릭한 다음 데이터 소스의 컬렉션 목록에서 컬렉션 을 선택합니다. Default roles and filters 를 선택하여 전체 클러스터 에 대한 기본값 규칙을 구성할 수도 있습니다.
아직 정의된 역할이 없는 경우 새 역할을 만들라는 메시지가 표시됩니다. 그렇지 않으면 기존 역할의 정렬된 목록이 표시됩니다.
새 역할을 정의하려면 Add role을 클릭합니다. 미리 설정된 역할을 시작점으로 사용하거나 Skip (start from scratch)을 클릭할 수 있습니다.
역할에 이름을 지정합니다. 이름은 원하는 대로 지정할 수 있지만 주어진 컬렉션 내에서 고유해야 합니다. 사용자 및/또는 데이터와의 관계를 설명하는 이름을 사용하는 것이 좋습니다. 예를 들어
Admin
또는Owner
입니다.특정 사용자가 특정 문서에 대한 역할을 갖는 시점을 결정하는 'apply when' 표현식을 정의합니다.
역할에 대한 문서 수준 권한을 정의합니다.
역할에 대한 문서 필터를 정의합니다. Device Sync (유연 모드)에 필요합니다.
드롭다운을 사용하여 역할에 대한 필드 수준 권한을 선택합니다. Specify field-level permissions을 선택하는 경우 권한을 정의할 대상 필드 이름을 입력하세요.
이름을 지정하는 각 필드와 Additional Fields에 대해 None, Read 또는 Read & Write을 선택하여 사용 권한을 지정합니다.
역할을 저장합니다.
컬렉션에 둘 이상의 역할이 할당된 경우 각 역할의 화살표를 클릭하여 역할 순서를 수정할 수 있습니다.
최신 버전의 앱 을 가져옵니다.
appservices pull --remote="<Your App ID>" 하나 이상의 컬렉션에 대한 역할 및 필터 를 정의합니다. 구성되지 않은 모든 컬렉션 에 적용 되는 기본값 역할 및 필터 를 정의할 수도 있습니다. 자세한 내용은 규칙 구성 을 참조하세요.
/data_sources/<data source>/<database>/<collection>/rules.json{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [ { "name": "<Role Name>", "apply_when": {}, "document_filters": { "read": { <Expression> }, "write": { <Expression> } }, "insert": true, "delete": true, "search": true, "fields": { "myField": { "read": true, "write": true } }, "additional_fields": { "read": true, "write": true } } ], "filters": [ { "name": "<Filter Name>", "apply_when": {}, "query": {}, "projection": {} } ] } /data_sources/<data source>/default_rule.json{ "roles": [ { "name": "<Role Name>", "apply_when": {}, "document_filters": { "read": { <Expression> }, "write": { <Expression> } }, "insert": true, "delete": true, "search": true, "fields": { "myField": { "read": true, "write": true } }, "additional_fields": { "read": true, "write": true } } ], "filters": [ { "name": "<Filter Name>", "apply_when": {}, "query": {}, "projection": {} } ] } 앱 을 배포합니다.
appservices push
참고
App Services 역할 기반 권한에 대한 보안 고려 사항
역할 기반 권한 및 필터는 컬렉션 내의 특정 문서와 필드를 숨길 수 있지만, 시스템에서 임의의 쿼리가 컬렉션에 액세스할 수 있도록 허용하는 경우 데이터가 노출될 가능성이 있습니다.
예를 들어, 컬렉션에 저장된 값에 따라 오류를 발생시키는 쿼리 또는 함수(예: 0으로 나누기 오류)는 역할이나 필터로 인해 쿼리하는 사용자가 문서를 직접 볼 수 없는 경우에도 문서에 대한 정보를 표시할 수 있습니다. 사용자는 다른 방법(예: 데이터 분산의 영향을 받을 수 있는 쿼리 실행 시간 측정)으로 기본 데이터에 대해 추론할 수도 있습니다.
이러한 사항이 가능하다는 것을 인지하시고 필요한 경우 데이터 액세스 패턴을 감사하세요.