문서 메뉴

문서 홈Atlas App Services

사용자 지정 HTTPS 엔드포인트

이 페이지의 내용

  • 엔드포인트의 구조
  • 기본 URL
  • 엔드포인트 경로
  • HTTP 메서드
  • 사용자 지정 HTTPS Endpoints 만들기
  • 인증
  • 권한 부여
  • 엔드포인트 함수 쓰기
  • 액세스 요청 데이터
  • HTTPS 응답 반환
  • 예제
  • 사용자 지정 엔드포인트 호출
  • 응답 데이터 형식 선택하기
  • 요청 인증
  • 요청 승인

사용자 지정 HTTPS endpoints를 정의해 외부 서비스와 통합되는 앱별 API 경로나 웹훅을 생성할 수 있습니다. 사용자 지정 엔드포인트는 특정 URL과 HTTP 메서드를 위한 수신 요청을 처리할 때 쓰는 서버리스 함수를 사용합니다.

엔드포인트는 암호화된 표준 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은 앱 ID를 사용하여 고유한 방식으로 앱을 가리킵니다.

전역에 배포된 앱은 다음 형식을 사용합니다.

엔드포인트 기본 URL(글로벌 앱):
https://data.mongodb-api.com/app/<App ID>/endpoint

로컬로 배포된 앱의 엔드포인트에서는 해당 앱의 배포 리전에 특정된 기본 URL을 사용합니다(예: us-east-1).

엔드포인트 기본 URL(로컬 앱)
https://<Region>.aws.data.mongodb-api.com/app/<App ID>/endpoint

각 HTTPS endpoints에는 엔드포인트의 이름 역할을 하는 경로가 있습니다. 엔드포인트의 경로는 임의로 정해지며 앱에 따라 다릅니다. 하지만 엔드포인트 URL 경로에 표시되기 때문에 경로가 실행하는 조치를 나타내야 합니다.

경로 이름은 슬래시(/)로 시작해야 하며 중첩된 경로를 나타내는 추가 슬래시를 포함할 수 있습니다.

엔드포인트 경로
/my/nested/route

앱의 기본 URL에 경로를 추가하고 HTTP 요청을 보내 엔드포인트를 호출합니다.

엔드포인트 URL
https://data.mongodb-api.com/app/<App ID>/endpoint/my/nested/route

앱의 각 엔드포인트는 하나 이상의 HTTP 메서드 를 처리합니다. 지정된 경로에 대해 예를 들어,POST 새 리소스를 만들기 위한 요청과 GET 기존 리소스를 나열하기 위한 요청을 수락하는 단일 경로가 있을 수 있습니다.

경로는 동일하지만 서로 다른 요청 메서드를 처리하는 여러 개의 사용자 지정 엔드포인트를 정의할 수 있습니다. 또는, 모든 메서드를 처리하는 경로를 위한 단일 엔드포인트를 정의할 수 있습니다.

사용자 지정 엔드포인트는 다음과 같은 표준 HTTP 메서드를 지원합니다.

App Services UI에서, 혹은 App Services CLI로 구성 파일을 배포하여 원하는 앱의 데이터 API를 구성할 수 있습니다.

사용자 지정 엔드포인트는 특정 사용자의 컨텍스트에서 실행됩니다. 이 때문에 앱에서는 각 요청에 대해 규칙을 시행하고 문서 스키마의 유효성을 검사할 수 있습니다.

기본적으로 엔드포인트는 API 키 또는 JWT와 같은 애플리케이션 사용자 중 한 명의 자격 증명을 각 요청에 포함하도록 요구하는 애플리케이션 인증을 사용합니다. 또한 애플리케이션의 요구 사항에 맞게 다른 사용자 지정 인증 체계를 구성할 수도 있습니다.

요청을 인증하는 방법의 예는 데이터 API 요청 인증을 참조하세요.

UI에서 생성하는 새 엔드포인트는 기본적으로 시스템 인증을 사용합니다.

엔드포인트는 인증된 사용자에게 요청에 추가 권한 부여 정보를 제공하도록 요구할 수 있습니다. 엔드포인트 기능을 구성하여 각 사용자 정의 엔드포인트에 대한 권한 부여 체계를 정의합니다.

엔드포인트는 기본적으로 요청이 권한 부여되었음을 증명하기 위해 시크릿 문자열을 사용하는 내장 권한 부여 체계 집합을 지원합니다. 내장 체계와 함께 사용하거나 내장 체계 대신 사용할 수 있는 사용자 지정 권한 부여 체계를 정의할 수도 있습니다.

특정 함수에 대한 권한 부여 방법을 알아보려면 함수 정의를 참조하세요.

엔드포인트는 다음과 같은 내장 권한 부여 체계를 지원합니다.

사용자 지정 권한 부여 표현식을 정의하여 인증된 수신 요청을 실행할 수 있는지 여부를 결정할 수 있습니다. 표현식은 각 요청에 대해 평가되며 요청을 허용하려면 true로 평가되어야 합니다. 표현식이 false로 평가되면 요청이 승인되지 않고 오류와 함께 실패합니다. 권한 부여에 실패한 요청은 앱 청구 사용량에 포함되지 않습니다.

권한 부여 표현식은 %%user 등의 변수를 사용하여 호출 중인 사용자의 데이터를 기준으로 권한을 부여하거나, %%request 등의 변수를 사용하여 각 수신 요청의 세부 사항을 기준으로 결정을 내릴 수 있습니다.

