사용자 지정 사용자 메타데이터 정의
이 페이지의 내용
사용자 지정 메타데이터를 앱의 각 사용자와 연결할 수 있습니다. 예를 들어 사용자의 선호 언어, 생년월일 또는 사용자와 연결하려는 기타 정보를 저장할 수 있습니다.
두 가지 소스에서 사용자에 대한 메타데이터를 가져올 수 있습니다:
사용자 지정 사용자 데이터를 저장하는 MongoDB Atlas 컬렉션. 사용자 ID를 기준으로 각 사용자를 컬렉션의 문서와 연결할 수 있습니다. 각 문서에 임의의 데이터를 저장할 수 있습니다.
인증 제공자. 제공자가 Google, Facebook 또는 사용자 지정 제공자와 같은 JSON Web Token을 사용하는 경우 제공자 구성에서 사용자의 JWT 데이터를 사용자 계정과 연결하는 메타데이터 필드를 정의할 수 있습니다.
사용자 지정 사용자 데이터
애플리케이션 사용자에 대한 임의의 데이터를 MongoDB 컬렉션에 저장할 수 있습니다. 앱은 사용자 ID에 대한 특정 필드를 쿼리하여 각 사용자를 컬렉션의 문서에 매핑합니다. 사용자가 인증되면 앱은 사용자의 데이터를 조회하고 이를 액세스 토큰에 포함합니다.
ID가 "63ed2dbe5960df2af7fd216e"
인 사용자가 있다고 가정합니다. 사용자 ID를 userId
필드에 저장하도록 사용자 지정 사용자 데이터 컬렉션을 설정한 경우 사용자는 다음 문서에 매핑됩니다.
{ "_id": "63ed2e4fb7f367c92578e526", "user_id": "63ed2dbe5960df2af7fd216e", "preferences": { "preferDarkMode": true }, "dateOfBirth": "1989-03-11T00:00:00.000Z" }
사용자 지정 사용자 데이터를 사용할 때는 다음 사항에 유의하세요:
사용자당 하나의 문서 저장: 사용자 데이터가 포함된 문서에는 특정 필드에 사용자의 ID를 포함해야 합니다. 여러 문서가 동일한 사용자 ID를 지정하는 경우 App Services는 먼저 삽입된 문서의 데이터만 노출합니다.
사용자 지정 사용자 데이터 파일 작게 유지: 액세스 토큰에 사용자의 전체 사용자 지정 사용자 문서가 포함됩니다. 일반적으로 사용자 지정 사용자 데이터 문서는 16KB 미만으로 작게 유지하는 것을 권장합니다. 다른 서비스에서는 HTTP 헤더 크기를 제한할 수 있으므로 사용자 지정 사용자 데이터 객체가 클수록 연동 문제가 발생할 수 있습니다.
오래된 사용자 지정 데이터: 사용자의 사용자 지정 데이터는 MongoDB 컬렉션에서 제공되지만 사용자의 인증 액세스 토큰에 저장되고 이 토큰에서 읽혀집니다. 기본 문서가 변경될 때 사용자가 유효한 액세스 토큰을 가지고 있는 경우, 액세스 토큰을 새로 고치거나 다시 인증할 때까지 해당 세션의 사용자 지정 데이터가 업데이트되지 않습니다.
사용자 지정 사용자 데이터 생성 및 관리
사용자 지정 사용자 데이터 컬렉션의 문서를 관리할 책임은 사용자에게 있습니다. 사용 사례에 따라 다음을 수행할 수 있습니다:
사용자 생성 함수 를 사용하여 애플리케이션 에 등록할 때 각 사용자에 대한 문서 를 자동으로 생성합니다. 이 함수는 사용자에게 액세스 토큰이 발급되기 전에 실행되므로 추가한 데이터는 첫 번째 로그인 시 액세스 토큰에 포함됩니다.
인증 트리거를 사용하여 사용자가 등록하거나 로그인할 때 사용자의 사용자 지정 데이터를 업데이트하고 계정이 삭제된 경우 데이터를 삭제합니다. 트리거는 비동기적으로 실행되며 사용자의 액세스 토큰이 생성된 후에 완료될 수 있습니다.
예정된 트리거 를 사용하여 사용자 지정 사용자 데이터를 주기적으로 업데이트하거나 삭제할 수 있습니다.
함수, Atlas Device SDK, MongoDB 운전자 또는 MongoDB Compass 의 표준 CRUD 작업을 사용하여 컬렉션 에서 문서를 수동으로 생성, 업데이트 및 삭제 합니다.
사용자 지정 사용자 데이터 보호
앱의 사용자 지정 사용자 데이터에 개인 정보 또는 비공개 사용자 정보가 포함된 경우, 사용자 지정 사용자 데이터 컬렉션에 대한 액세스를 제한해야 합니다. 다음 권한 모델 중 하나를 사용하여 권한이 있는 사용자로 읽기 및 쓰기 액세스를 제한하는 것이 좋습니다.
사용자는 자체 사용자 지정 사용자 데이터 문서를 읽거나 쓸 수 있습니다. 다른 모든 문서에 대한 읽기 및 쓰기 액세스를 거부합니다.
예시
다음 컬렉션 구성에는 ID가 문서의
user_id
필드에 포함된 경우에만 사용자에게 문서에 대한 읽기 및 쓰기 액세스 권한을 부여하는 역할이 하나 있습니다.사용자 지정 사용자 데이터 컬렉션 구성{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [ { "name": "ThisUser", "apply_when": { "user_id": "%%user.id%%" }, "insert": false, "read": true, "write": true, "search": false, "delete": false } ], "filters": [] } 어떤 사용자도 사용자 지정 사용자 데이터 문서를 읽거나 쓸 수 없습니다. 대신 시스템 기능을 사용하여 사용자를 대신하여 사용자 지정 사용자 데이터를 관리하세요.
사용자 생성 함수
새 사용자가 성공적으로 등록할 때마다 새 사용자 계정이 생성되기 전에 실행되는 함수를 정의할 수 있습니다. 함수에서 예외 또는 오류가 발생하면 사용자 계정 만들기가 실패합니다. 이를 통해 사용자 생성 시 항상 사용자의 연관 사용자 지정 데이터가 존재하도록 보장할 수 있습니다.
이 함수는 사용자 메타데이터 객체 를 유일한 인수로 받습니다. 이를 사용하여 사용자에 대한 새 사용자 지정 사용자 데이터 문서 를 만들 수 있습니다.
exports = async function onUserCreation(user) { const customUserDataCollection = context.services .get("mongodb-atlas") .db("myapp") .collection("users"); try { await customUserDataCollection.insertOne({ // Save the user's account ID to your configured user_id_field user_account_id: user.id, // Store any other user data you want favorite_color: "blue", }); } catch (e) { console.error(`Failed to create custom user data document for user:${user.id}`); throw e } }
팁
사용자 생성 함수를 구성한 후에는 App Services에서 해당 함수를 삭제하지 못하도록 방지합니다. 함수를 삭제하려면 먼저 다른 사용자 생성 함수를 사용하도록 사용자 지정 사용자 데이터 구성을 변경하세요.
사용자 지정 사용자 데이터 활성화
App Services 관리 UI에서 사용자 지정 사용자 데이터를 구성하고 활성화할 수 있습니다.
사용자 지정 사용자 데이터 컬렉션 지정
애플리케이션 사용자에 대한 사용자 지정 데이터를 연결된 MongoDB Atlas 클러스터의 단일 collection에 저장해야 합니다. 이 collection에서 사용자 데이터를 읽도록 애플리케이션을 구성하려면 다음 값을 지정해야 합니다.
Cluster Name: 사용자 지정 사용자 데이터 컬렉션 을 포함하는 연결된 MongoDB cluster 의 이름입니다.
Database Name: 사용자 지정 사용자 데이터 컬렉션이 포함된 MongoDB 데이터베이스의 이름입니다.
Collection Name: 사용자 지정 사용자 데이터가 포함된 MongoDB collection의 이름입니다.
사용자 ID 필드 지정
사용자 지정 사용자 데이터 컬렉션의 모든 문서에는 해당 문서를 특정 애플리케이션 사용자에 매핑하는 필드가 있습니다. 필드는 ObjectID
유형이거나 해당 ObjectID를 나타내는 string
유형이어야 합니다. 이 필드는 사용자에게 매핑되는 모든 문서에 포함되어야 합니다.
User ID Field 입력란에 각 사용자의 ID가 포함된 필드의 이름을 지정합니다.
참고
두 문서에 동일한 사용자 ID가 포함되어 있고 하나는 문자열로 저장되고 다른 하나는 ObjectID로 저장된 경우, App Services는 문자열 유형으로 문서를 사용자에게 매핑합니다.
사용자 생성 함수 정의(선택 사항)
사용자 생성 함수 를 사용하려면 인라인 편집기에서 정의하거나 이름으로 기존 함수를 참조하세요.
업데이트된 애플리케이션 배포
사용자 지정 사용자 데이터 컬렉션을 구성한 후에는 애플리케이션을 배포하여 클라이언트 애플리케이션에서 사용자 지정 사용자 데이터를 사용할 수 있도록 설정할 수 있습니다. App Services UI에서 초안 애플리케이션을 배포하려면 다음을 수행합니다.
왼쪽 탐색 패널에서 Deploy 을 클릭합니다.
배포서버 기록 테이블에서 초안을 찾은 다음 Review & Deploy Changes을 클릭합니다.
변경 사항의 차이를 검토한 다음 Deploy을(를) 클릭합니다.
애플리케이션이 성공적으로 배포되면 App Services는 사용자 지정 데이터를 사용자와 연결하기 시작합니다. 사용자가 로그인하면 App Services는 지정된 User ID Field에 사용자 ID가 포함된 문서에 대해 사용자 지정 사용자 데이터 컬렉션을 자동으로 쿼리합니다. 문서가 일치하는 경우 App Services는 해당 사용자의 사용자 객체의 custom_data
필드에 문서의 데이터를 노출합니다.
사용자 지정 사용자 데이터 구성
애플리케이션 사용자에 대한 사용자 지정 데이터를 연결된 Atlas cluster 의 단일 컬렉션 에 저장 해야 합니다. 컬렉션 의 모든 문서 에는 해당 문서에서 설명하는 App Services 사용자의 사용자 ID 가 포함된 특정 필드 가 포함되어야 합니다.
이 컬렉션 에서 사용자 데이터를 읽도록 애플리케이션 을 구성하려면 /auth/custom_user_data.json
에서 사용자 지정 사용자 데이터 구성 문서 를 정의합니다.
{ "enabled": <Boolean>, "mongo_service_name": "<MongoDB Data Source Name>", "database_name": "<Database Name>", "collection_name": "<Collection Name>", "user_id_field": "<User ID Field Name>", "on_user_creation_function_name": "<Function Name>" }
클라이언트 애플리케이션에서 사용자 지정 사용자 데이터 액세스
클라이언트 애플리케이션 에서 사용자 지정 사용자 데이터 에 액세스 하고 업데이트 하는 방법을 보여주는 코드 예제는 Atlas Device SDK 설명서를 참조하세요.
사용자 지정 사용자 데이터의 권한 수정 모범 사례
사용자 지정 사용자 데이터 문서 를 변경하면 사용자의 권한 이 자동으로 새로 고침됩니다. 해당 사용자 세션 이 종료된 후 자동으로 새로 고침됩니다.
사용자 권한이 자동으로 새로 고쳐지도록 하려면 사용자 지정 사용자 데이터 문서를 뷰 또는 time series 컬렉션 이 아닌 일반 컬렉션 에 저장해야 합니다.
권한을 자동으로 새로 고치려면 사용자 지정 사용자 데이터 문서 를 삭제 하지 마세요. 대신 문서 에서 ID 가 아닌 모든 필드의 설정을 해제하세요.
예시
사용자에게 읽기 및 쓰기 (write) 권한이 할당된 다음 문서 를 가정해 보겠습니다.
{ "_id": "63ed2erealobjectid78e526", "user_id": "63ed2dbe5960df2af7fd216e", "canRead": true, "canWrite": true, }
canRead
및 canWrite
필드는 이 문서 컬렉션 의 역할을 결정하는 데 도움이 될 수 있습니다. 예를 예시 canRead
필드 는 apply_when
표현식 에서 다음 readAllRole
에 대한 자격을 결정하는 데 사용됩니다.
{ "name": "readAllRole" "apply_when": {"%%user.custom_data.canRead": true}, ... }
사용자가 장기간 활성화되지 않아 문서 를 제거 하고 싶다고 가정해 보겠습니다. 먼저 비 ID 필드의 설정을 해제하여 직원의 권한을 올바르게 제거 해야 합니다. 그러면 문서 는 다음과 같이 표시됩니다.
{ "_id": "63ed2erealobjectid78e526", "user_id": "63ed2dbe5960df2af7fd216e" }
비 ID 필드 의 설정을 해제하면 App Services 에서 역할에 따라 사용자의 권한을 자동으로 새로 고칠 수 있습니다. 이제 필요한 경우 문서 를 안전하게 삭제 수 있습니다.
인증 제공자 메타데이터
Atlas App Services는 인증 제공자로부터 사용자 메타데이터를 읽을 수 있습니다. 그런 다음 App Services는 사용자 객체의 필드에 각 사용자의 데이터를 노출합니다. 예를 들어 사용자의 이름, 이메일, 생일 또는 성별에 액세스하고 싶을 수 있습니다.
사용자가 로그인할 때 액세스 토큰으로 메타데이터를 요청하도록 App Services를 구성할 수 있습니다. 클라이언트 SDK를 사용하여 로그인한 사용자의 객체에서 해당 데이터에 액세스할 수 있습니다.
인증 제공자를 구성할 때 요청할 메타데이터를 정의할 수 있습니다. 사용자 계정을 통해 액세스하려는 선택적 메타데이터 필드를 지정합니다. 이러한 메타데이터 필드는 제공자에 따라 다릅니다.
제공자 | 메타데이터 필드 |
---|---|
Facebook |
|
Google |
|
사용자 지정 JWT | 사용자 지정 JWT 제공자의 메타데이터 필드 구성에 지정된 내용에 따른 JWT의 모든 필드입니다. |
중요
오래된 인증 제공자 메타데이터 방지
액세스 토큰이 발급된 후 사용자의 메타데이터 가 업데이트되면 이전에 생성된 액세스 토큰을 사용하는 요청에는 새로 업데이트된 메타데이터 가 포함되지 않습니다. 액세스 토큰을 새로 고치거나 재인증하면 사용자 메타데이터 가 업데이트 됩니다.
참고
보안 및 인증 제공자 메타데이터
인증 제공자 메타데이터는 클라이언트 및 외부 인증 제공자가 외부에서 정의할 수 있으므로 신중하게 고려해야 합니다. 데이터 액세스 권한에 대한 규칙 표현식에 이 메타데이터를 사용하는 등 보안 관련 결정을 내릴 때 인증 제공자 메타데이터에만 의존해서는 안 됩니다.
인증 제공자 메타데이터 구성
사용자 메타데이터 구성
Google 또는 Facebook
활성화하려는 메타데이터 필드 옆에 있는 확인란을 선택합니다.
사용자 지정 JWT 인증
멱등이 지원하는 메타데이터 필드를 지정할 수 있습니다. Add Field 버튼을 누른 후 정의합니다:
경로
필드 이름
필드가 선택 사항인지 필수 사항인지 여부
자세한 내용은 JWT 메타데이터 필드를 참조하십시오.
액세스하려는 메타데이터를 구성한 후 Save Draft 버튼을 누르세요.
업데이트된 애플리케이션 배포
메타데이터 구성을 업데이트한 후에는 애플리케이션을 배포해야 합니다. App Services UI에서 초안 애플리케이션을 배포하려면 다음을 수행합니다.
왼쪽 탐색 패널에서 Deploy 을 클릭합니다.
배포서버 기록 테이블에서 초안을 찾은 다음 Review & Deploy Changes을 클릭합니다.
변경 사항의 차이를 검토한 다음 Deploy을(를) 클릭합니다.
애플리케이션이 성공적으로 배포되면 App Services는 메타데이터를 사용자와 연결하기 시작합니다. 사용자가 로그인하면 App Services는 요청된 메타데이터에 액세스할 수 있는 권한을 사용자에게 요청합니다. 사용자가 승인하면 App Services는 해당 사용자의 사용자 객체에 있는 데이터를 노출합니다.
메타데이터 필드 구성
/auth/providers.json
에서 앱 에 대한 인증 제공자 metadata_fields 를 찾을 수 있습니다. 인증 제공자 에게 사용자 메타데이터 를 요청 하려면 이 배열 을 업데이트합니다.
Google 또는 Facebook
이 배열 은 다음과 유사합니다.
{ ...other config details... "metadata_fields": [ { "required": false, "name": "name" }, { "required": false, "name": "gender" } ] }
사용자 지정 JWT 인증
metadata_fields 배열 에는 추가 속성field_name
이(가) 있습니다. 사용자 지정 JSON web token 인증 에서 name
는 필드 의 경로를 나타냅니다. field_name
는 필드 의 이름을 나타냅니다.
{ ...other config details... "metadata_fields": [ { "required": true, "name": "user.name", "field_name": "name" }, { "required": false, "name": "user.favoriteColor", "field_name": "favoriteColor" } ] }
MongoDB Atlas 사용자 인증하기
MongoDB Atlas API 키 쌍을 사용하여 관리자 사용자 인증 엔드포인트를 호출합니다.
curl -X POST \ https://services.cloud.mongodb.com/api/admin/v3.0/auth/providers/mongodb-cloud/login \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -d '{ "username": "<Public API Key>", "apiKey": "<Private API Key>" }'
인증 이 성공하면 응답 본문에 access_token
값을 가진 JSON 객체 가 포함됩니다.
{ "access_token": "<access_token>", "refresh_token": "<refresh_token>", "user_id": "<user_id>", "device_id": "<device_id>" }
access_token
은(는) App Services Admin API 에 대한 액세스 을 부여합니다. 모든 관리자 API 요청에 대해 Authorization
헤더에 베어러 토큰으로 포함해야 합니다.
메타데이터 필드 구성
인증 제공자 업데이트 엔드포인트에 요청 을 보냅니다. 요청 본문에서 제공자 에 대해 metadata_fields
를 정의합니다.
관리자 API access_token
, 앱이 포함된 Atlas 프로젝트 의 groupId
, 앱의 내부 appId
16진수 string 및 인증 제공자 의 _id
값을 포함해야 합니다.
curl --request PATCH 'https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/auth_providers/{providerId}' \ --header 'Authorization: Bearer <access_token>' \ --header 'Content-Type: application/json' \ --data '{ "_id": "<Provider ID>", "name": "oauth2-facebook", "type": "oauth2-facebook", "redirect_uris": ["https://example.com/"], "config": { "clientId": "<Facebook Client ID>" }, "secret_config": { "clientSecret": "<Facebook Client Secret Name>" }, "metadata_fields": [ { "required": false, "name": "name" }, { "required": true, "name": "first_name" }, { "required": true, "name": "last_name" }, { "required": false, "name": "picture" }, { "required": false, "name": "gender" }, { "required": false, "name": "birthday" }, { "required": false, "name": "min_age" }, { "required": false, "name": "max_age" }, { "required": false, "name": "email" } ], "disabled": false }'
curl --request PATCH 'https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/auth_providers/{providerId}' \ --header 'Authorization: Bearer <access_token>' \ --header 'Content-Type: application/json' \ --data '{ "_id": "<Provider ID>", "name": "oauth2-google", "type": "oauth2-google", "redirect_uris": ["https://example.com/"], "config": { "clientId": "<Google Client ID>" }, "secret_config": { "clientSecret": "<Google Client Secret Name>" }, "metadata_fields": [ { "required": false, "name": "name" }, { "required": true, "name": "first_name" }, { "required": true, "name": "last_name" }, { "required": false, "name": "picture" }, { "required": false, "name": "gender" }, { "required": false, "name": "birthday" }, { "required": false, "name": "min_age" }, { "required": false, "name": "max_age" }, { "required": false, "name": "email" } ], "disabled": false }'
curl --request PATCH 'https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/auth_providers/{providerId}' \ --header 'Authorization: Bearer <access_token>' \ --header 'Content-Type: application/json' \ --data '{ "_id": "<Provider ID>", "name": "custom-token", "type": "custom-token", "metadata_fields": [ { "required": true, "name": "jwt.field.path", "field_name": "metadataFieldName" } ], "config": { "audience": [], "requireAnyAudience": false, "signingAlgorithm": "HS256", "useJWKURI": false }, "secret_config": { "signingKeys": [ "<JWT Signing Key>" ] }, "disabled": true }'
제공자의 메타데이터 필드를 성공적으로 구성하면 App Services 는 204
응답을 반환합니다.
참고
여러 인증 제공자가 연결된 사용자를 위한 팁
최신 메타데이터를 보장하려면 사용자는 다른 인증 제공자로 전환한 후 다시 인증해야 합니다. 그렇지 않으면 UI의 App Users 페이지에 있는 Users 표와 인증 제공자를 사용하는 요청에 오래된 메타데이터가 반영될 수 있습니다.
사용자가 인증 제공자 간에 전환하는 경우 메타데이터가 전파되는 데 최대 30분이 걸릴 수 있습니다. 요청에는 사용된 인증 제공자와 관련된 최신 메타데이터가 항상 보장됩니다.
클라이언트 애플리케이션에서 사용자 메타데이터 액세스
클라이언트 애플리케이션 에서 사용자 메타데이터 데이터 데이터에 액세스 하는 방법을 보여주는 코드 예제는 Atlas Device SDK 설명서를 참조하세요.