이번 프로젝트에서 회원가입시에 사용자에게 이메일 인증을 받기 위해 찾아보던중
Nodemailer라는 라이브러리를 발견해서 사용해보겠습니다!
(Nodemailer는 node.js에서 email을 쉽게 보낼 수 있는 기능들을 제공해줌)
Nodemailer를 사용할 때 이메일을 보낼 gmail 계정과 해당 gmail의 앱 비밀번호가 필요하다!
Google 계정 => 보안 => 2단계 인증을 활성화한 후 검색창에 앱 비밀번호를 검색해서 생성할 수 있다
이렇게 gmail 계정과 앱 비밀번호는 .env파일에 저장해주었습니다.
터미널에 npm i nodemailer를 이용하여 라이브러리를 설치해주고
const nodemailer = requiere("nodemailer")를 이용해서 모듈을 import하면 됩니다!
const nodemailer = require("nodemailer");
const dotenv = require("dotenv");
dotenv.config();
const { NODEMAILER_USER, NODEMAILER_PASS } = process.env;
// 렌덤 code 생성하는 함수
const generateRandomNumber = (n) => {
let code = "";
for (let i = 0; i < n; i++) {
code += Math.floor(Math.random() * 10);
}
return code;
};
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: NODEMAILER_USER,
pass: NODEMAILER_PASS,
},
});
const sendEmail = (email, code) => {
const mailOptions = {
from: NODEMAILER_USER,
to: email,
subject: "Co-Code 회원가입 인증 코드", // 메일제목
text: `Co-Code 회원가입 인증 코드: ${code}`, // 메일 내용
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
} else {
console.log(`Email sent: ${info.response}`);
}
});
return code;
};
module.exports = { generateRandomNumber, sendEmail };
그 후 저는 이렇게 email.helper.js 라는 파일을 작성하였습니다!
코드를 살펴보면
먼저 6자리 인증 코드를 생성하기 위해 렌덤으로 6자리 코드를 만드는 generateRandomNumber 함수를 만들었고
transporter에 createTransport 매서드를 이용해 gmail로 service 할 것이고 .env에 저장되어있는 아이디와 비밀번호로 로그인하여 메일을 보낼 것이라고 정의해줬습니다
sendEmail 함수에서는 인증 코드를 받을 user의 email 과 6자리 인증코드를 매개변수로 받아 해당 코드를 메일로 보내고 있습니다
그럼 이제 문제는 메일로 보낸 렌덤한 코드를 어떻게 인증하고 회원가입을 시켜줄 것인가입니다
처음에 고안했던 방식은
1. 회원가입을 누르면 인증 코드 부분의 기본값을 NULL로 하여 우선적으로 회원가입할 고객 정보를 DB에 저장하고
(여기서 중복 회원가입 에러를 처리해줌)
2. 인증번호를 발송하고 사용자가 인증 요청을 하면 DB에 해당 이메일로 가입된 정보에서 저장된 code와 비교함
=> ttl 을 5분으로하여 5분뒤에 인증 코드를 저장한 column의 값은 자동 삭제 시켜서 제한 시간을 뒀음
3. 만약 사용자가 작성한 인증 코드와 DB에 저장된 인증 코드 값이 일치하면 DB에 저장된 값을 유지하고 만약 일치 하지 않으면 기존에 DB에 저장했던 정보를 삭제해서 회원가입이 안되게 할 것이었다..
하지만 이렇게 하면 DB 공간낭비, 5분동안은 아무도 해당 userID로는 회원가입을 못하는 (중복 불가) 이슈가 있어서
이렇게 그냥 인증 코드를 프론트로 보내주고 프론트에서 값의 일치 여부를 확인해서 처리해주기로 마무리했다!
'Backend > Node' 카테고리의 다른 글
AWS를 이용하여 Node.js + MongoDB 배포하기 [Co-Code] (0) | 2024.04.06 |
---|---|
CORS란 무엇일까? (1) | 2024.02.04 |
JWT 토큰 (1) | 2024.01.31 |
TypeORM 이란? (1) | 2024.01.28 |