View a markdown version of this page

동적 흐름 설정 - AWS 최종 사용자 메시징 소셜

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

동적 흐름 설정

동적 흐름은 런타임 시 자체 HTTPS 엔드포인트를 호출하여 화면 콘텐츠를 가져오고 탐색을 결정합니다. 정적 흐름은 흐름 JSON의 모든 화면을 정의합니다. 대신 동적 흐름은 사용자가 화면 사이를 탐색할 때마다 data_exchange 작업을 사용하여 엔드포인트에서 데이터를 요청합니다. 이를 통해 사용자에게 미결 주문 표시, 입력 서버 측 검증 또는 백엔드 결정에 따른 분기와 같은 개인화된 데이터 기반 경험을 제공할 수 있습니다.

사용자가 동적 흐름과 상호 작용하면 Meta는 암호화된 요청으로 엔드포인트를 직접 호출합니다. 엔드포인트는 요청을 복호화하고, 비즈니스 로직을 실행하고, 응답을 암호화하고, Meta에 반환합니다. 암호화된 요청 및 응답은 Meta와 엔드포인트 간에 직접 전달되므로 AWS End User Messaging Social은 이러한 교환의 해독된 콘텐츠에 액세스할 수 없습니다. AWS End User Messaging Social은 흐름 생성 및 업데이트, 암호화 퍼블릭 키 업로드, 흐름 상태 웹후크 전송과 같은 컨트롤 플레인을 관리합니다.

동적 흐름을 설정하려면 다음 단계를 완료합니다.

  1. HTTPS 엔드포인트를 배포합니다.

  2. 암호화를 위한 비즈니스 퍼블릭 키를 업로드합니다.

  3. 엔드포인트 URI를 사용하여 흐름을 생성합니다.

  4. 요청 확인을 위해 Meta 앱을 연결합니다.

  5. 흐름을 게시합니다.

1단계: HTTPS 엔드포인트 배포

엔드포인트는 다음 요구 사항을 충족해야 합니다.

  • 유효한 TLS 인증서가 있는 공개적으로 액세스 가능한 HTTPS URL입니다.

  • 10초 이내에 응답합니다. Meta는 하드 제한 시간을 적용하고 p90 지연 시간을 모니터링합니다. 지연 시간 임계값 또는 반환 오류를 지속적으로 초과하는 엔드포인트는 제한되거나 차단될 수 있습니다.

  • 암호화된 JSON 페이로드를 포함하는 POST 요청을 수락합니다.

  • 암호화된 응답을 text/plain (base64 인코딩)으로 반환합니다.

퍼블릭 HTTPS URL을 제공하는 모든 컴퓨팅 옵션을 사용할 수 있습니다. 일반적인 접근 방식은 다음과 같습니다.

  • AWS Lambda 함수 URL - HTTPS 엔드포인트가 내장된 단일 함수입니다. Meta는를 사용하지 NONE 않으므로 권한 부여 유형을 로 설정합니다. 에서 구성한 비즈니스 암호화 키 페어를 사용하여 요청을 인증합니다2단계: 비즈니스 퍼블릭 키 업로드.

  • Lambda를 사용하는 Amazon API Gateway - 소스 IPs, AWS WAF 규칙 및 제한을 제한하는 리소스 정책과 같은 추가 제어를 제공합니다.

  • Lambda 대상을 사용한 Elastic Load Balancing - 기존 로드 밸런싱된 인프라와 결합하려는 경우에 유용합니다.

  • 기타 HTTPS 서버(컨테이너, Amazon EC2 인스턴스 또는 외부 서비스).

엔드포인트는 다음 요청 유형을 처리하는 Meta의 데이터 교환 계약을 구현해야 합니다.

  • 상태 확인 - Meta는 엔드포인트를 사용할 수 있는지 확인하기 위해 주기적 ping 요청을 보냅니다. 를 사용하여 응답합니다{"data": {"status": "active"}}.

  • INIT - 사용자가 흐름을 열 때 전송됩니다. 초기 화면과 해당 데이터를 반환합니다.

  • data_exchange - 사용자가 화면을 제출할 때마다 전송됩니다. 다음 화면과 해당 데이터를 반환합니다.

  • 뒤로 - 사용자가 이전 화면으로 돌아갈 때 전송됩니다.

