본문 바로가기

인증 보안

im-sprint-auth-token에서 server-token/index.js파일 분석 - (1)

먼저 server-token / index.js 을 살펴보자.

require("dotenv").config(); //'dotenv'모듈 불러오기 + config내장함수
//'dotenv'모듈을 불러오면 환경변수를 사용할 수 있게 된다.
//환경변수 사용 시, process.env.뒤에 변수 적으면 된다.

const fs = require("fs");
const https = require("https");
const cors = require("cors");
const cookieParser = require("cookie-parser");

const express = require("express");
const app = express();

const controllers = require("./controllers");

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(
  cors({
    origin: ["https://localhost:3000"],
    credentials: true,
    methods: ["GET", "POST", "OPTIONS"],
  })
);
app.use(cookieParser());
app.post("/login", controllers.login); //endpoint: /login --> controllers폴더의 login.js파일로 간다.
app.get("/accesstokenrequest", controllers.accessTokenRequest);//endpoint: /accesstokenrequest --> controllers폴더의 accesstokenrequest.js파일로 간다.
app.get("/refreshtokenrequest", controllers.refreshTokenRequest); //endpoint: /refreshtokenrequest --> controllers폴더의 refreshtokenrequest.js파일로 간다.

const HTTPS_PORT = process.env.HTTPS_PORT || 4000;

// 인증서 파일들이 존재하는 경우에만 https 프로토콜을 사용하는 서버를 실행합니다.
// 만약 인증서 파일이 존재하지 않는경우, http 프로토콜을 사용하는 서버를 실행합니다.
// 파일 존재여부를 확인하는 폴더는 서버 폴더의 package.json이 위치한 곳입니다.
let server;
if (fs.existsSync("./key.pem") && fs.existsSync("./cert.pem")) {
  const privateKey = fs.readFileSync(__dirname + "/key.pem", "utf8");
  const certificate = fs.readFileSync(__dirname + "/cert.pem", "utf8");
  const credentials = { key: privateKey, cert: certificate };

  server = https.createServer(credentials, app);
  server.listen(HTTPS_PORT, () => console.log("server runnning"));
} else {
  server = app.listen(HTTPS_PORT);
}
module.exports = server;

 

내가 생각했을때 index.js에서 눈여겨 봐야할 건 

1> 첫번째, cors 미들웨어.

특정 URL 및 method(여기서는 "https://localhost:3000", method는 'GET', 'POST', 'OPTIONS')만 허용하고 싶다면 다음과 같이 options을 추가해준다. 

app.use(
  cors({
    origin: ["https://localhost:3000"],
    credentials: true,
    methods: ["GET", "POST", "OPTIONS"],
  })
);

 

 

2> 라우팅

엔드포인트가 무엇이냐에 따라 라우팅 되는 폴더가 다르다.

POST요청의 '/login'일 경우, controllers 폴더의 login.js파일로,

GET요청의 '/accesstokenrequest'일 경우, controllers 폴더의 accesstokenrequest.js로

GET요청의 '/refreshtokenrequest'일 경우, controllers 폴더의 refreshtokenrequest.js로 라우팅된다.

app.post("/login", controllers.login);
app.get("/accesstokenrequest", controllers.accessTokenRequest);
app.get("/refreshtokenrequest", controllers.refreshTokenRequest);

 

 

3> https 프로토콜을 사용하는 서버 실행

인증서와 개인키의 여부로 https프로토콜을 사용할지 http프로토콜을 사용할지 정한다.

let server;
if (fs.existsSync("./key.pem") && fs.existsSync("./cert.pem")) {
  const privateKey = fs.readFileSync(__dirname + "/key.pem", "utf8");
  const certificate = fs.readFileSync(__dirname + "/cert.pem", "utf8");
  const credentials = { key: privateKey, cert: certificate };
//인증서에 해당하는 'cert.pem' 파일 & 개인키에 해당하는 'key.pem'파일이 있으면
  server = https.createServer(credentials, app); // https 프로토콜로 서버실행
  server.listen(HTTPS_PORT, () => console.log("server runnning"));
} else { //그렇지 않으면,
  server = app.listen(HTTPS_PORT); //그냥 http프로토콜로 서버 실행
}

 

 

 

**모든 코드의 출처는 '코드스테이츠'입니다.

'인증 보안' 카테고리의 다른 글

Cookie란?  (0) 2021.11.26
Hashing, 그리고 Salt값  (0) 2021.11.26