사용자 지정 HTTPS 엔드포인트 [사용 중단됨]
이 페이지의 내용
사용자 지정 HTTPS endpoints를 정의해 외부 서비스와 통합되는 앱별 API 경로나 웹훅을 생성할 수 있습니다. 사용자 지정 엔드포인트는 특정 URL과 HTTP 메서드를 위한 수신 요청을 처리할 때 쓰는 서버리스 함수를 사용합니다.
참고
사용자 지정 HTTPS endpoints 는 비공개 엔드포인트 에서 지원되지 않습니다.
엔드포인트는 암호화된 표준 HTTPS requestsfmf 사용하므로 이를 호출하기 위해 데이터베이스 드라이버나 자체 라이브러리를 설치할 필요가 없습니다. 대신 모든 HTTP 클라이언트에서 이와 같은 요청을 보내면 됩니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "name": "Casey" }'
엔드포인트의 구조
엔드포인트는 특정 URL로 전송된 한 개 이상의 HTTP 메서드를 처리합니다.
기본 URL
앱의 엔드포인트는 기본 URL을 공유합니다. URL은 앱 ID를 사용하여 고유한 방식으로 앱을 가리킵니다.
전역에 배포된 앱은 다음 형식을 사용합니다.
https://data.mongodb-api.com/app/<App ID>/endpoint
로컬로 배포된 앱의 엔드포인트에서는 해당 앱의 배포 리전에 특정된 기본 URL을 사용합니다(예: us-east-1
).
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/endpoint
엔드포인트 경로
각 HTTPS endpoints에는 엔드포인트의 이름 역할을 하는 경로가 있습니다. 엔드포인트의 경로는 임의로 정해지며 앱에 따라 다릅니다. 하지만 엔드포인트 URL 경로에 표시되기 때문에 경로가 실행하는 조치를 나타내야 합니다.
경로 이름은 슬래시(/
)로 시작해야 하며 중첩된 경로를 나타내는 추가 슬래시를 포함할 수 있습니다.
/my/nested/route
앱의 기본 URL에 경로를 추가하고 HTTP 요청을 보내 엔드포인트를 호출합니다.
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route
HTTP 메서드
앱 의 각 엔드포인트는 하나 이상의 HTTP 메서드 를 처리합니다. 지정된 경로에 대해 예를 예시 POST
새 리소스 를 만드는 요청과 GET
기존 리소스를 나열하는 요청 을 수락하는 단일 경로가 있을 수 있습니다.
경로는 동일하지만 서로 다른 요청 메서드를 처리하는 여러 개의 사용자 지정 엔드포인트를 정의할 수 있습니다. 또는, 모든 메서드를 처리하는 경로를 위한 단일 엔드포인트를 정의할 수 있습니다.
사용자 지정 엔드포인트는 다음과 같은 표준 HTTP 메서드를 지원합니다.
사용자 지정 HTTPS Endpoints 만들기
App Services UI에서, 혹은 App Services CLI로 구성 파일을 배포하여 원하는 앱의 데이터 API를 구성할 수 있습니다.
왼쪽 탐색 메뉴에서 HTTPS Endpoints 을 클릭한 다음 Add An Endpoint 을 클릭합니다.
엔드포인트 Route을 정의합니다. 경로 이름은 슬래시(
/
)로 시작해야 하며 중첩된 경로를 나타내는 추가 슬래시를 포함할 수 있습니다.드롭다운에서 엔드포인트의 HTTP 메서드를 선택합니다. 특정 방법(예:
GET
또는POST
)을 선택하거나 엔드포인트가 모든 HTTP 메서드(예:ANY
)를 수락하도록 구성할 수 있습니다.JSON 또는 EJSON 중 응답 유형을 선택합니다. Respond With Result 을(를) 활성화하여 엔드포인트 함수의 반환 값을 응답 본문으로 자동으로 포함할 수 있습니다.
엔드포인트에 대한 요청을 처리하는 엔드포인트 함수를 작성합니다. 또는 기존 함수를 이름으로 지정할 수도 있습니다.
보안을 강화하려면 요청 권한 부여를 구성할 수 있습니다.
데이터 API 구성을 저장합니다.
데이터를 안전하게 읽고 쓰기 위한 요청을 허용하도록 액세스 권한을 구성합니다.
앱을 저장하고 배포합니다.
최신 버전의 앱 을 가져옵니다.
appservices pull --remote="<Your App ID>" 사용자 지정 엔드포인트에 대한 구성 객체를 정의합니다.
http_endpoints/config.json[ { "route": "<Endpoint route name>", "http_method": "<HTTP method>", "function_name": "<Endpoint function name", "validation_method": "<Authorization scheme>", "respond_result": <boolean>, "fetch_custom_user_data": <boolean>, "create_user_on_auth": <boolean>, "disabled": <boolean> } ] 하나 이상의 컬렉션에 대한 규칙 을 정의합니다.
data_sources/mongodb-atlas/<db>/<collection>/rules.json{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [<Role>], "filters": [<Filter>] } 앱 을 배포합니다.
appservices push
인증
사용자 지정 엔드포인트는 특정 사용자의 컨텍스트에서 실행됩니다. 이 때문에 앱에서는 각 요청에 대해 규칙을 시행하고 문서 스키마의 유효성을 검사할 수 있습니다.
기본적으로 엔드포인트는 API 키 또는 JWT와 같은 애플리케이션 사용자 중 한 명의 자격 증명을 각 요청에 포함하도록 요구하는 애플리케이션 인증을 사용합니다. 또한 애플리케이션의 요구 사항에 맞게 다른 사용자 지정 인증 체계를 구성할 수도 있습니다.
요청을 인증하는 방법의 예는 데이터 API 요청 인증을 참조하세요.
애플리케이션 인증을 위해서는 사용자가 앱에 대해 허용한 인증 제공자를 통해 로그인해야 합니다. 요청에는 인증 제공자가 부여한 액세스 토큰이나 사용자가 로그인하는 데 사용하는 자격 증명이 포함될 수 있습니다(예: API 키 또는 이메일과 비밀번호).
사용자 ID 인증 은 모든 요청을 미리 선택된 단일 애플리케이션 사용자로 실행합니다. 이는 누가 엔드포인트를 호출했는지에 관계없이 모든 요청에 동일한 권한이 있어야 하는 경우에 유용합니다.
사용자를 선택하려면 엔드포인트 구성에서 사용자 계정 ID 를 지정합니다.
[ { ..., "run_as_user_id": "628e47baf4c2ac2796fc8a91" } ]
스크립트 인증 은 함수를 호출하여 요청 이 실행되는 애플리케이션 사용자를 결정합니다. 이를 사용하여 사용자 지정 인증 및 권한 부여 체계를 구현 수 있습니다.
및 애그리게이션 API에 대한 전체 액세스 이 있고 규칙, 역할 또는 제한된 권한의 적용을 받지 않는 ID string { "runAsSystem": true }
시스템 사용자 로 요청 을 실행 하려면 함수가 기존 애플리케이션 사용자의 계정 를 또는 로 반환해야 합니다.MongoDB CRUD
함수를 정의하려면 엔드포인트 구성에서 소스 코드를 지정하세요.
[ { ..., "run_as_user_id_script_source": "exports = () => {return \"628e47baf4c2ac2796fc8a91\"}" } ]
시스템 인증 은 자격 증명 이 필요하지 않고, MongoDB CRUD 및 애그리게이션 API에 대한 전체 액세스 이 있으며, 규칙, 역할 또는 제한된 권한의 적용을 받지 않는 시스템 사용자 로 실행 엔드포인트를 구성합니다.
[ { ..., "run_as_system": true } ]
팁
UI에서 생성하는 새 엔드포인트는 기본적으로 시스템 인증을 사용합니다.
권한 부여
엔드포인트는 인증된 사용자에게 요청에 추가 권한 부여 정보를 제공하도록 요구할 수 있습니다. 엔드포인트 기능을 구성하여 각 사용자 정의 엔드포인트에 대한 권한 부여 체계를 정의합니다.
엔드포인트는 기본적으로 요청이 권한 부여되었음을 증명하기 위해 시크릿 문자열을 사용하는 내장 권한 부여 체계 집합을 지원합니다. 내장 체계와 함께 사용하거나 내장 체계 대신 사용할 수 있는 사용자 지정 권한 부여 체계를 정의할 수도 있습니다.
특정 함수에 대한 권한 부여 방법을 알아보려면 함수 정의를 참조하세요.
기본 제공 권한 부여 체계
엔드포인트는 다음과 같은 내장 권한 부여 체계를 지원합니다.
모든 인증 사용자는 엔드포인트를 호출할 수 있는 권한이 있습니다. 인증된 요청은 권한 부여 정보를 포함하지 않아도 됩니다.
인증된 사용자는 secret
쿼리 매개변수의 값으로 특정 string 을 포함하여 엔드포인트를 호출할 권한이 있음을 증명해야 합니다.
시크릿의 string 을 정의하고 엔드포인트 구성에서 이름으로 시크릿 을 참조합니다.
[ { ..., "verification_method": "SECRET_AS_QUERY_PARAM", "secret_name": "secret_verification_string" } ]
요청 에 시크릿을 포함하는 방법을 학습 보려면 요청 승인하기를 참조하세요.
인증된 사용자는 요청 본문에서 생성된 16진수로 인코딩된 HMAC SHA-256 해시와 시크릿 string 이 포함된 Endpoint-Signature
헤더를 포함하여 엔드포인트를 호출할 권한이 있음을 증명해야 합니다.
시크릿의 string 을 정의하고 엔드포인트 구성에서 이름으로 시크릿 을 참조합니다.
요청에 서명하는 방법을 학습 보려면 요청 승인을 참조하세요.
사용자 지정 권한 부여 체계
사용자 지정 권한 부여 표현식을 정의하여 인증된 수신 요청을 실행할 수 있는지 여부를 결정할 수 있습니다. 표현식은 각 요청에 대해 평가되며 요청을 허용하려면 true
로 평가되어야 합니다. 표현식이 false
로 평가되면 요청이 승인되지 않고 오류와 함께 실패합니다. 권한 부여에 실패한 요청은 앱 청구 사용량에 포함되지 않습니다.
권한 부여 표현식은 %%user
등의 변수를 사용하여 호출 중인 사용자의 데이터를 기준으로 권한을 부여하거나, %%request
등의 변수를 사용하여 각 수신 요청의 세부 사항을 기준으로 결정을 내릴 수 있습니다.
사용자 지정 권한 부여 체계를 정의하려면 엔드포인트 함수 구성에서 표현식을 지정합니다.
[ { ..., "can_evaluate": { "%%request.requestHeaders.x-secret-key": "my-secret" } } ]
엔드포인트 함수 쓰기
모든 사용자 지정 엔드포인트는 엔드포인트가 수신 요청을 받을 때마다 실행되는 함수와 연결되어 있습니다. 이 함수에서는 npm에서 라이브러리를 가져오고, 연결된 MongoDB Atlas 클러스터에 연결하고, 다른 서버리스 함수를 호출할 수 있습니다.
App Services UI에서 엔드포인트를 생성 할 때 새 함수를 정의하려면 Function 섹션으로 이동하여 드롭다운에서 + New Function을(를) 선택합니다.
워크플로에 따라 엔드포인트 핸들러 함수를 정의하고 편집할 수도 있습니다.
App Services UI의 Functions 페이지.
App Services CLI를 사용하는 App Services의
functions
디렉토리.Admin API를 사용해 클라이언트에서
엔드포인트 함수는 항상 다음과 같은 2개 인수를 받습니다.
샘플 함수, 요청과 응답 예시는 예시를 참조하세요.
액세스 요청 데이터
사용자 지정 엔드포인트 Request
객체는 해당 엔드포인트를 호출한 HTTP 요청을 나타냅니다. 사용자는 수신 요청의 헤더, 쿼리 매개변수 및 본문 데이터에 액세스할 수 있습니다.
{ "headers": { "<Header>": ["<Header Value>"] }, "query": { "<Query Parameter>": "<Parameter Value>" }, "body": <BSON.Binary> }
필드 | 설명 | |||||
---|---|---|---|---|---|---|
query | 각 필드가 URL 쿼리 매개변수를 해당 값에 매핑하는 객체입니다. 쿼리 문자열에서 키가 여러 번 사용되는 경우 이 객체에는 처음 나타나는 항목만 표시됩니다. 전체 쿼리 문자열로 작업하려면 context.request.rawQueryString을 사용합니다. 예시다음
| |||||
headers | 각 필드가 요청 헤더 이름을 하나 이상의 값 배열에 매핑하는 객체입니다. 예시
| |||||
body | 요청 본문을 포함하는 BSON.Binary 객체입니다. 요청에 본문이 포함되지 않은 경우 이 값은 요청 본문의 데이터에 액세스하려면 바이너리를 직렬화해야 합니다.
|
HTTPS 응답 반환
사용자 지정 엔드포인트 Response
객체를 사용하면 호출자에게 다시 전송되는 HTTPS 응답을 구성할 수 있습니다. 상태 코드를 설정하고, 헤더를 사용자 지정하고, 응답 본문에 데이터를 포함할 수 있습니다.
메서드 | 설명 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
setStatusCode(code) - code: number | HTTP 응답 상태 코드를 설정합니다. 예시
| |||||||||
setBody(body) - body: string | BSON.Binary | HTTP 응답 본문을 설정합니다.
예시
| |||||||||
setHeader(name, value) - name: string - value: string |
예시
| |||||||||
addHeader(name, value) - name: string - value: string |
예시
|
예시
수신 POST
요청의 본문을 구문 분석하고, 구문 분석된 본문을 MongoDB 컬렉션에 저장한 다음 호출자에게 응답하는 엔드포인트 함수가 있다고 가정해 보겠습니다.
exports = async function MyCustomEndpoint(request, response) { try { // 1. Parse data from the incoming request if (request.body === undefined) { throw new Error(`Request body was not defined.`); } const body = JSON.parse(request.body.text()); // 2. Handle the request const { insertedId } = await context.services .get("mongodb-atlas") .db("myDb") .collection("myCollection") .insertOne({ date: new Date(), requestBody: body }); // 3. Configure the response response.setStatusCode(201); // tip: You can also use EJSON.stringify instead of JSON.stringify. response.setBody( JSON.stringify({ insertedId, message: "Successfully saved the request body", }) ); } catch (error) { response.setStatusCode(400); response.setBody(error.message); } };
이 함수는 다음과 같은 POST
요청을 수신합니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/custom" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "type": "event", "date": "2024-01-01T00:00:00.000Z", "name": "New Year Begins", "comment": "Happy New Year!" }'
{ "message": "Successfully saved the request body", "insertedId": "639a521bbdec9b85ba94014b" }
이 함수가 수신 요청의 본문이 정의되었는지 확인한 후, 구문 분석된 본문은 myCollection
(이)라는 이름의 컬렉션에 새 문서로 저장됩니다. 결과 출력에는 구성된 응답(사용자 지정 메시지 및 insertedId
포함)이 표시됩니다.
사용자 지정 엔드포인트 호출
모든 표준 HTTPS 클라이언트에서 사용자 지정 엔드포인트를 호출할 수 있습니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "name": "Casey" }'
요청 시 HTTP/1.1 이상이 필요합니다.
응답 데이터 형식 선택하기
요청에는 응답 본문에 대한 특정 데이터 형식(JSON 또는 EJSON)을 요청하기 위한 Accept
헤더가 포함될 수 있습니다. 요청에 유효한 Accept
헤더가 포함되어 있지 않으면 응답은 엔드포인트 구성에 지정된 기본 데이터 형식을 사용합니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello/latest" \ -X GET \ -H "Accept: application/ejson" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6"
{ "greeting": "Hello, Leafie!", "date": { "$date": { "$numberLong": "1654589430998" } } }
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello/latest" \ -X GET \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6"
{ "greeting": "Hello, Leafie!", "date": "2022-06-07T08:10:30.998Z" }
요청 인증
엔드포인트가 Application Authentication(애플리케이션 인증)을 사용하도록 구성된 경우, 모든 요청에 유효한 사용자 액세스 토큰 또는 로그인 자격 증명을 포함시켜야 합니다.
액세스 토큰을 이용한 베어러 인증은 일반적으로 처리량이 더 높고 자격 증명 헤더보다 안전합니다. 가능하다면 자격 증명 헤더 대신 액세스 토큰을 사용하세요. 이 토큰을 사용하면 사용자를 재인증하지 않고도 여러 요청을 실행할 수 있습니다. 이외에 CORS를 실행하는 웹 브라우저에서 요청을 보낼 수도 있습니다.
액세스 토큰을 사용하려면 먼저 App Services 인증 제공자를 통해 사용자를 인증하세요. 그런 다음 App Services에서 반환된 액세스 토큰을 가져오고, Bearer(베어러) 토큰 체계를 이용하여 요청의 권한 부여 헤더에 이 토큰을 입력하세요. 액세스 토큰의 획득 및 사용 방법에 대한 자세한 내용은 Bearer Token Authentication(베어러 토큰 인증)을 참조하세요.
curl -X GET \ -H 'Authorization: Bearer <AccessToken>' \ -H 'Content-Type: application/json' \ https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello
또는 요청 헤더에 사용자의 유효한 로그인 자격 증명을 포함할 수 있습니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "email: bob@example" \ -H "password: Pa55w0rd!" \ -d '{ "name": "Bob" }'
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "name": "Alice" }'
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/hello" \ -X POST \ -H "Accept: application/json" \ -H "jwtTokenString: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZXN0LWN1c3RvbS1lbmRwb2ludHMtZWhtenQiLCJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoyMTQ1OTE2ODAwfQ.pIMvnXWrcDvmPzmE33ZPrwkBAFSwy-GxW8sP-qLtYiw" \ -d '{ "name": "Carlos" }'
중요
사용자 대상 클라이언트에서 API 키를 사용하지 마세요
브라우저 또는 다른 사용자용 클라이언트 애플리케이션에서 인증하는 경우 API 키를 사용하여 로그인하지 않도록 합니다. 대신 사용자가 제공한 자격 증명을 사용하는 다른 인증 제공자를 사용합니다. API 키나 기타 민감한 자격 증명을 로컬에 저장하지 마세요.
요청 승인
엔드포인트 구성에 따라 요청에 추가 권한 부여 정보를 포함해야 할 수도 있습니다.
모든 인증 사용자는 엔드포인트를 호출할 수 있는 권한이 있습니다. 인증된 요청은 권한 부여 정보를 포함하지 않아도 됩니다.
인증된 사용자는 엔드포인트의 시크릿 string 을 secret
쿼리 매개변수의 값으로 포함하여 엔드포인트를 호출할 권한이 있음을 증명해야 합니다.
예시
다음 curl
요청 은 시크릿 string "Super5ecr3tPa55w0rd"
과 함께 시크릿 쿼리 매개변수 유효성 검사 를 사용합니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/passwordRequired?secret=Super5ecr3tPa55w0rd" \ -X GET \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -d '{ "data": "VGhpcyBpcyBzb21lIGRhdGEgdGhhdCB3YXMgZW5jb2RlZCBhcyBhIEJhc2U2NCBBU0NJSSBzdHJpbmc=" }'
인증된 사용자는 요청 본문에서 생성된 16진수로 인코딩된 HMAC SHA-256 해시와 엔드포인트의 시크릿 string 이 포함된 Endpoint-Signature
헤더를 포함하여 엔드포인트를 호출할 권한이 있음을 증명해야 합니다.
Endpoint-Signature: sha256=<hex encoded hash>
다음 함수를 사용하여 페이로드 서명을 생성할 수 있습니다.
/** * Generate an HMAC request signature. * @param {string} secret - The secret validation string, e.g. "12345" * @param {object} body - The endpoint request body e.g. { "message": "MESSAGE" } * @returns {string} The HMAC SHA-256 request signature in hex format. */ exports = function signEndpointRequest(secret, body) { const payload = EJSON.stringify(body); return utils.crypto.hmac(payload, secret, "sha256", "hex"); };
예시
다음 curl
요청 에는 시크릿 값 Super5ecr3tPa55w0rd
로 서명된 페이로드 서명 헤더가 포함되어 있습니다.
curl -s "https://data.mongodb-api.com/app/myapp-abcde/endpoint/sendMessage" \ -X POST \ -H "Accept: application/json" \ -H "apiKey: TpqAKQgvhZE4r6AOzpVydJ9a3tB1BLMrgDzLlBLbihKNDzSJWTAHMVbsMoIOpnM6" \ -H "Endpoint-Signature: sha256=d4f0537db4e230d7a6028a6f7c3bb1b57c9d16f39176d78697e559ac333e0b36" \ -d '{ "message": "Hello!" }'