여러 언어로 된 암호화 및 복호화 코드 샘플을 포함한 전체 엔드포인트 구현 가이드는 Meta for Developers 웹 사이트의 흐름 엔드포인트 구현을 참조하세요.

2단계: 비즈니스 퍼블릭 키 업로드

Meta는 RSA(Rivest-Shamir-Adleman) 퍼블릭 키를 사용하여 모든 데이터 교환 요청을 end-to-end 암호화합니다. 엔드포인트는 해당 프라이빗 키를 사용하여 요청을 복호화합니다. AWS End User Messaging Social은 사용자를 대신하여 퍼블릭 키를 Meta에 업로드하지만 프라이빗 키에 액세스하거나 저장하지 않습니다.

PutWhatsAppBusinessPublicKey API를 사용하여 전화번호의 퍼블릭 키를 업로드합니다. 다음 중 정확히 하나를 제공해야 합니다.

  • PEM 인코딩 RSA 퍼블릭 키 - 키를 직접 제공합니다. 엔드포인트에는 복호화를 위한 해당 프라이빗 키가 있습니다.

  • AWS Key Management Service 키 ARN - 비대칭 RSA-2048 KMS 키의 ARN을 제공합니다. AWS End User Messaging Social은를 사용하여 퍼블릭 절반만 읽고 Meta에 kms:GetPublicKey 업로드합니다. 프라이빗 키는를 벗어나지 않습니다 AWS KMS. 엔드포인트는 kms:Decrypt를 사용하여 런타임에 요청을 복호화합니다.

둘 다 제공하거나 둘 다 제공하지 않으면가 반환됩니다InvalidParametersException.

PEM 모드

RSA 키 페어를 생성하고 퍼블릭 키를 업로드합니다.

# Generate a key pair openssl genrsa -out private.pem 2048 openssl rsa -in private.pem -pubout -out public.pem # Upload the public key aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --business-public-key "$(cat public.pem)"

프라이빗 키를 안전하게 저장하고 복호화를 위해 엔드포인트에서 사용할 수 있도록 합니다.

AWS KMS mode

비대칭 RSA KMS 키를 생성하고 ARN을 업로드합니다.

# Create the KMS key KMS_KEY_ARN=$(aws kms create-key \ --key-spec RSA_2048 \ --key-usage ENCRYPT_DECRYPT \ --description "WhatsApp Dynamic Flow encryption key" \ --query KeyMetadata.Arn --output text) # Upload the KMS key ARN aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --kms-key-arn $KMS_KEY_ARN

KMS 키 정책은 다음 권한을 부여해야 합니다.

  • kms:GetPublicKey를 social-messaging.amazonaws.com 서비스 보안 주체에게 보냅니다. 이렇게 하면 AWS End User Messaging Social이 퍼블릭 키를 읽고 Meta에 업로드할 수 있습니다.

  • kms:Decrypt를 엔드포인트의 실행 역할로 바꿉니다. 이렇게 하면 엔드포인트가 수신 데이터 교환 요청을 복호화할 수 있습니다. AWS End User Messaging Socialkms:Decrypt은이 키를 호출하지 않습니다.

키 확인

GetWhatsAppBusinessPublicKey API를 사용하여 저장된 키를 확인하고 Meta의 서명 상태를 확인합니다.

aws social-messaging get-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID}

응답에는 저장된 PEM 및 Meta의 서명 상태(VALID 또는 MISMATCH)가 포함됩니다. MISMATCH 상태는 저장된 키가 예상 Meta와 일치하지 않음을 나타냅니다. 이 상태가 표시되면 새 키를 업로드합니다.

3단계: 엔드포인트를 사용하여 흐름 생성

동적 흐름을 생성할 때 HTTPS 엔드포인트 URL과 함께 --endpoint-uri 파라미터를 제공합니다. 또한 흐름 JSON은 흐름 세션 중에 엔드포인트를 호출하도록 Meta에 지시data_api_version하는를 선언해야 합니다.

