Twilio Functions를 외부에서 안전하게 호출

4768 단어 twilio

소개



Twilio에는 서버리스 아키텍처Twilio Functions라는 서비스가 있습니다. 이 메커니즘을 사용하면 사용자 측에 서버를 제공하지 않고 동적 TwiML을 생성하거나 Twilio의 RestAPI로 전화나 SMS를 조작할 수 있습니다.
Functions를 실행하려면 Functions를 만들 때 자동으로 생성되는 URL을 호출해야 합니다.

이 기사에서는 Functions를 호출할 때 보안 조치로 "ACCESS CONTROL"을 활용하는 방법을 설명합니다.

ACCESS CONTROL이란?



Twilio는 Functions뿐만 아니라 Twilio의 공식 요청임을 증명하기 위해 유효성 검증 요청이라는 메커니즘을 제공합니다. 구체적으로는 Twilio의 요청 URL과 매개 변수에 대해 사용자 만 알 수있는 Auth Token에서 해시 값을 취하여 X-Twilio-Signature라는 HTTP 헤더 옵션을 넣습니다.
사용자 측은 이 헤더 값을 스스로 검증하는 것으로, 정말로 Twilio로부터의 리퀘스트인 것, 파라미터를 포함해 변조되어 있지 않은 것을 보증할 수 있습니다.

Twilio Functions에는 Functions를 생성할 때 다음과 같은 ACCESS CONTROL 옵션이 있습니다.

이 확인란을 켜면 위의 유효성 검사 요청이 Functions 런타임에 확인됩니다.
즉, Twilio 내부로부터의 액세스에 제한하는 경우(예를 들어, 전화 번호의 착신 설정시의 URL로서 Functions를 지정하는 경우 등)는, 체크를 ON으로 해 두는 것이 추천됩니다.

외부에서 Functions 호출에서 유효성 검사 요청 사용



위와 같이 X-Twilio-Signature를 검증하는 것이 ACCESS CONTROL의 목적이므로 외부 서버에서 Functions를 호출하는 경우에도 Twilio로부터의 요청과 마찬가지로 X-Twilio-Signature를 생성하여 헤더 에 부여하는 것으로, ACCESS CONTROL을 ON으로 하면서 시큐어한 액세스가 가능해집니다.

X-Twilio-Signature의 생성 예



다음 코드는 Node.js를 사용하여 X-Twilio-Signature를 생성하는 샘플입니다.

Node.js
// Get twilio-node from twilio.com/docs/libraries/node
const crypto = require('crypto');

// Your Auth Token from twilio.com/console
const authToken = 'YOUR_AUTH_TOKEN';

// FunctionsのURL
let url = '呼び出したいFunctionsのURL';

// POSTパラメータ
const params = {
  test: 'hogehoge'
};

// パラメータを並び替えて、URLに連結した文字列を生成
Object.keys(params).sort().forEach(function(key) {
  url = url + key + params[key];
});

// X-Twilio-Signatureの生成
const signature = crypto.createHmac('sha1', authToken).update(Buffer.from(url, 'utf-8')).digest('base64')

console.log(signature);

이렇게 하여 생성한 X-Twilio-Signature를 Functions의 호출시에 POST 헤더에 넣어 주는 것으로, 외부로부터 호출할 때의 보안 대책이 됩니다. 덧붙여서 Signature가 다른 경우는, 호출이 403 에러가 됩니다.

좋은 웹페이지 즐겨찾기