한국 사용자를 위한 Twilio Verify 대안: 카카오톡으로 보내는 인증번호

K-OTP 팀
2026. 10. 31.

이미 Twilio Verify나 Vonage Verify를 쓰는 서비스가 한국 사용자를 맞이하게 되면, 언젠가는 카카오톡 채널을 찾게 됩니다. 이 글에서는 두 API가 현재 제공하는 채널, 한국에서 카카오톡이 중요한 이유, 그리고 K-OTP를 단독으로 쓰거나 기존 Verify 연동 옆에서 한국 번호에만 쓰는 방법을 정리합니다.

글로벌 Verify API가 제공하는 채널

2026년 10월 24일에 각 공식 문서에서 확인한 내용입니다.

  • Twilio Verify는 인증 채널로 SMS(RCS 자동 전환 포함), WhatsApp, 음성, 이메일, Silent Network Auth, 패스키, 푸시, Silent Device Approval, TOTP를 안내합니다.
  • Vonage Verify는 개요 문서에서 SMS, 음성, 이메일, WhatsApp, Silent Authentication을 안내하며, API 레퍼런스에는 RCS도 언급됩니다.

두 곳 모두 카카오톡은 없습니다. SMS로는 국내 휴대폰에도 보낼 수 있지만, 그 인증번호는 많은 사용자가 매일 쓰는 메신저로 오지 않습니다. 채널 구성은 바뀔 수 있으니 결정하기 전에 최신 문서를 확인하세요.

한국 사용자에게 카카오톡이 중요한 이유

해외에서 WhatsApp으로 인증번호를 보내듯, 한국에서는 카카오톡 알림톡이 그 역할을 합니다. 카카오톡은 많은 사람이 매일 쓰는 메신저이고, 기업은 알림톡으로 사용자에게 연락합니다. 알림톡은 기업의 카카오톡 채널이 미리 검수받은 템플릿으로 보내는 정보성 메시지입니다. 알림톡으로 온 인증번호는 사용자의 다른 대화와 같은 곳에, 이름이 표시된 기업 채널에서 도착합니다.

알림톡을 직접 보내려면 카카오톡 채널, 국내 발송 사업자에 등록하는 발신 프로필, 검수받은 템플릿을 준비해야 합니다. 그다음에도 메시지 주변의 인증 로직은 따로 만들어야 합니다.

K-OTP가 하는 일

K-OTP는 국내 휴대폰 번호를 위한 인증번호 API입니다. Verify API처럼, 인증번호를 직접 만들거나 저장하거나 비교할 필요가 없습니다.

  1. 발급. 휴대폰 번호, 용도(예: login), 멱등키로 POST /v1/issue를 호출합니다. K-OTP가 6자리 인증번호를 만들어 카카오 알림톡으로 전달합니다. 응답으로 issueId를 받습니다.
  2. 검증. issueId와 사용자가 입력한 인증번호로 POST /v1/verify를 호출합니다. 결과는 verified: true이거나, MISMATCH, EXPIRED 같은 이유와 함께 verified: false입니다. 기본값은 유효시간 3분, 시도 5회입니다.

그 밖에:

  • 멱등한 발급. 모든 발급 요청에 멱등키가 있습니다. 타임아웃 뒤 같은 키로 재시도하면 메시지를 다시 보내거나 두 번 차감하지 않고 첫 결과를 돌려줍니다.
  • 테스트 모드. sk_test_, pk_test_ 키는 아무것도 보내지 않고 크레딧도 쓰지 않습니다. 테스트 번호(010-0000-00xx)로 429, 402, 503을 포함한 시나리오를 재현할 수 있고, 테스트 인증번호는 항상 000000입니다.
  • SDK. JavaScript/TypeScript용 @k-otp/sdk는 서버, 브라우저, React, Vue, Svelte와 헤드리스 UI 컴포넌트를 지원합니다. C#, Java, Kotlin, PHP, Go, Python, Ruby, Dart용 서버 SDK는 미리 보기로 제공합니다.
  • 요금. 선불 크레딧이며, 발송 1건에 1 크레딧, 검증은 무료입니다. 요금 페이지를 참고하세요.

Verify 개념과 K-OTP 대응

Twilio Verify를 써 봤다면 대응 관계는 간단합니다.

  • Verify Service → 앱(앱마다 API 키가 따로 있음)
  • 인증 시작(Verifications) → POST /v1/issue, issueId를 돌려줌
  • 인증번호 확인(VerificationCheck) → issueId와 code로 POST /v1/verify
  • status: "approved" → verified: true
  • 채널: sms, whatsapp 등 → 카카오 알림톡

미리 알아 둘 차이는 두 가지입니다.

  • K-OTP는 휴대폰 번호가 아니라 issueId로 인증번호를 확인합니다. 진행 중인 로그인이나 가입 정보와 함께 issueId를 서버에 저장하세요.
  • 모든 발급에 멱등키가 필요합니다. 발송 시도마다 하나 만들어 issue 호출 전에 저장하고, 같은 시도를 재시도할 때만 다시 쓰세요.

기존 Verify 연동과 함께 쓰기

모든 국가를 한 번에 옮길 필요는 없습니다. 국내 휴대폰 번호는 K-OTP로 보내고, 나머지 번호는 지금 쓰는 서비스에 그대로 둘 수 있습니다.

import { createOtpServerClient } from "@k-otp/sdk/server";
import { parseOtpPhoneNumber } from "@k-otp/sdk/ui";

const kotp = createOtpServerClient({ apiKey: process.env.K_OTP_SECRET_KEY ?? "" });

export async function startVerification(input: string, idempotencyKey: string) {
	// 어떤 형식이든("+82 10-1234-5678") 국내 휴대폰 번호면 "01012345678", 아니면 undefined
	const koreanMobile = parseOtpPhoneNumber(input).value;
	if (!koreanMobile) return { provider: "existing" as const }; // 기존 Verify 연동

	const { issueId, expiresAt } = await kotp.issue({
		phoneNumber: koreanMobile,
		purpose: "login",
		idempotencyKey, // 진행 중인 로그인과 함께 저장하고, 이 발송을 재시도할 때만 재사용
	});
	return { provider: "k-otp" as const, issueId, expiresAt };
}

서버는 사용자가 카카오톡을 쓰는지 미리 알 수 없으므로 휴대폰 번호로만 나누면 됩니다. 인증번호를 받지 못했다는 사용자에게는 기존 Verify 같은 다른 인증 방법을 고를 수 있게 해 둘 수 있습니다.

오류 처리와 재발송 대기 시간까지 포함한 서버 중심 흐름은 Next.js 가이드에 있습니다.

K-OTP가 아닌 것

  • K-OTP는 사용자가 그 휴대폰 번호로 메시지를 받을 수 있는지 확인합니다. 실명 확인 서비스가 아닙니다.
  • 국내 휴대폰 번호를 위한 서비스입니다. 다른 국가는 글로벌 서비스를 계속 쓰세요.
  • 메시지는 K-OTP의 한국어 템플릿을 씁니다. 승인된 서비스명을 메시지에 표시할 수 있습니다. 메시지 템플릿을 참고하세요.

시작하기

콘솔에서 계정을 만들고 앱과 테스트 키를 추가한 뒤 빠른 시작을 따라 하세요. 테스트 키와 010-0000-0000으로는 아무것도 보내지 않고 크레딧도 쓰지 않은 채 전체 흐름을 확인할 수 있습니다.