aws social-messaging create-whatsapp-flow \ --id {WABA_ID} \ --flow-name "my_dynamic_flow" \ --categories '["OTHER"]' \ --flow-json fileb://flow.json \ --endpoint-uri "https://your-endpoint.example.com/flow"

를 사용하여 기존 초안 흐름에서 엔드포인트를 추가하거나 변경할 수도 있습니다UpdateWhatsAppFlow.

aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID} \ --endpoint-uri "https://your-endpoint.example.com/flow"
참고

동적 흐름을 게시하면 Meta는 엔드포인트에 대해 동기식 상태 확인을 수행합니다. 엔드포인트가 응답하지 않거나 오류를 반환하면 131000 ("엔드포인트를 사용할 수 있고 상태 확인을 구현했는지 확인")과 같은 메타 오류와 함께 게시 작업이 실패합니다. 비즈니스 퍼블릭 키가 누락되거나 유효하지 않으면이 오류가 발생할 수도 있습니다. 게시하기 전에 엔드포인트가 배포되어 ping 요청에 응답하고 유효한 비즈니스 퍼블릭 키를 업로드했는지 확인합니다( 참조2단계: 비즈니스 퍼블릭 키 업로드).

흐름에 대해 구성된 엔드포인트 및 데이터 API 버전을 확인하려면를 사용합니다GetWhatsAppFlow.

aws social-messaging get-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID}

응답에는 메타가 보유endpointUri하는 , 흐름 JSON에 dataApiVersion 선언된 및 현재 연결된가 포함됩니다application.

4단계: 요청 확인을 위해 Meta 앱 연결

기본적으로 AWS 최종 사용자 메시징 소셜을 통한 흐름 생성 시 서비스의 메타 앱과 연결됩니다. 엔드포인트에 대한 데이터 교환 요청이 Meta에서 시작되었는지 확인하려면 자체 Meta 앱을 흐름에 연결합니다. 자체 앱을 연결하지 않으면 요청 오리진 확인이 불가능합니다. 앱을 연결하면 Meta가 각 요청에 포함하는 X-Hub-Signature-256 HMAC 헤더를 확인하는 데 필요한 앱 보안 암호에 액세스할 수 있습니다.

aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID} \ --meta-app-id "{YOUR_META_APP_ID}"

메타 앱은 WhatsApp Business Account(WABA)를 소유한 동일한 기업이 소유해야 합니다.

중요

자체 Meta 앱을 연결하는 것은 단방향 작업입니다. 앱을 연결한 후에는 서비스의 앱을 다시 연결할 수 없습니다. 흐름 기능에는 영향을 주지 않습니다. 새 흐름만 앱 연결을 재설정합니다.

동일한 호출 또는 별도의 호출--meta-app-id에서 --endpoint-uri 및를 설정할 수 있습니다. 두 필드는 독립적입니다.

앱을 연결한 후를 호출GetWhatsAppFlow하고 응답의 application 필드를 확인하여 구성을 확인합니다. 는 사용자가 제공한 메타 앱 ID와 일치해야 application.id 합니다.

엔드포인트 보안

