웹훅

웹훅은 에이전트가 메시지 및 이벤트에 응답하는 방법을 지정하는 파트너가 만든 HTTPS 콜백입니다. 웹훅을 구성하면 메시지이벤트를 수신할 수 있습니다.

파트너 웹훅 및 에이전트 웹훅

파트너 수준 또는 에이전트 수준에서 웹훅을 구성할 수 있습니다.

  • 파트너 웹훅은 유지관리하는 모든 에이전트에 적용됩니다. 에이전트의 동작이 비슷하거나 에이전트가 하나뿐인 경우 파트너 웹훅을 사용하세요.
  • 에이전트 웹훅은 개별 상담사에게 적용됩니다. 고유한 동작으로 여러 에이전트를 운영하는 경우 에이전트마다 서로 다른 웹훅을 설정할 수 있습니다.

파트너 웹훅과 에이전트 웹훅을 모두 구성한 경우 에이전트 웹훅이 특정 에이전트에서 우선 적용되지만 파트너 웹훅은 자체 웹훅이 없는 모든 에이전트에 적용됩니다.

에이전트 웹훅 구성

파트너 웹훅에서 에이전트에게 전송된 메시지를 수신합니다. 특정 에이전트의 메시지가 다른 웹훅으로 대신 전달되도록 하려면 에이전트 웹훅을 설정하세요.

  1. 비즈니스 커뮤니케이션 개발자 콘솔을 열고 RBM 파트너 Google 계정으로 로그인합니다.
  2. 에이전트를 클릭합니다.
  3. 통합을 클릭합니다.
  4. Webhook(웹훅)에서 Configure(구성)를 클릭합니다.
  5. 웹훅 엔드포인트 URL에 'https://'로 시작하는 웹훅 URL을 입력합니다.
  6. clientToken 값을 기록합니다. 이를 통해 수신하는 메시지가 Google에서 보낸 것인지 확인해야 합니다.
  7. 지정된 clientToken 매개변수가 있는 POST 요청을 수락하고 secret 매개변수의 일반 텍스트 값을 응답 본문으로 사용하여 200 OK 응답을 보내도록 웹훅을 구성합니다.

    예를 들어 웹훅이 다음 본문 콘텐츠가 포함된 POST 요청을 수신하는 경우

    {
      "clientToken":"SJENCPGJESMGUFPY",
      "secret":"1234567890"
    }
    

    웹훅이 clientToken 값을 확인해야 하며, clientToken이 올바르면 응답 본문으로 1234567890를 포함하여 200 OK 응답을 반환합니다.

    // clientToken from Configure
    const myClientToken = "SJENCPGJESMGUFPY";
    
    // Example endpoint
    app.post("/rbm-webhook", (req, res) => {
      const msg = req.body;
      if (msg.clientToken === myClientToken) {
          res.status(200).send(msg.secret);
          return;
      }
      res.send(400);
    });
    
  8. Play Console에서 인증을 클릭합니다. RBM이 웹훅을 확인하면 대화상자가 닫힙니다.

수신 메일 확인

웹훅은 모든 발신자의 메시지를 수신할 수 있으므로 메시지 콘텐츠를 처리하기 전에 Google에서 수신 메시지를 보냈는지 확인해야 합니다.

수신한 메일을 Google에서 보냈는지 확인하려면 다음 단계를 따르세요.

  1. 메시지의 X-Goog-Signature 헤더를 추출합니다. 메시지 본문 페이로드의 해시된 base64 인코딩 사본입니다.
  2. 요청의 message.body 요소에서 RBM 페이로드를 Base-64로 디코딩합니다.
  3. 웹훅의 클라이언트 토큰 (웹훅 설정 시 지정함)을 키로 사용하여 base64로 디코딩된 메시지 페이로드 바이트의 SHA512 HMAC를 만들고 결과를 base64로 인코딩합니다.
  4. X-Goog-Signature 해시를 직접 만든 해시와 비교합니다.
    • 해시가 일치하면 Google에서 메일을 보낸 것입니다.
    • 해시가 일치하지 않으면 정상으로 알려진 메시지의 해싱 프로세스를 확인합니다.

      해싱 프로세스가 올바르게 작동하는데 사기가 의심되는 메시지를 받으면 Google에 문의하세요.

Node.js

  if ((requestBody.hasOwnProperty('message')) && (requestBody.message.hasOwnProperty('data'))) {
    // Validate the received hash to ensure the message came from Google RBM
    let userEventString = Buffer.from(requestBody.message.data, 'base64');
    let hmac = crypto.createHmac('sha512', CLIENT_TOKEN);
    let data = hmac.update(userEventString);
    let genHash = data.digest('base64');
    let headerHash = req.header('X-Goog-Signature');

    if (headerHash === genHash) {
      let userEvent = JSON.parse(userEventString);

      console.log('userEventString: ' + userEventString);
      handleMessage(userEvent);
    } else {
      console.log('hash mismatch - ignoring message');
    }
  }

  res.sendStatus(200);
  

메시지 처리

웹훅에서 200 OK 이외의 값을 반환하면 전송 실패로 간주됩니다.

개발자는 빠른 속도로 메시지를 보내면 웹훅 알림이 높은 속도로 생성된다는 점에 유의해야 하며 예상 속도로 알림을 사용할 수 있도록 코드를 설계해야 합니다. 개발자는 웹 컨테이너의 500 응답, 시간 제한 또는 업스트림 실패를 포함하여 실패 응답을 유발할 수 있는 상황을 고려하는 것이 중요합니다. 고려할 사항은 다음과 같습니다.

  • 웹훅 알림의 예상 속도를 처리하도록 DDoS 보호가 구성되어 있는지 확인합니다.
  • 데이터베이스 연결 풀과 같은 리소스가 소진되지 않도록 하고 시간 제한 또는 500 응답을 생성합니다.

전송 실패 시 동작

RBM은 웹훅 호출에서 200 OK 이외의 응답을 수신할 때 백오프 및 재시도 메커니즘을 사용합니다. RBM은 재시도 간 대기 시간을 최대 600초까지 늘립니다. 사용 중지는 7일 동안 계속되며 그 후에는 메시지가 삭제됩니다.

에이전트 수준 웹훅의 의미

RBM이 파트너의 메시지를 하나의 큐에 추가합니다. 파트너가 에이전트 수준 웹훅을 사용하는 경우 하나의 웹훅이 실패하면 다른 웹훅으로의 전달에 영향을 미친다는 점에 유의해야 합니다. 다른 에이전트에 속한 웹훅은 실패한 메시지의 백오프 기간에 호출되지만 실패한 메시지가 재시도를 위해 대기열에 추가되면 전체 전달률이 하락하고 다른 에이전트가 영향을 받습니다.

개발자가 이 모델과 코드를 적절히 이해하는 것이 중요합니다. 가능한 한 메시지를 수락하고 처리를 위해 대기열에 추가하여 실패가 반환될 가능성을 최소화하는 것입니다.

다음 단계

웹훅을 구성하면 에이전트가 테스트 기기에서 메시지를 수신할 수 있습니다. 설정을 검증하려면 메시지를 전송하세요.