본문 바로가기

Programming/Node.js

7. 익스프레스 (1) - 미들웨어 [2] : 다양한 미들웨어 적용하기

node js logo image

 

 

 

 

미들웨어에 대한 기본적인 사용방법을 살펴보았으니, 이제 다양한 미들웨어를 설치하고 각각의 패키지에 대해서 살펴보겠습니다. 여기서 살펴볼 패키지는 morgan, cookie-parser- express-session, dotenv입니다. 참고로 dotenv 패키지는 미들웨어는 아니고 process.env를 관리하기 위한 패키지 입니다.

 

learn-express 폴더에서 다음과 같이 패키지를 설치합니다. 

$ npm i morgan cookie-parser express-session dotenv

 

 

이제 app.js를 수정하고, .env(닷env, 확장자 없으며 .env가 파일명) 파일을 생성합니다. 

 

 

[app.js]

 

const express =require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname), 'public'));
app.use(express.json());
app.use(express.urlencoded( {extended: false} ));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
        httpOnly: true,
        secure: false,
    },
    name: 'session-cookie',
}));

app.use((req, res, next) => {
    console.log('모든 요청에 실행됨');
    next();
});

app.get('/', (req, res, next) => {
    console.log('GET / 요청에서만 실행됨');
    next();
}, (req, res) => {
    throw new Error('에러는 에러 처리용 미들웨어로 전달');
});

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기');
});

 

 

일단 설치한 패키지들을 불러오고, app.use에 전부 연결합니다. 이 때, 우리가 앞선 아티클에서 배웠던 req, res, next 같은

요소들이 없고 next도 없습니다. 이는 req, res, next가 미들웨어 내부에 이미 들어있기 때문이라고 생각해주세요. next 역시 내부적으로 호출하기 때문에 알아서 다음으로 넘어가게 됩니다. 

 

 

 

 

[.env]

 

COOKIE_SECRET=cookiesecret

 

dotenv 패키지는, 우리가 위에서 만든 '.env' 파일을 읽어서 process.env로 만들어줍니다. 말 그대로 dot(점) ~ env인 셈이죠. process.env.COOKIE_SECRET에 cookiesecret이라는 값이 할당됩니다. K=V 형식이죠?

 

process.env라는 파일을 별도로 관리하는 이유는, 보안과 편의성 두 가지 측면이 있습니다. 중요 비밀키들이 소스 코드에 직접 적혀서 관리되면, 소스 코드 유출 시에 키 값이 함께 유출됩니다. 하지만, '.env' 별도 파일에 비밀 키를 작성하고 이를 dotenv 패키지로 로드하여 코드에서 사용하면 유출 리스크를 줄일 수 있습니다. '.env'파일만 유출되지 않으면 "cookiesecret"이라는 비밀 키의 값을 보호할 수 있으니까요.