해당 글은 Node.js 교과서의 내용을 요약, 정리한 글입니다.
//app.js
if(process.env.NODE_ENV === 'production'){
app.use(morgan('combined'));
} else {
app.use(morgan('dev'));
}
process.env.NODE_ENV는 배포 환경인지 개발 환경인지 판단할 수 있는 환경 변수이다.
combined모드는 dev 모드에 비해 더 많은 사용자 정보를 남기며, 추후 버그를 수정할 때 더 유용하게 사용할 수 있다.
//app.js
const sessionOption = {
resave: false,
saveUninitialized:false,
secret:process.env.COOKIE_SECRET,
cookie:{
httpOnly: true,
secure: false,
},
};
if(process.env.NODE_ENV === 'production'){
sessionOption.proxy = true;
}
app.use(session(sessionOption));
require(dotenv').config();
module.exports = {
development: {
username: 'root',
password: process.env.SEQUELIZE_PASSWORD,
database: 'nodebird',
host: '127.0.0.1',
dialect: 'mysql',
},
test: {
username: 'root',
password: process.env.SEQUELIZE_PASSWORD,
database: 'nodebird_test',
host: '127.0.0.1',
dialect: 'mysql',
},
production: {
username: 'root',
password: process.env.SEQUELIZE_PASSWORD,
database: 'nodebird',
host: '127.0.0.1',
dialect: 'mysql',
logging:false,
}
};
js 파일이므로 dotenv를 사용할 수 있다.
username이나 host 속성은 숨기는 것이 좋다.
//.env
SEQUELIZE_PASSWORD=데이터베이스 비밀번호
cross-env 패키지를 사용하면 동적으로 process.env를 사용할 수 있다.
$npm i cross-env
//package.json
{
...
"scripts":{
"start":"cross-env NODE_ENV=production PORT=80 node server",
"dev":"nodemon server",
"test":"jest"
}
...
}
사람들이 실수로 cross-env 대신에 crossenv를 설치해서 발생한 사건
crossenv는 .env파일에 들어 있는 키들을 해커에게 전송하는 악성 패키지였음.
sanitize-html은 XSS(Cross Site Scripting)
csurf는 CSRF(Cross Site Request Forgery)공격을 막기 위한 패키지이다.
$npm i sanitize-html
$npm i csurf
const sanitizeHtml = require('sanitize-html');
sanitizeHtml(내용);
사용자가 업로드한 HTML을 sanitize-html 함수로 감싸면 허용하지 않는 태그나 스크립트가 제거된다.
const csrf = require('csurf');
const csrfProtection = csrf({cookie:true});
app.get('/form', csrfProtection,(req,res)=>{
res.render('csrf',{csrfToken:req.csrfToken()});
});
app.post('/form',csrfProtection, (req,res)=>{
res.send('ok');
});
form 같은 것을 렌더링할 때 CSRF토큰을 같이 제공한다.
현재 cookie를 사용하는 것으로 옵션을 설정했으므로 cookie-parser 패키지도 연결되어 있어야 한다.
개발할 때 nodemon을 쓴다면 배포할 때는 pm2를 쓴다는 말이 있을 정도로 유용한 패키지.
가장 큰 기능은 서버가 에러로 인해 꺼졌을 때 서버를 다시 켜주는 일이다.
또한, 멀티 프로세싱을 지원하여 노드 프로세스를 한개 이상으로 늘릴 수 있다.
하지만 멀티 스레딩이 아니므로 메모리 자원을 공유하지는 못한다. 이를 위해 레디스 같은 서비스를 이용한다.
$npm i pm2
//package.json
{
...
"scripts":{
"start":"cross-env NODE_ENV=production PORT=80 pm2 start server.js",
...
}
pm2가 서버를 백그라운드로 돌리므로 명령어를 입력할 수 있다.
$npx pm2 list
백그라운드에서 돌고 있는 노드 프로세스를 확인한다.
npx pm2 kill
npx pm2 reload all
등의 명령어가 있다.
//package.json
{
...
"scripts":{
"start":"cross-env NODE_ENV=production PORT=80 pm2 start server.js -i 0",
...
}
-i 뒤에 써 있는 숫자 만큼 프로세스를 생성한다는 뜻이다. 0은 현재 CPU코어 개수만큼 프로세스를 생성하겠다는 뜻이고, -1은 CPU코어 개수보다 한 개 덜 생성하겠다는 뜻이다.
npx pm2 monit
명령어로 현재 프로세스를 모니터링할 수 있다.
실제 서버를 운영할 때 로그를 남기는 패키지이다.
$npm i winston
서버의 각종 취약점들을 보완해주는 패키지이다.
//app.js
const helmet = require('helmet');
const hpp = require('hpp');
app.use(helmet({contentSecurityPolicy:false}));
app.use(hpp());
멀티 프로세스 간 세션 공유를 위해 레디스와 익스프레스를 연결해주는 패키지이다.
$npm i redis connect-redis
레디스를 사용하려면 레디스 데이터베이스를 설치해야 한다.
서버에 직접 설치할 수도 있지만 호스팅해주는 서비스를 쓰는 것이 편리하다.
redislabs
노드 버전을 업데이트하기 위한 패키지이다.
윈도우에서는 nvm을 사용하고 리눅스나 맥에서는 n을 사용한다.
여기까지 따라오실 정도면 기본적인 깃 사용법은 아실 거라 믿습니다...
이 책에서도 자세히 알려주지는 않으니 제 블로그 git 교과서 편을 참고해주세요.
aws를 생성하고 ssh키를 이용하여 접속하고 실행하는 방법입니다.
구글 클라우드 플랫폼입니다.aws와 상당히 유사합니다.