Twilio를 활용한 SMS 서비스 구현하기
mail의 경우 mailgun을 사용해왔는데 이번에는 SMS 서비스를 이용할 필요가 생겼습니다.
twilio에서 제공하는 서비스는 메세지만 있는 것이 아니라 IoT, 영상 통화, Bot building 등등 다양합니다. 구체적으로 제공하는 서비스는 공식 홈페이지에서 확인해보면 되고, 여기서는 인증 메세지를 보내보겠습니다.
twilio는 GCP 처럼 프로젝트 별로 관리할 수 있습니다. 현재 자신이 어느 프로젝트에 위치하고 있는지 확인하고 진행합시다.
전화 번호 구입
우선 메세지를 보내야 하므로 Phone Numbers 탭의 Buy a Number를 선택하여 진행합니다. 만약 탭이 보이지 않는다면 하단의 ... 을 눌러 원하는 탭을 pinned할 수 있습니다.
국가 선택은 SMS 서비스가 가능한 국가이기만 하면 상관 없지만 한국 번호들은 죄다 $25짜리이므로 미국을 선택한 후에 $1 가격인 핸드폰 번호를 선택합시다.
구입한 번호는 Phone Numbers 탭에서 확인하실 수 있습니다.
Geo Permissions과 테스트 메세지 보내기
그 다음은 SMS Programmable Messaging 부분에서 Geo Permissions 부분은 전부 다 허용해놓습니다. 초기 default가 전부 허용하지 않음이므로 이 과정을 건너 뛰면 아무 곳도 전송이 되지 않습니다.
특정 국가만 서비스하고 싶은 경우 해당 국가를 제외한 곳에선 꺼도 됩니다.
이제 테스트 메세지를 보내봅시다. Programmable Messaging 탭의 Try it Out을 클릭해 메세지 테스팅을 진행할 수 있습니다. 처음에는 가입시 입력한 verified number로만 전송이 가능합니다.
어플리케이션과의 연동
이제 이 서비스를 어플리케이션에 부착해봅시다.
우선 Dashboard에서 account SID와 토큰을 얻습니다.
사실 try-it-out에서 각 언어별 twilio 사용법을 이미 간단히 알려준 바가 있습니다.
twilio 패키지를 설치한 다음 활용하면 됩니다. node의 경우 다음 라이브러리를 설치하면 되는군요.
참고로 twilio-node라고 이름 붙었지만 설치는 yarn add twilio로 진행해야 합니다.
node를 예시를 들면 다음과 같습니다.
각 버전별 문서도 제공하니 사용 전 꼭 github에 가서 해당 라이브러리의 설명글을 읽어봅시다.
특정 국가에게만 보내기, lazy-loading, debug logging 등 기능 뿐만 아니라 예외 핸들링에 대한 설명과 같은 사용례까지 상세하게 다루고 있습니다.
const accountSid = '[your accountSid]';
const authToken = '[AuthToken]';
const client = require('twilio')(accountSid, authToken);
client.messages
.create({
from: '내 번호(기업의 번호)',
to: '보내고자 하는 번호',
body: '보내고자 하는 내용'
})
.then(message => console.log(message.sid))
.done();
제가 진행하는 프로젝트에서 위 코드를 이식한 바는 다음과 같습니다.
typescript를 쓰는 환경이므로 definitley typed 또한 설치해주었습니다. twilio 정도면 큰 회사인데 자체 타이핑이 없다는게...
yarn add twilio
yarn add @types/twilio
여튼, 아래와 같이 메세지를 보내는 함수를 작성할 수 있습니다.
import Twilio from "twilio";
const twilioClient = Twilio(process.env.TWILIO_SID, process.env.TWILIO_TOKEN);
// 일반 메세지 보내기
export const sendSMS = (to: string, body: string): Promise<any> => {
return twilioClient.messages.create({ from: process.env.TWILIO_PHONE, to, body });
};
// 인증을 위한 key보내기
export const sendVerificationSMS = (to: string, key: string): Promise<any> => sendSMS(to, `Your verificatino key is ${key}`);
furthermore
공식문서를 참고하시면 됩니다.