Node.js에서 Nodemailer를 사용한 이메일 인증 구현 예제

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_USERprocess.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;

참고할 만한 사이트

관련 이전 게시글

이 글이 도움이 되셨다면 공유 부탁 드립니다.

위로 스크롤