들어가기 전
Node.js에는 이메일을 전송할 수 있는 Nodemailer라는 패키지가 있다. 이 패키지를 이용하면 이메일 인증과 같은 사용자 인증을 구현할 수 있는데 이번 글에서는 이런 과정에 대해 알아보겠다.
Nodemailer란?
Nodemailer는 이메일을 보낼 수 있는 패키지로 흔히 이메일을 이용한 사용자 인증에 많이 사용한다. 사용법도 어렵지 않아서 몇가지 설정만 하면 바로 사용할 수 있는데 어떻게 사용하는지 알아보자
사용법
먼저 메일을 보내는 옵션을 설정해야한다.
// nodemailer 설정
const transporter = nodemailer.createTransport({
service: 'naver',
auth: {
user: 'hanium124@naver.com',
pass: process.env.nodemailerPassword,
},
});
이렇게 서버에서 보내는 옵션을 설정하면 된다. service는 보다시피 naver로 보내면 naver로 하고 gmail로 보내면 gmail로 하면 된다.
그리고 이메일을 보내는 계정에 대한 정보를 입력하면 되는데 이메일 주소와 해당 이메일 계정의 비밀번호를 입력하면 된다. 이메일 주소와 비밀번호는 하드코딩해도 되긴하는데 그럼 개인정보가 유출되니 위에서 처럼 .env파일에 넣는걸 추천한다.
// 인증번호 생성 및 저장
const verificationCode = Math.floor(100000 + Math.random() * 900000);
// 이메일 전송 설정
const mailOptions = {
from: 'hanium124@naver.com',
to: req.body.email,
subject: '인증번호',
text: `인증번호: ${verificationCode}`,
};
다음 단계로는 사용자 인증을 위한 난수 생성을 하고 이메일 전송에 관한 옵션을 설정하면 된다. 위 코드에서는 숫자로만 난수가 나오는데 임의의 텍스트로 하든 숫자로만 하든 상관없다. 그리고 from에는 보내는(관리자) 이메일 주소이고 to는 사용자가 받을 이메일 주소이다. subject로 이메일 제목을 입력하고 text로 본문을 채운다. 이때 코드에는 없지만 첨부파일을 넣을 수도 있고 옵션으로 html도 넣을 수 있다.
// 이메일 전송
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
res.status(400).send('이메일 전송 실패');
} else {
console.log('Email sent: ' + info.response);
res.status(200).send(verificationCode.toString());
}
});
마지막으로 전송을 하면 되는데 전송은 그냥 sendMail 메서드를 이용하여 보내면 된다.
그러면 아래 코드처럼 이메일을 보내는 메서드가 완성되는데 여기서 응답으로 인증 번호를 보내는 이유는 프론트에서 사용자가 인증번호를 입력하면 비교를 해서 통과여부를 결정해야 하기 때문이다.
exports.sendEmail = async (req, res) => {
// nodemailer 설정
const transporter = nodemailer.createTransport({
service: 'naver',
auth: {
user: 'example@naver.com',
pass: process.env.nodemailerPassword,
},
});
// 인증번호 생성 및 저장
const verificationCode = Math.floor(100000 + Math.random() * 900000);
// 이메일 전송 설정
const mailOptions = {
from: 'example@naver.com',
to: req.body.email,
subject: '인증번호',
text: `인증번호: ${verificationCode}`,
};
// 이메일 전송
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
res.status(400).send('이메일 전송 실패');
} else {
console.log('Email sent: ' + info.response);
res.status(200).send(verificationCode.toString());
}
});
};
이렇게 이메일을 보내면
const [serverVerificationCode, setServerVerificationCode] = useState(""); // 서버에서 받은 인증번호를 저장할 상태 변수
const sendVerificationCode = async () => {
try {
const response = await fetch(
"http://localhost:3000/signup/email-verification",
{
method: "POST",
body: JSON.stringify({ email }),
headers: { "Content-Type": "application/json" },
}
);
if (response.ok) {
const verificationCode = await response.text();
setServerVerificationCode(verificationCode); // 서버에서 받은 인증번호 저장
setShowVerificationField(true); // 이메일 전송 성공시 인증번호 입력 필드 표시
}
} catch (error) {
console.error("인증번호 발송에 실패했습니다:", error);
}
};
// 사용자가 입력한 인증번호와 서버에서 받은 인증번호를 비교하는 함수
const verifyCode = () => {
if (verificationCode === serverVerificationCode) {
setEmailVerified(true);
alert("인증성공!");
} else {
alert("틀린 인증번호 입니다");
}
};
프론트 리액트 코드인데 서버에서 보낸 난수를 useState에 저장을 하든 어디에 저장을 한 뒤 사용자가 인증번호를 입력을 하면 verifyCode 메서드를 실행하여 인증번호가 맞는지 확인을 하면 사용자 인증이 완료된다.
정리
Node.js에서 사용자 인증은 Nodemailer 패키지를 이용하여 간편하게 구현할 수 있다. 단 유의할 점으로는 코드를 다 작성해도 안보내질시에는 이메일을 보내는 계정에 따로 설정을 해야할 경우가 있을 수 있으므로 계정 설정에도 유의하도록 하자.
'Node.js(Express)' 카테고리의 다른 글
| [Node.js] 게시판 글 수정하기(사진 포함) (0) | 2024.02.07 |
|---|---|
| [Node.js] SNS 만들기 - Multer로 Multipart/Form-Data로 사진 전송 게시글 작성 (0) | 2024.02.02 |
| [Node.js] JWT 사용하기 - access token, refresh token (0) | 2024.01.20 |
| [Node.js] JWT에 대해 알아보기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - Controller 만들기 (0) | 2024.01.18 |