서비스 Webhooks 구성 [사용 중단됨]
중요
타사 서비스 & 푸시 알림 사용 중단
App Services의 타사 서비스 및 푸시 알림은 함수에서 외부 종속성을 사용하는 HTTP 엔드포인트를 만들기 위해 더 이상 사용되지 않습니다.
웹훅은 동작에 대한 변경 없이 HTTPS 엔드포인트로 이름이 변경되었습니다. 기존 웹훅을 마이그레이션해야 합니다.
기존 서비스는,9월까지 30 계속2025 작동합니다.
타사 서비스 및 푸시 알림은 이제 더 이상 사용되지 않으므로 App Services UI에서 기본적으로 제거되었습니다. 기존 타사 서비스 또는 푸시 알림을 관리해야 하는 경우 다음을 수행하여 구성을 UI에 다시 추가할 수 있습니다.
왼쪽 탐색의 Manage 섹션에서 App Settings를 클릭합니다.
Temporarily Re-Enable 3rd Party Services 옆의 토글 스위치를 활성화한 다음 변경 사항을 저장합니다.
개요
일부 외부 서비스에서는 외부 클라이언트가 HTTP를 통해 호출할 수 있는 수신 webhooks를 만들 수 있습니다. App Services UI 또는 App Services CLI를 사용하여 이러한 서비스에 대한 webhooks를 만들 수 있습니다. 사용하려는 메서드에 해당하는 탭을 아래에서 선택합니다.
절차
새 Webhook 설정
수신 웹훅의 범위는 개별 서비스 로 할당됩니다. App Services UI의 연결된 서비스 페이지에서 웹훅을 만들고 관리할 수 있습니다.
수신 웹훅을 만들려면 다음과 같이 합니다:
왼쪽 탐색 패널에서 Services 을 클릭합니다.
수신 웹훅을 추가할 서비스를 클릭합니다.
서비스에 대한 Incoming Webhooks 탭을 선택합니다.
Add Incoming Webhook를 클릭합니다. App Services는 새 웹훅에 대한 Settings 화면으로 리디렉션합니다.
사용자 인증 구성
웹훅을 비롯한 Atlas Functions는 항상 특정 애플리케이션 사용자의 컨텍스트에서 또는 규칙을 우회하는 시스템 사용자로서 실행됩니다. 웹훅의 실행 사용자를 구성하려면 App Services에서 웹훅에 사용해야 하는 인증 유형을 지정합니다.
인증 유형 | 설명 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
애플리케이션 인증 | 이 유형의 인증은 들어오는 각 요청에 의해 지정된 기존 애플리케이션 사용자의 컨텍스트에서 실행되도록 웹훅을 구성합니다. 수신 요청에는 요청 본문 또는 요청 헤더에 사용자의 인증 제공자 자격 증명이 포함되어야 합니다. 다음 예시에서는 지원되는 각 인증 제공자의 필드 이름과 값을 보여줍니다.
중요헤더와 본문 필드를 모두 사용하지 않기요청에 요청 헤더와 요청 본문 모두에 자격 증명이 포함된 경우 App Services는 오류를 발생시키고 함수를 실행하지 않습니다. 참고애플리케이션 사용자애플리케이션 인증을 사용하여 각 요청에 대해 추가 사용자 관련 작업을 수행하는 웹훅을 구성할 수 있습니다.
| ||||||||||
시스템 | 이 인증 유형은 웹훅이 시스템 사용자로 실행되도록 구성하며, 이 사용자는 MongoDB CRUD 및 집계 API에 대한 전체 액세스 권한이 있고 규칙, 역할 또는 권한의 영향을 받지 않습니다. | ||||||||||
사용자 ID | 이 유형의 인증은 항상 특정 애플리케이션 사용자로 실행되도록 웹훅을 구성합니다. | ||||||||||
스크립트 | 이 유형의 인증은 정의한 사용자 지정 함수의 결과에 따라 특정 애플리케이션 사용자로 실행되도록 웹훅을 구성합니다. 함수는 특정 사용자의 id 문자열을 반환하거나 { "runAsSystem": true } 를 반환하여 시스템 사용자를 지정할 수 있습니다. |
Webhook의 HTTP 메서드 선택
수신 요청이 특정 HTTP 메서드 를 사용하도록 요구할 수 있습니다. 또는 모든 HTTP 메서드를 허용하고 웹훅 함수에서 httpMethod
컨텍스트 의 속성 을 검사하여 각 메서드를 개별적으로 처리하다 할 수 있습니다. 다음 예시 함수에서와 같이 객체 를 요청 합니다.
exports = function(payload, response) { switch(context.request.httpMethod) { case "GET": { /* Handle GET requests */ } case "POST": { /* Handle POST requests */ } case "PUT": { /* Handle PUT requests */ } case "DELETE": { /* Handle DELETE requests */ } case "PATCH": { /* Handle PATCH requests */ } default: {} } }
요청 유효성 검사 메서드 지정
웹훅 요청이 신뢰할 수 있는 출처에서 전송되었는지 확인하기 위해 일부 외부 서비스에서는 들어오는 요청에 몇 가지 규정된 방식 중 하나로 비밀 문자열을 통합하도록 요구합니다. HTTP 서비스와 같은 다른 서비스에서는 선택적으로 요청 유효성 검사(request validation)를 요구할 수 있습니다.
웹훅에 요청 유효성 검사가 필요한 경우:
요청 유효성 검사 프로세스에서 사용할 Secret 문자열을 입력합니다.
Webhook 함수 작성
웹훅을 설정한 후에는 웹훅을 호출할 때 실행되는 함수를 작성하는 것만 남았습니다. 앱 서비스는 웹훅 함수의 인수로 두 개의 객체를 자동으로 전달합니다:
Argument | 설명 |
---|---|
payload | 수신 요청 페이로드의 EJSON 표현입니다. 페이로드 문서의 내용은 웹훅을 발생시킨 서비스 및 이벤트에 따라 달라집니다. 특정 서비스의 payload 객체에 대한 설명은 해당 서비스의 참조 페이지를 확인하세요. |
response | 웹훅을 호출한 클라이언트에 대한 응답을 구성하는 HTTP 응답 객체입니다. 객체에는 응답의 헤더, 본문, 상태 코드를 설정할 수 있는 방법이 있습니다. 이러한 방법 중 하나를 호출하면 기본 응답 동작이 재정의됩니다. |
다음 웹훅 기능을 자체 웹훅의 기반으로 사용할 수 있습니다.
exports = async function (payload, response) { // Convert the webhook body from BSON to an EJSON object const body = EJSON.parse(payload.body.text()); // Execute application logic, such as working with MongoDB if (body.someField) { const mdb = context.services.get("mongodb-atlas"); const requests = mdb.db("demo").collection("requests"); const { insertedId } = await requests.insertOne({ someField: body.someField, }); // Respond with an affirmative result response.setStatusCode(200); response.setBody(`Successfully saved "someField" with _id: ${insertedId}.`); } else { // Respond with a malformed request error response.setStatusCode(400); response.setBody(`Could not find "someField" in the webhook request body.`); } // This return value does nothing because we already modified the response object. // If you do not modify the response object and you enable *Respond with Result*, // App Services will include this return value as the response body. return { msg: "finished!" }; };
참고
함수 편집기에서 웹훅 함수 응답을 디버그하려면 함수를 실행할 때 HTTP 응답 객체를 수동으로 제공해야 합니다.
exports( { body: "This document is the webhook payload" }, new HTTPResponse() )
중요
Atlas CLI 버전 확인
이 절차에서는 Realm CLI [사용 중단됨]의 2 버전을 사용합니다. realm-cli
이전 버전이 있는 경우 최신 버전으로 업그레이드 하거나 --help
플래그를 사용하여 사용 중인 버전에서 지원되는 명령 목록을 확인하세요.
Webhook 구성 파일 추가
config.json
라는 이름의 수신 웹훅 구성 파일 을 새 웹훅 디렉토리 에 추가합니다.
구성 파일 의 형식은 다음과 같아야 합니다.
{ "name": "<Webhook Name>", "can_evaluate": { <JSON Expression> }, "run_as_authed_user": <Boolean>, "run_as_user_id": "<App Services User ID>", "run_as_user_id_script_source": "<Function Source Code>", "respond_result": <Boolean>, "fetch_custom_user_data": <Boolean>, "create_user_on_auth": <Boolean>, "options": { "httpMethod": "<HTTP Method>", "validationMethod": "<Webhook Validation Method>", "secret": "<Webhook Secret>" } }
사용자 인증 구성
App Services 가 웹훅에 사용해야 하는 인증 유형을 지정합니다. App Services 는 다음과 같은 웹훅 인증 방법을 지원합니다.
인증 방법 | 설명 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
애플리케이션 인증 | 이 유형의 인증은 들어오는 각 요청에 의해 지정된 기존 애플리케이션 사용자의 컨텍스트에서 실행되도록 웹훅을 구성합니다. 수신 요청에는 요청 본문 또는 요청 헤더에 사용자의 인증 제공자 자격 증명이 포함되어야 합니다. 애플리케이션 인증 을 사용하도록 웹훅을 구성하려면
예시다음 예제에서는 수신 요청에 지원되는 각 인증 제공자 에 대해 본문 또는 헤더 필드로 포함해야 하는 필드 이름과 값을 보여 줍니다.
중요헤더와 본문 필드를 모두 사용하지 않기요청에 요청 헤더와 요청 본문 모두에 자격 증명이 포함된 경우 App Services는 오류를 발생시키고 함수를 실행하지 않습니다. | |||||||||||||||
시스템 | 이 인증 유형은 웹훅이 시스템 사용자로 실행되도록 구성하며, 이 사용자는 MongoDB CRUD 및 집계 API에 대한 전체 액세스 권한이 있고 규칙, 역할 또는 권한의 영향을 받지 않습니다. 시스템 사용자 로 실행 웹훅을 구성하려면 다른 인증 필드를 설정하다 하지 마세요.
| |||||||||||||||
사용자 ID | 이 유형의 인증은 항상 특정 애플리케이션 사용자로 실행되도록 웹훅을 구성합니다. 웹훅이 항상 특정 사용자로 실행 구성하려면
| |||||||||||||||
스크립트 | 이 유형의 인증 은 정의한 사용자 지정 함수 의 결과에 따라 결정되는 특정 애플리케이션 사용자로 실행 웹훅을 구성합니다. 함수는 특정 사용자의 함수에 의해 결정된 사용자로 실행 웹훅을 구성하려면
|
Webhook의 HTTP 메서드 지정
수신 요청이 특정 HTTP 메서드 를 사용하도록 요구할 수 있습니다. 또는 모든 HTTP 메서드를 허용하고 웹훅 함수에서 httpMethod
컨텍스트 의 속성 을 검사하여 각 메서드를 개별적으로 처리하다 할 수 있습니다. 다음 예시 함수에서와 같이 객체 를 요청 합니다.
exports = function(payload, response) { switch(context.request.httpMethod) { case "GET": { /* Handle GET requests */ } case "POST": { /* Handle POST requests */ } case "PUT": { /* Handle PUT requests */ } case "DELETE": { /* Handle DELETE requests */ } case "PATCH": { /* Handle PATCH requests */ } default: {} } }
웹훅 메서드를 설정하다 하려면 options.httpMethod
필드 를 모두 대문자 또는 "ANY"
를 사용하여 메서드 이름으로 설정합니다.
{ "options": { "httpMethod": "POST" } }
Webhook 응답 구성
구성 가능한 HTTP 응답 을 보낼 수 있습니다. 웹훅을 호출하는 외부 서비스에 연결합니다. 들어오는 요청에 대한 응답을 보내도록 웹훅을 구성하려면 respond_result
를 true
로 설정하다 합니다.
Respond With Result을(를) 활성화하면 웹훅이 수신 요청에 대해 웹훅 함수 반환 값을 body
필드로 포함하는 기본 HTTP 200 응답으로 응답합니다. App Services가 자동으로 두 번째 인수로 전달하는 response
객체를 사용하여 웹훅 함수 내에서 사용자 지정 HTTP 응답을 구성할 수 있습니다.
권한 부여 표현식 지정하기
Can Evaluate 표현식 을 정의하여 각 요청 의 내용을 기반으로 요청에 동적으로 권한을 부여할 수 있습니다. App Services 는 웹훅이 수신하는 모든 수신 요청 에 대한 표현식 을 평가합니다. 표현식 은 확장 %%request
을 포함한 표준 표현식 변수 를 확장할 수 있습니다.
권한 부여 표현식 을 정의하려면 can_evaluate
필드 값을 표현식 으로 설정하다 합니다. 표현식 을 지정하지 않으면 App Services 는 인증된 모든 수신 요청에 자동으로 권한을 부여합니다.
예시
다음 표현식 은 발신자의 IP 주소 가 주소 목록에 포함되지 않은 경우에만 수신 요청을 승인합니다.
{ "%%request.remoteIPAddress": { "$nin": [ "248.88.57.58", "19.241.23.116", "147.64.232.1" ] } }
요청 유효성 검사 메서드 지정
웹훅 요청이 신뢰할 수 있는 출처에서 전송되었는지 확인하기 위해 일부 외부 서비스에서는 들어오는 요청에 몇 가지 규정된 방식 중 하나로 비밀 문자열을 통합하도록 요구합니다. HTTP 서비스와 같은 다른 서비스에서는 선택적으로 요청 유효성 검사(request validation)를 요구할 수 있습니다.
웹훅 구성의 options
문서 에서 웹훅의 요청 권한 부여 방법을 구성할 수 있습니다. App Services 는 다음과 같은 요청 유효성 검사 메서드를 지원합니다.
메서드 | 설명 | ||||
---|---|---|---|---|---|
추가 권한 부여 없음 | 수신 웹훅 요청에는 추가 권한 부여 가 필요하지 않습니다.
| ||||
페이로드 서명 확인 | 수신 웹훅 요청에는 요청 본문의 해시 된 서명과 시크릿 값이 포함되어야 합니다. 자세한 내용은 페이로드 서명 확인을 참조하세요.
| ||||
비밀 필요 | 수신 웹훅 요청에는 string
|
Webhook 함수 소스 코드 추가
새 웹훅 디렉토리 에 source.js
라는 파일 을 추가합니다. 파일 에는 웹훅이 호출될 때 실행되는 유효한 함수가 포함되어 있어야 합니다.
앱 서비스는 웹훅 함수의 인수로 두 개의 객체를 자동으로 전달합니다:
Argument | 설명 |
---|---|
payload | 수신 요청 페이로드의 EJSON 표현입니다. 페이로드 문서의 내용은 웹훅을 발생시킨 서비스 및 이벤트에 따라 달라집니다. 특정 서비스의 payload 객체에 대한 설명은 해당 서비스의 참조 페이지를 확인하세요. |
response | 웹훅을 호출한 클라이언트에 대한 응답을 구성하는 HTTP 응답 객체입니다. 객체에는 응답의 헤더, 본문, 상태 코드를 설정할 수 있는 방법이 있습니다. 이러한 방법 중 하나를 호출하면 기본 응답 동작이 재정의됩니다. |
다음 웹훅 기능을 자체 웹훅의 기반으로 사용할 수 있습니다.
exports = async function (payload, response) { // Convert the webhook body from BSON to an EJSON object const body = EJSON.parse(payload.body.text()); // Execute application logic, such as working with MongoDB if (body.someField) { const mdb = context.services.get("mongodb-atlas"); const requests = mdb.db("demo").collection("requests"); const { insertedId } = await requests.insertOne({ someField: body.someField, }); // Respond with an affirmative result response.setStatusCode(200); response.setBody(`Successfully saved "someField" with _id: ${insertedId}.`); } else { // Respond with a malformed request error response.setStatusCode(400); response.setBody(`Could not find "someField" in the webhook request body.`); } // This return value does nothing because we already modified the response object. // If you do not modify the response object and you enable *Respond with Result*, // App Services will include this return value as the response body. return { msg: "finished!" }; };