Meta는 엔드포인트를 직접 호출하므로 다음 보안 사례를 고려하세요.

  • 요청 서명 확인 - 자체 메타 앱을 연결한 경우(4단계) 앱 보안 암호를 사용하여 각 요청에서 X-Hub-Signature-256 HMAC-SHA256 헤더를 확인합니다. 이렇게 하면 요청이 Meta에서 시작되었음을 확인합니다. 확인에 실패하면 HTTP 상태 432를 반환합니다.

  • 흐름 토큰 검증 - 사용자에게 흐름을 전송할 때 각 흐름 세션에 flow_token 대해 예측할 수 없는 고유한를 생성합니다. 엔드포인트는 암호화된 페이로드 내에서 토큰을 수신하며 활성 세션에 대해 토큰을 검증해야 합니다. 알 수 없거나 만료되었거나 이미 완료된 토큰이 있는 요청을 거부합니다. 이렇게 하면 승인되지 않거나 재생된 요청이 비즈니스 로직에 도달하지 않습니다.

  • 토큰 검증 없이 상태 확인 처리 - Meta는 엔드포인트 상태를 모니터링하기 위해 주기적 ping 요청을 보냅니다. 이러한 요청에는가 포함되지 않습니다flow_token. 상태 확인을 거부하면 엔드포인트의 가용성 점수가 저하되므로 토큰 검증 없이 상태 확인에 응답합니다.

  • 적절한 상태 코드 반환 - 엔드포인트가 요청을 복호화할 수 없는 경우(Meta가 퍼블릭 키를 다시 가져오고 재시도) 421을 반환합니다. flow_token가 유효하지 않으면 427을 반환합니다(Meta는 해당 세션의 흐름 버튼을 비활성화함).

동적 흐름 JSON 작성

동적 흐름 JSON은 정적 흐름 JSON과 두 가지 면에서 다릅니다.

  1. 최상위 data_api_version 필드는 필수입니다. 이렇게 하면 Meta에게 흐름 세션 중에 엔드포인트를 호출하도록 지시합니다. 지원되는 값은 "3.0" 및 입니다"4.0"(권장).

  2. 화면 바닥글은 대신 data_exchange 작업을 사용합니다navigate. 각 data_exchange 작업은 양식 데이터를 엔드포인트로 전송하여 다음 화면과 해당 콘텐츠를 반환합니다.

다음 예제는 두 개의 화면이 있는 최소 동적 흐름 JSON을 보여줍니다. 첫 번째 화면은 사용자의 이름을 수집하여 엔드포인트로 전송합니다. 엔드포인트는 두 번째 화면에서 개인화된 인사말을 반환합니다.

{ "version": "6.0", "data_api_version": "3.0", "routing_model": { "INPUT": ["RESULT"], "RESULT": [] }, "screens": [ { "id": "INPUT", "title": "Welcome", "data": { "greeting": { "type": "string", "__example__": "Tell us your name" } }, "layout": { "type": "SingleColumnLayout", "children": [ { "type": "TextBody", "text": "${data.greeting}" }, { "type": "Form", "name": "input_form", "children": [ { "type": "TextInput", "name": "user_name", "label": "Your name", "input-type": "text", "required": true }, { "type": "Footer", "label": "Submit", "on-click-action": { "name": "data_exchange", "payload": { "user_name": "${form.user_name}" } } } ] } ] } }, { "id": "RESULT", "title": "Hello", "terminal": true, "data": { "message": { "type": "string", "__example__": "Hello, World!" } }, "layout": { "type": "SingleColumnLayout", "children": [ { "type": "TextBody", "text": "${data.message}" }, { "type": "Footer", "label": "Done", "on-click-action": { "name": "complete", "payload": {} } } ] } } ] }

전체 흐름 JSON 스키마 참조는 Meta for Developers 웹 사이트의 흐름 JSON을 참조하세요.

종합 예제

다음 예제에서는 동적 흐름을 설정하고 게시하기 위한 API 호출의 전체 시퀀스를 보여줍니다.

# 1. Upload the business public key (KMS mode) aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --kms-key-arn {KMS_KEY_ARN} # 2. Create the Dynamic Flow with an endpoint FLOW_ID=$(aws social-messaging create-whatsapp-flow \ --id {WABA_ID} \ --flow-name "my_dynamic_flow" \ --categories '["OTHER"]' \ --flow-json fileb://flow.json \ --endpoint-uri "https://your-endpoint.example.com/flow" \ --query flowId --output text) # 3. Attach your Meta app for signature verification aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID \ --meta-app-id "{YOUR_META_APP_ID}" # 4. Publish the Flow aws social-messaging publish-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID # 5. Verify the configuration aws social-messaging get-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID

게시 후 템플릿 메시지에 흐름을 사용할 수 있습니다. 흐름 전송에 대한 자세한 내용은 섹션을 참조하세요사용자에게 WhatsApp 흐름 전송.