Node.js에서 OTP 흐름 시스템을 만드는 방법 (step-by-step)
Source: Dev.to
위에 제공된 텍스트가 없습니다. 번역을 원하는 전체 내용을 알려주시면 한국어로 번역해 드리겠습니다.
🚀 구축할 내용
- OTP 요청/전송 엔드포인트
- OTP 검증 엔드포인트
- 기본 사용자 모델 (메모리/DB)
- 구성 가능한 발신자 (이메일/SMS)
📦 Step 1 — 설치 및 설정
새 Node.js 프로젝트를 만들고 필요한 의존성을 설치합니다:
mkdir auth-verify-otp
cd auth-verify-otp
npm init -y
npm install express auth-verify dotenv
민감한 설정을 저장하기 위해 .env 파일을 생성합니다:
PORT=3000
EMAIL_HOST=smtp.gmail.com
EMAIL_USER=me@example.com
EMAIL_PASS=yourEmailPassword
EMAIL_PORT=yourEmailPort
팁: Gmail을 사용할 경우 실제 비밀번호 대신 앱 비밀번호를 생성하는 것이 권장됩니다.
📧 Step 2 — OTP 발신자 설정
index.js에서 auth-verify를 설정하고 이메일 발신자를 구성합니다. OTP 관리자는 생성, 저장, 쿨다운, 만료 등을 자동으로 처리합니다.
require('dotenv').config();
const express = require('express');
const AuthVerify = require('auth-verify');
const app = express();
app.use(express.json());
// Initialize auth-verify
const auth = new AuthVerify();
// Configure email sender
auth.otp.sender({
via: 'email',
host: process.env.EMAIL_HOST,
sender: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS,
port: process.env.EMAIL_PORT
});
📮 Step 3 — OTP 요청 라우트
사용자가 /send-otp 엔드포인트에 접근하면 OTP를 생성하고 이메일로 전송합니다.
app.post('/send-otp', async (req, res) => {
try {
const { email } = req.body;
await auth.otp.send(email, {
otpLen: 5, // length of OTP code
subject: "Account verification",
text: `Your OTP code is ${auth.otp.code}`
});
return res.json({ message: 'OTP sent!' });
} catch (err) {
console.error(err);
return res.status(500).json({ error: 'Failed to send OTP' });
}
});
auth.otp.code는 사용자에게 전송되는 생성된 코드를 포함합니다.
🔍 4단계 — OTP 검증
사용자가 입력한 OTP를 검증하는 라우트를 생성합니다.
app.post('/verify-otp', async (req, res) => {
try {
const { email, code } = req.body;
const isValid = await auth.otp.verify(email, code);
if (!isValid) {
return res.status(400).json({ verified: false, message: 'Invalid or expired OTP' });
}
return res.json({ verified: true, message: 'OTP verified successfully!' });
} catch (err) {
return res.status(500).json({ error: 'Verification error' });
}
});
auth.otp.verify()는 true 또는 false를 반환하므로, 이에 따라 로직을 분기할 수 있습니다.
🔄 5단계 — 선택 사항: 쿨다운 및 재전송 로직
스팸 및 무차별 대입을 방지하기 위해 auth-verify는 쿨다운을 지원합니다. OTP를 전송한 후에는 사용자가 다시 요청하기 전에 기다려야 합니다.
auth.otp.cooldown('30s'); // OTP를 재전송하기 전의 쿨다운
auth.otp.resend('user@example.com');
쿨다운 로직은 사용자 경험과 보안을 모두 보호합니다.
🧠 무대 뒤에서 일어난 일
| 단계 | 수행 작업 |
|---|---|
| OTP 생성 | 안전하고 무작위인 숫자 코드를 생성합니다 |
| 설정자 | OTP를 식별자(이메일/전화)와 연결합니다 |
| 전송자 | 이메일/SMS로 코드를 전달합니다 |
| 검증자 | 제출된 코드를 저장된 코드와 비교합니다 |
| 쿨다운 | 스팸 및 무차별 대입 공격을 방지합니다 |
이 모든 복잡한 작업은 auth-verify에 내장되어 있으므로 토큰을 수동으로 생성하거나, 만료를 관리하거나, 쿨다운 로직을 구현할 필요가 없습니다.
🏁 최종 생각
OTP 시스템을 처음부터 구축하려면 토큰 생성, 안전한 전송, 코드 저장/만료, 검증 등 여러 요소가 필요합니다. auth-verify와 같은 라이브러리는 이러한 과정을 단순화하여 보일러플레이트보다 제품 로직에 집중할 수 있게 해줍니다.
이제 회원가입 및 로그인 흐름에서 몇 개의 라우트만으로도 안전한 OTP 검증을 지원할 수 있습니다!