[NodeJS] nodemailer 모듈 보안문제 해결하기

두두·2023년 2월 8일
1
post-thumbnail

nodemailer 보안문제의 시작

[NodeJS] nodemailer 모듈로 메일 전송하기
이렇게 잘 넣어놓고 룰루랄라 서버 돌렷는데 에러남

Error: Invalid login: 535-5.7.8 Username and Password not accepted. Learn more at\n535 5.7.8
[https://support.google.com/mail/?p=BadCredentials(https://support.google.com/mail/?p=BadCredentials) l6-20020a170902d34600b00196036b6ca8sm1350868plk.156 - gsmtp"}

사용하는 구글 계정이 1단계 보안상태라서 그렁가부다 열바다!


그래서 2단계로 업그레이드✨ 시킴!

Error: Invalid login: 535-5.7.8 Username and Password not accepted. Learn more at\n535 5.7.8
[https://support.google.com/mail/?p=BadCredentials](https://support.google.com/mail/?p=BadCredentials) g15-20020aa79dcf000000b00581816425f3sm1163163pfq.112 - gsmtp"
...
(node:14824) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.} 

그랬더니 또 이딴 에러가 뜬다.
열받음 비밀번호 알려줬는데 웨않되.


2022.05.30 구글 지원사항 변경으로 인해 더이상 보안수준이 낮은 앱 및 Google계정을 지원하지 않는다고 한다.
낡고 병든 내 프로젝트는 더이상 nodemailer를 사용할 수 없다는 걸까?
슬퍼졌다.


새벽에 갑자기 넘 센치해져서 냅다 우리팀 기획자에게 모든 책임을 넘겨버리고 이슈닫음ㅋㅋ


저날 새벽에 인증 풀었다 다시 했다 난리를 치다가 오늘이 다시 왔음
오늘이야 말로 널 부셔주마

침착하게 앉아 검색하니 해답은 간단했다. 앱 비밀번호를 생성해서 사용하면 되는 거였음.

  • 앱 비밀번호: 보안 수준이 낮은 앱 또는 기기에 Google 계정에 대한 액세스 권한을 부여하는 번호 (당연히 노출되면 안댐)

앱 비밀번호 생성하기 훈녀생정

1. 구글 로그인 후 [Google 계정관리] 접속

2. [보안] - [Google에 로그인] - [앱 비밀번호] 선택

3. 앱 비밀번호 생성할 앱 및 기기 선택


메일쓰겠다고 꼭 메일 선택할 필요는 없다.

나는 맞춤이름 선택하고 프로젝트 이름 적었음

4. 앱 비밀번호 생성완료

설정하려는 애플리케이션 또는 기기의 Google 계정 설정으로 이동합니다. 비밀번호를 위에 표시된 16자리 비밀번호로 교체합니다.
일반적인 비밀번호와 마찬가지로 이 앱 비밀번호는 Google 계정에 대한 완전한 액세스 권한을 부여합니다. 비밀번호를 기억하지 않아도 되므로 적어 놓거나 다른 사용자와 공유하지 마세요.


노출되면 머 별 일은 없겠지만서도.. 구래도 소중한 프로젝트 계정이니 날아가지 않게 조심하자~!

5. 앱 비밀번호를 nodemailer의 transporter 생성위치에 패스워드 대신 넣어주기

const nodemailer = require('nodemailer');

const sendMail = async (category, content, nickname) => {
  let transporter = nodemailer.createTransport({
    service: 'gmail',
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    auth: {
      user: process.env.MAIL_USER,
      pass: process.env.MAIL_PASS,
    },
  });

  await transporter.sendMail({
    from: process.env.MAIL_USER,
    to: process.env.MAIL_USER,
    subject: `[제목]`,
    html: `[내용]`,
  });
};

module.exports = { sendMail };

나는 모든 노출위험이 있는 정보를 env파일로 관리해서 MAIL_PASS에 앱 비밀번호를 넣어줘따~!

이 쉬운거 저번에 왜 못함 어이업써;

profile
일단 갈기고보는 주니어개발자 두두입니다 :)

0개의 댓글