사용자 지정 권한 부여 체계를 정의하려면 엔드포인트 함수 구성에서 표현식을 지정합니다.

http_endpoints/config.json
[
{
...,
"can_evaluate": {
"%%request.requestHeaders.x-secret-key": "my-secret"
}
}
]

모든 사용자 지정 엔드포인트는 엔드포인트가 수신 요청을 받을 때마다 실행되는 함수와 연결되어 있습니다. 이 함수에서는 npm에서 라이브러리를 가져오고, 연결된 MongoDB Atlas cluster에 연결하고, 다른 서버리스 함수를 호출할 수 있습니다.

App Services UI에서 엔드포인트를 생성 할 때 새 함수를 정의하려면 Function 섹션으로 이동하여 드롭다운에서 + New Function 를 선택합니다.

워크플로에 따라 엔드포인트 핸들러 함수를 정의하고 편집할 수도 있습니다.

엔드포인트 함수는 항상 다음과 같은 2개 인수를 받습니다.

  • 수신 요청 헤더, 쿼리 매개변수 및 본문 데이터에 액세스할 수 있는 요청 객체입니다.

  • 호출자에게 다시 전송되는 HTTPS 응답을 구성하는 데 사용하는 응답 객체입니다.

샘플 함수와 요청 및 응답 예시는 예시를 참조하세요 .

사용자 지정 엔드포인트 Request 객체는 해당 엔드포인트를 호출한 HTTP 요청을 나타냅니다. 사용자는 수신 요청의 헤더, 쿼리 매개변수 및 본문 데이터에 액세스할 수 있습니다.

엔드포인트 요청 객체
{
"headers": { "<Header>": ["<Header Value>"] },
"query": { "<Query Parameter>": "<Parameter Value>" },
"body": <BSON.Binary>
}
필드
설명
query

각 필드가 URL 쿼리 매개변수를 해당 값에 매핑하는 객체입니다. 쿼리 문자열에서 키가 여러 번 사용되는 경우 이 객체에는 처음 나타나는 항목만 표시됩니다. 전체 쿼리 문자열로 작업하려면 context.request.rawQueryString을 사용합니다.

예제

다음 query 객체는 쿼리 문자열 ?regions=na,eu&currency=USD를 나타냅니다.

{
"regions": "na&eu",
"currency": "USD"
}
headers

각 필드가 요청 헤더 이름을 하나 이상의 값 배열에 매핑하는 객체입니다.

예제

{
"Content-Type": ["application/json"],
"Accept": ["application/json"],
"X-CustomHeader": ["some-value", "some-other-value"]
}
body

요청 본문을 포함하는 BSON.Binary 객체입니다. 요청에 본문이 포함되지 않은 경우 이 값은 undefined입니다.

요청 본문의 데이터에 액세스하려면 바이너리를 직렬화해야 합니다.

// Convert the request body to a JSON string
const serialized = request.body.text();
// Parse the string into a usable object
const body = JSON.parse(serialized);

사용자 지정 엔드포인트 Response 객체를 사용하면 호출자에게 다시 전송되는 HTTPS 응답을 구성할 수 있습니다. 상태 코드를 설정하고, 헤더를 사용자 지정하고, 응답 본문에 데이터를 포함할 수 있습니다.

메서드
설명
setStatusCode(code)
- code: number

HTTP 응답 상태 코드를 설정합니다.

예제

response.setStatusCode(201);
setBody(body)
- body: string | BSON.Binary

HTTP 응답 본문을 설정합니다.

body가 문자열인 경우, 엔드포인트는 문자열을 자동으로 BSON.Binary로 인코딩합니다.

예제

response.setBody(
"{'message': 'Hello, World!'}"
);
setHeader(name, value)
- name: string
- value: string

HTTP 응답 헤더 설정 에 의해 지정된 name 값을 인수에 전달된 값으로 value 변경합니다. 이렇게 하면 해당 헤더에 이미 할당되었을 수 있는 다른 모든 값이 재정의됩니다.

예제

response.setHeader(
"Content-Type",
"application/json"
);
addHeader(name, value)
- name: string
- value: string

HTTP 응답 헤더 설정 에 의해 지정된 name 값을 인수에 전달된 값으로 value 변경합니다. 와 setHeader 달리 이는 헤더에 이미 할당된 다른 값을 재정의하지 않습니다.

예제

response.addHeader(
"Cache-Control",
"max-age=600"
);
response.addHeader(
"Cache-Control",
"min-fresh=60"
)

수신 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 헤더가 포함되어 있지 않으면 응답은 엔드포인트 구성에 지정된 기본 데이터 형식을 사용합니다.

엔드포인트가 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

또는 요청 헤더에 사용자의 유효한 로그인 자격 증명을 포함할 수 있습니다.

중요

사용자 대상 클라이언트에서 API 키를 사용하지 마세요

브라우저 또는 다른 사용자용 클라이언트 애플리케이션에서 인증하는 경우 API 키를 사용하여 로그인하지 않도록 합니다. 대신 사용자가 제공한 자격 증명을 사용하는 다른 인증 제공자를 사용합니다. API 키나 기타 민감한 자격 증명을 로컬에 저장하지 마세요.

엔드포인트 구성 에 따라 요청에 추가 권한 부여 정보를 포함해야 할 수도 있습니다.

← 데이터 API 엔드포인트