Node.js에서 SMS 인증 API 5분 만에 연동하기 - 회원가입부터 로그인까지
웹 서비스를 운영하다 보면 반드시 필요한 기능이 있습니다. 바로 SMS 본인인증입니다. 회원가입 시 실제 사용자인지 검증하고, 로그인 시 2차 인증으로 보안을 강화하는 데 필수적이죠. 하지만 통신사 연동, 복잡한 계약 절차, 높은 비용 때문에 많은 개발자들이 어려움을 겪고 있습니다.
이 글에서는 서류 없이 가입 즉시 사용할 수 있는 SMS 인증 API를 Node.js 프로젝트에 연동하는 방법을 단계별로 안내합니다. 실제 코드 예제를 따라하면 5분 안에 SMS 인증 기능을 구현할 수 있습니다.
왜 SMS 인증이 필요한가?
SMS 인증은 다음과 같은 상황에서 핵심적인 역할을 합니다:
- 회원가입 시 본인 확인: 가짜 계정 생성을 방지하고 실제 사용자만 가입할 수 있도록 합니다.
- 로그인 2차 인증(2FA): 비밀번호가 유출되더라도 SMS 인증을 통해 계정을 보호합니다.
- 비밀번호 재설정: 본인 확인 후 안전하게 비밀번호를 변경할 수 있습니다.
- 결제 및 중요 작업 확인: 민감한 작업 수행 전 추가 인증 단계를 거칩니다.
EasyAuth SMS 인증 API 소개
EasyAuth는 복잡한 서류 절차 없이 가입 즉시 SMS 인증 API를 사용할 수 있는 서비스입니다. 주요 특징은 다음과 같습니다:
- 건당 25원의 합리적인 요금
- 가입 시 10건 무료 제공으로 부담 없이 테스트 가능
- 별도 서류 제출 없이 가입 즉시 API 키 발급
- 직관적인 RESTful API 설계
사전 준비
시작하기 전에 다음 항목을 준비하세요:
- EasyAuth에 가입하고 API 키를 발급받습니다.
- Node.js 18 이상이 설치되어 있어야 합니다.
- 프로젝트에 필요한 패키지를 설치합니다.
npm init -y
npm install express axios dotenv환경 변수 파일(.env)을 생성합니다:
EASYAUTH_API_KEY=your_api_key_here
PORT=30001단계: SMS 인증 코드 발송 구현
먼저 사용자에게 SMS 인증 코드를 발송하는 기능을 구현합니다.
// smsAuth.js
const axios = require('axios');
require('dotenv').config();
const EASYAUTH_BASE_URL = 'https://easy-auth.compounding.co.kr/api';
const API_KEY = process.env.EASYAUTH_API_KEY;
/**
-
SMS 인증 코드 발송
-
@param {string} phoneNumber - 수신자 전화번호 (예: '01012345678')
@returns {Promise<object>} 발송 결과
*/
async function sendVerificationCode(phoneNumber) {
try {
const response = await axios.post(
${EASYAUTH_BASE_URL}/v1/sms/send,
{
phoneNumber: phoneNumber,
},
{
headers: {
'Authorization':Bearer ${API_KEY},
'Content-Type': 'application/json',
},
}
);console.log('인증 코드 발송 성공:', response.data);
return response.data;
} catch (error) {
console.error('인증 코드 발송 실패:', error.response?.data || error.message);
throw error;
}
}
2단계: 인증 코드 검증 구현
사용자가 입력한 인증 코드를 검증하는 기능을 추가합니다.
/**SMS 인증 코드 검증
@param {string} phoneNumber - 전화번호
@param {string} code - 사용자가 입력한 인증 코드
@returns {Promise<object>} 검증 결과
*/
async function verifyCode(phoneNumber, code) {
try {
const response = await axios.post(
${EASYAUTH_BASE_URL}/v1/sms/verify,
{
phoneNumber: phoneNumber,
code: code,
},
{
headers: {
'Authorization':Bearer ${API_KEY},
'Content-Type': 'application/json',
},
}
);console.log('인증 성공:', response.data);
return response.data;
} catch (error) {
console.error('인증 실패:', error.response?.data || error.message);
throw error;
}
}
module.exports = { sendVerificationCode, verifyCode };
3단계: Express API 서버 구성
이제 위 함수들을 Express 서버의 API 엔드포인트로 연결합니다.
// server.js
const express = require('express');
const { sendVerificationCode, verifyCode } = require('./smsAuth');
require('dotenv').config();const app = express();
app.use(express.json());// 인증 코드 발송 엔드포인트
app.post('/api/auth/send-code', async (req, res) => {
const { phoneNumber } = req.body;if (!phoneNumber) {
return res.status(400).json({
success: false,
message: '전화번호를 입력해주세요.',
});
}// 전화번호 형식 검증
const phoneRegex = /^01[0-9]{8,9}$/;
if (!phoneRegex.test(phoneNumber)) {
return res.status(400).json({
success: false,
message: '올바른 전화번호 형식이 아닙니다.',
});
}try {
const result = await sendVerificationCode(phoneNumber);
res.json({ success: true, message: '인증 코드가 발송되었습니다.', data: result });
} catch (error) {
res.status(500).json({ success: false, message: '인증 코드 발송에 실패했습니다.' });
}
});// 인증 코드 검증 엔드포인트
app.post('/api/auth/verify-code', async (req, res) => {
const { phoneNumber, code } = req.body;if (!phoneNumber || !code) {
return res.status(400).json({
success: false,
message: '전화번호와 인증 코드를 모두 입력해주세요.',
});
}try {
const result = await verifyCode(phoneNumber, code);
res.json({ success: true, message: '인증이 완료되었습니다.', data: result });
} catch (error) {
res.status(400).json({ success: false, message: '인증 코드가 올바르지 않습니다.' });
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(서버가 포트 ${PORT}에서 실행 중입니다.);
});
4단계: 회원가입 플로우에 SMS 인증 통합
실제 회원가입 프로세스에 SMS 인증을 통합하는 예제입니다.
// 회원가입 엔드포인트 (SMS 인증 통합)
app.post('/api/auth/register', async (req, res) => {
const { email, password, phoneNumber, verificationCode } = req.body;// 1. 입력값 검증
if (!email || !password || !phoneNumber || !verificationCode) {
return res.status(400).json({
success: false,
message: '모든 필드를 입력해주세요.',
});
}try {
// 2. SMS 인증 코드 검증
const verifyResult = await verifyCode(phoneNumber, verificationCode);if (!verifyResult.verified) { return res.status(400).json({ success: false, message: '전화번호 인증에 실패했습니다.', }); } // 3. 사용자 생성 (데이터베이스 저장 로직) // const user = await createUser({ email, password, phoneNumber }); res.status(201).json({ success: true, message: '회원가입이 완료되었습니다.', });
} catch (error) {
res.status(500).json({
success: false,
message: '회원가입 처리 중 오류가 발생했습니다.',
});
}
});
보안 베스트 프랙티스
SMS 인증을 구현할 때 반드시 고려해야 할 보안 사항들입니다:
- Rate Limiting 적용: 동일 번호로 반복 요청을 방지하기 위해 시간당 발송 횟수를 제한하세요.
- 인증 코드 만료 시간: 일반적으로 3~5분으로 설정합니다. 너무 길면 보안에 취약하고, 너무 짧으면 사용자 경험이 나빠집니다.
- 시도 횟수 제한: 인증 코드 입력 시도를 5회 이내로 제한하여 무차별 대입 공격을 방지하세요.
- HTTPS 필수: API 통신 시 반드시 HTTPS를 사용하여 데이터를 암호화하세요.
- API 키 보호: API 키를 환경 변수로 관리하고, 클라이언트 코드에 절대 노출하지 마세요.
Tip: EasyAuth는 자체적으로 Rate Limiting과 인증 코드 만료 관리를 지원하므로, 서버 측에서 추가 로직을 최소화할 수 있습니다.
테스트하기
서버를 실행하고 cURL 또는 Postman으로 테스트해 보세요:
# 서버 실행
node server.js인증 코드 발송 테스트
curl -X POST http://localhost:3000/api/auth/send-code
-H "Content-Type: application/json"
-d '{"phoneNumber": "01012345678"}'인증 코드 검증 테스트
curl -X POST http://localhost:3000/api/auth/verify-code
-H "Content-Type: application/json"
-d '{"phoneNumber": "01012345678", "code": "123456"}'
마무리
이 가이드를 통해 Node.js 프로젝트에 SMS 인증 기능을 빠르게 연동하는 방법을 알아보았습니다. EasyAuth를 사용하면 복잡한 계약 절차 없이 건당 25원이라는 합리적인 비용으로 SMS 인증을 구현할 수 있습니다. 가입 시 10건 무료 제공되니 부담 없이 테스트해 보세요.
더 자세한 API 스펙은 EasyAuth API 문서에서 확인할 수 있습니다. 다음 글에서는 React 프론트엔드에서 SMS 인증 UI를 구현하는 방법을 다루겠습니다.