Node.js에서 OTP 흐름 시스템을 만드는 방법 (step-by-step)

발행: (2026년 1월 16일 오후 10:56 GMT+9)
5 min read
원문: Dev.to

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 검증을 지원할 수 있습니다!

Back to Blog

관련 글

더 보기 »

NodeJS 101 — 파트 2 MySQL

🚀 JavaScript Node.js Express를 사용한 API 만들기. Node.js, Express, Sequelize 및 MySQL을 활용한 종합적인 RESTful API 개발 가이드!