먼저 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 |