[엘리스 sw 엔지니어 트랙] 35일차 Nodemailer, OAuth, Nginx

오경찬·2022년 5월 31일
0

수업 35일차

다음주 텀프로젝트 전 마지막 수업이다. 당장 다음주부터 프로젝트를 한다는게 실감 나지도 않고, 내가 이런걸 만들수 있을까...? 라는 생각부터든다 하지만 뽜이링 해자~

이론

  • jwt: 저장소를 이용하지 않고, 전자서명을 이용하는 방법
    cookie: 클라이언트 정보를 서버에 전달하는 기술, 클라이언트 정보를 브라우저에 저장
    SMTP: 메일을 전송하는 기능을 구현
    OAuth: 다른 서비스에게 데이터를 제공하기위한 인증방식 표준
    Nginx: 최근 프로젝트에서 가장많이 채택되고 있는 웹 서버 소프트웨어

Nodemailer

노드메일러는 위에 문장처럼 Node.js에서 메일 전송을 가능하게 해주는 모듈이며, 가장 일반적으로 사용되고 있다고 한다.

특징으로는 기본적으로 SMTP 외에도 다양한 전송 방식을 지원하고 있으며, Unicode 인코딩을 지원하여 이모지를 사용하는 것도 가능하다.

지원하는 전송 방식

sendmail – for piping messages to the sendmail command
SES – is a Nodemailer wrapper around aws-sdk to send mail using AWS SES
stream – is just for returning messages, most probably for testing

메일 전송용 Gmail 설정하기

웹 서버에서 유저에게 메일 전송하는데 사용할 Gmail을 먼저 설정하는 방법에 대해 알아보도록 하겠다.

보안 수준이 낮은 앱 엑세스 허용
'Google 계정 관리 -> 보안 -> 보안 수준이 낮은 앱의 액세스' 를 사용으로 변경

내 Google 계정에 대한 액세스 허용
아래 링크에 접속하여 '계속' 클릭
https://accounts.google.com/DisplayUnlockCaptcha

모듈 설치하기

$ npm i nodemailer

먼저, npm을 이용하여 Nodemailer 모듈을 설치한다.

프로젝트로 불러오기

const nodemailer = require('nodemailer');

사용하고자 하는 서버 API에 설치한 모듈을 Require를 통해 모듈을 불러온다.

전송 옵션 설정하기

  let transporter = nodemailer.createTransport({
    // 사용하고자 하는 서비스, gmail계정으로 전송할 예정이기에 'gmail'
    service: 'gmail',
    // host를 gmail로 설정
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    auth: {
      // Gmail 주소 입력, 'testmail@gmail.com'
      user: process.env.NODEMAILER_USER,
      // Gmail 패스워드 입력
      pass: process.env.NODEMAILER_PASS,
    },
  });

createTransport 메소드를 이용하여 옵션을 설정한 후, 전송 기능을 담당하는 객체를 만든다.

각 옵션에 대한 자세한 설명은 아래 공식문서를 참고하면 도움이 된다.
출처: https://nodemailer.com/usage/

메일전송하기

 let info = await transporter.sendMail({
    // 보내는 곳의 이름과, 메일 주소를 입력
    from: `"WDMA Team" <${process.env.NODEMAILER_USER}>`,
    // 받는 곳의 메일 주소를 입력
    to: email,
    // 보내는 메일의 제목을 입력
    subject: 'WDMA Auth Number',
    // 보내는 메일의 내용을 입력
    // text: 일반 text로 작성된 내용
    // html: html로 작성된 내용
    text: generatedAuthNumber,
    html: `<b>${generatedAuthNumber}</b>`,
  });

설정한 전송 옵션을 바탕으로 만들어진 transport 객체에 보내는 곳, 받는 곳, 제목, 내용을 넣어 메일을 전송하는 부분이다.

예제 코드

const main = async () => {
  let transporter = nodemailer.createTransport({
    service: 'gmail',
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    auth: {
      user: process.env.NODEMAILER_USER,
      pass: process.env.NODEMAILER_PASS,
    },
  });

  // send mail with defined transport object
  let info = await transporter.sendMail({
    from: `"WDMA Team" <${process.env.NODEMAILER_USER}>`,
    to: email,
    subject: 'WDMA Auth Number',
    text: generatedAuthNumber,
    html: `<b>${generatedAuthNumber}</b>`,
  });

  console.log('Message sent: %s', info.messageId);
  // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>

  res.status(200).json({
    status: 'Success',
    code: 200,
    message: 'Sent Auth Email',
  });
};

main().catch(console.error);

OAuth

인증을 위한 표준 프로토콜

사용자가 비밀번호를 노출하지 않고 다른 웹 사이트의 자신의 정보를 웹이나 애플리케이션에 접근 권한을 부여할 수 있는 개방형 표준

용어

인증과정

Access Token 에는 만료 기간이 존재하기 때문에 시간이 지나면 토큰이 만료가 될 수 있다.

만약 Access Token 이 만료가 되었다면

Refresh Token 을 이용해 새로운 Access Token 을 요청 하고, Refresh Token 의 검증이 성공 했따면 새로운 Access Token 을 발급받아서 사용 하면 된다.

Nginx

Nginx(엔진엑스)는 동시 접속 처리에 특화된 경량 웹 서버이다.
Apache보다 동작이 단순하고, 전달자 역할만 하여 동시 접속 처리에 특화되어 있다.

Nginx 역할

정적 파일을 처리하는 HTTP 서버 역할

웹 서버의 역할을 HTML, CSS, Javascript, 이미지 같은 정보를 웹 브라우저(Chrome, Firefox 등)에 전송하는 역할을 한다.
(HTTP 프로토콜 준수)

응용 프로그램 서버에 요청을 보내는 리버스 프록시 역할

리버스 프록시 서버로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다.

리버스 프록시 : 클라이언트는 가짜 서버에 요청하면, 프록시 서버(Nginx)가 배후 서버(reverse server, 응용 프로그램 서버)로부터 데이터를 가져오는 역할을 한다.

웹 응용 프로그램 서버에 리버스 프록시(Nginx)를 두는 이유는 요청에 대한 버퍼링이 있기 때문이다. 클라이언트에서 직접 응용 프로그램 서버에 요청하면 프로세스 1개가 응답 대기 상태가 되어야만 한다. 따라서 프록시 서버를 둠으로써 요청을 배분하는 역할을 한다.

프록시 서버를 두면 클라이언트가 실제 서버 정보를 알지 못해 보안면에서도 강하다.

Nginx 동작 방식

Nginx는 비동기 처리 방식(Event-Drive) 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 Concurrency하게 처리할 수 있다.
위의 그림처럼 새로운 요청이 들어와도 새로운 프로세스와 쓰레드를 생성하지 않아 생성 비용이 존재하지 않고, 적은 자원으로도 효율적인 운용이 가능하다.
이러한 Nginx 장점으로 단일 서버에도 동시에 많은 연결 처리할 수 있다.

Nginx 구조

Master Process와 다수의 Worker Process로 구성되어 실행된다.
Master Process는 설정 파일을 읽고, 유효성을 검사 및 Worker Process를 관리한다.
(Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정된다.)

모든 요청은 Worker Process에서 처리한다.
Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용한다.

profile
코린이 입니당 :)

0개의 댓글