Node.js에서 Nodemailer를 사용한 이메일 인증 구현 예제
이 글에서는 Node.js와 Nodemailer를 사용하여 이메일 인증 시스템을 구현하는 방법에 대해 알아봅니다. 이메일 인증 코드를 생성하고, 사용자가 입력한 이메일로 전송하여 인증 절차를 완료하는 예제입니다.
1. Nodemailer 설치 및 설정
먼저 Nodemailer를 설치합니다.
npm install nodemailer
설치가 완료되면 다음과 같이 Nodemailer를 설정합니다.
const nodemailer = require('nodemailer');
const crypto = require('crypto');
2. 이메일 인증 코드 생성
이메일 인증 코드는 랜덤한 6자리 문자열로 생성합니다.
const verificationCode = crypto.randomBytes(3).toString('hex').toUpperCase();
3. Nodemailer를 사용한 이메일 전송
다음으로, 이메일을 전송하는 코드를 작성합니다.
// 이메일 전송을 위한 nodemailer 설정
const transporter = nodemailer.createTransport({
service: 'Gmail', // 이메일 서비스 제공자 설정
auth: {
user: process.env.EMAIL_USER, // 환경 변수에 저장된 이메일 사용자 이름
pass: process.env.EMAIL_PASS, // 환경 변수에 저장된 이메일 비밀번호
},
});
// 이메일 발송 옵션 설정
const mailOptions = {
from: process.env.EMAIL_USER, // 발신자 이메일 주소
to: email, // 수신자 이메일 주소 (받는 변수)
subject: '이메일 인증 코드', // 이메일 제목
text: `인증 코드: ${verificationCode}`, // 이메일 본문
};
// 이메일 전송
await transporter.sendMail(mailOptions);
env 설정 파일
프로젝트 디렉토리의 루트에 .env
파일을 생성하여 환경 변수를 설정합니다.
EMAIL_USER=your-email@gmail.com
EMAIL_PASS=your-email-password
이 파일을 통해 민감한 정보를 코드에 직접 작성하지 않고 관리할 수 있습니다. dotenv
패키지를 사용하여 .env
파일의 환경 변수를 로드할 수 있습니다. dotenv
패키지를 설치하고, 다음과 같이 사용합니다.
npm install dotenv
require('dotenv').config();
이제 process.env.EMAIL_USER
와 process.env.EMAIL_PASS
를 통해 환경 변수에 접근할 수 있습니다.
4. 인증 코드 저장 및 응답
세션에 인증 코드와 만료 시간을 저장하고 클라이언트에 응답을 보냅니다.
const expirationTime = Date.now() + 600000; // 10분 후 만료
// 세션에 인증 코드와 만료 시간 저장
req.session.verificationCode = {
code: verificationCode,
expires: expirationTime,
};
res.json({ success: true });
5. 전체 코드
전체 코드는 다음과 같습니다.
const express = require('express');
const router = express.Router();
const nodemailer = require('nodemailer');
const crypto = require('crypto');
const csrfProtection = require('csurf')();
// 이메일 인증 코드 발송 라우트
router.post('/send_verification_code', csrfProtection, async (req, res) => {
const { email } = req.body; // 요청 본문에서 이메일을 가져옴
const verificationCode = crypto.randomBytes(3).toString('hex').toUpperCase(); // 인증 코드 생성
const expirationTime = Date.now() + 600000; // 10분 후 만료 시간 설정
try {
// 이메일 전송을 위한 nodemailer 설정
const transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: process.env.EMAIL_USER, // 환경 변수에서 이메일 사용자 이름 가져오기
pass: process.env.EMAIL_PASS, // 환경 변수에서 이메일 비밀번호 가져오기
},
});
// 이메일 발송 옵션 설정
const mailOptions = {
from: process.env.EMAIL_USER, // 발신자 이메일 주소
to: email, // 수신자 이메일 주소
subject: '이메일 인증 코드', // 이메일 제목
text: `인증 코드: ${verificationCode}`, // 이메일 본문
};
// 이메일 전송
await transporter.sendMail(mailOptions);
// 세션에 인증 코드와 만료 시간 저장
req.session.verificationCode = {
code: verificationCode,
expires: expirationTime,
};
res.json({ success: true });
} catch (err) {
console.error('인증 코드 발송 중 오류 발생:', err); // 오류 로그 출력
res.json({ success: false });
}
});
module.exports = router;
참고할 만한 사이트
관련 이전 게시글
- Node.js에서 dotenv 라이브러리를 활용한 환경 변수 설정하는 방법
- Node.js에서 비동기 처리: Callback, Promise, async/await 사용법
- Express 기본 라우팅: GET과 POST 요청 처리하는 방법
- Express에서 CORS 미들웨어로 교차 도메인 이슈 해결하는 방법
- Node.js에서 bcryptjs를 이용한 비밀번호 해싱하는 방법
이 글이 도움이 되셨다면 공유 부탁 드립니다.