- Preparing for Deployment
- Deployment Steps & Config
- Security
- 우리가 만들었던 Backend 서버는Node Framwork인 Express로 구성했습니다.
- 이 서버는 대기하다가 요청이 들어오면 응답을 주면 됩니다.
- 웹 서버에서도 마찬가지로 npm start를 하고 들어오는 요청을 기다리는 방식을 사용하면 됩니다.
- Use Environment Variables : 코드에서 하드코딩을 피한다.
- Use Production API Keys : 테스트 API 키를 사용하지 않는다.
- Reduce Error Output Details : 유저에게 자세한 에러 내용을 보내지 않는다.
- Set Secure Response Headers : 보안에 필요한 헤더를 구현하자.
주로 클라우드에서 관리해주는 것들
- Add Asset Compression : 사용자에게 주는 데이터를 최소로 하자.
- Configure Logging : 서버에서 일어나는 일들을 항상 관리하자.
- Use SSL/TLS : 주고받는 데이터를 암호화 해서 보내자.
- 여기서는 이전에 MVC 패턴으로 만들었던 Node Shop(깃허브에 업로드한 project1-2)프로젝트를 사용하도록 하겠습니다.
- 기존에 3자 패키지를 사용할때 API 키를 가져왔습니다. 이 키에는 비밀번호가 들어있어서 웹 서버에 올리게 되면 보안 문제가 발생합니다.
- 기존에 사용한 타사 패키지 API는 Stripe(메일 서비스), MongoDB(DB 서비스) 입니다.
- 따라서 이 키를 서버에 배포되지 않도록 관리하도록 하겠습니다.
- 또한 app.js에서 대기하는 포트를 지정해줬습니다. 이 포트는 클라우드에서 자동으로 설정하므로 포트도 환경변수로 설정해 줍시다.
-
app.js
-
mongoDB URL 환경변수로 수정하기
process는 노드에서 제공하는 변수입니다.const MONGODB_URI = `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@nodeshop-s8bpd.gcp.mongodb.net/${MONGO_DEFAULT_DATABASE}?retryWrites=true&w=majority`;
-
port 설정하기
mongoose .connect(MONGODB_URI) .then((result) => { // 클라우드가 자동으로 설정해주거나 3000 port app.listen(process.env.PORT || 3000); }) .catch((err) => { console.log(err); });
-
-
controllers/shop.js
-
stripe Key 환경변수로 설정하기
const stripe = require('stripe')(process.env.STRIPE_KEY);
-
-
$npm i --save helmet -
app.js
-
helmet 패키지가 모든 요청에 안전한 응답을 하기 위해 app.js에 적용해준다.
const helmet = require('helmet'); app.use(helmet());
-
-
header 확인
- HELMET docs : https://helmetjs.github.io/
-
npm i --save compression -
app.js
-
미들웨어로 설정하기
const compresison = require('compression') app.use(compression());
-
-
기능
- 해당 패키지를 사용하면 CSS, JavaScript 파일이 압축해서 Client에게 전달 됩니다.
- 그렇기 때문에 조금 더 나은 사용자 경험을 제공합니다.
- 대부분의 호스팅 서버에서는 제공하는 기능이므로 왠만하면 사용할 일이 없습니다.
-
$npm i --save morgan -
app.js
-
morgan 미들웨어로 설정하기
const morgan = require('morgan'); app.use(morgan('combined'));
-
Log Data 파일에 저장하기
const fs = require('fs'); // {flags : 'a'} -> append 옵션: 덮어쓰지 않고 새로 쓰겠어 const accessLogStream = fs.createWriteStream( path.join(__dirname, 'access.log'), { flags: 'a' } );
-
-
다른 방법으로 로깅하기
- 우리가 아는 로깅방법 중 하나는
console.log()를 사용하는 방법이다. 참고 링크 : https://blog.risingstack.com/node-js-logging-tutorial/
- 우리가 아는 로깅방법 중 하나는
- TLS가 SSL의 최신 버전이고 보면 됩니다.
- 이 기술은 클라이언트에서 보낸 데이터를 보호하는 것입니다.
- 보호하는 방법은 SST/TLS 암호화 라고 합니다.
- 암호화를 위해 Public key와 Private Key를 사용합니다.
- OpenSSL은 2013년도에 문제점이 발견되어 TLS로 대체 되었습니다.
- https://slproweb.com/products/Win32OpenSSL.html에서 Win64 OpenSSL v1.1.1f 설치하기
- AWS, Heroku는 클라우드에 코드를 올리면 SSL Compression, Logging 등 다양한 기능을 자동으로 제공합니다.
- 우리느 Heroku를 사용해봅시다.
-
https://id.heroku.com/login 에서 로그인하고
create App하기 -
Deploy에서 Deploy Method를 Heroku Git으로 설정하기
- Heroku CLI 설치하기
-
heroku 사용하기
$ cd my-project/ $ git init $ heroku git:remote -a node-shop-test1 -
package.json
-
egines 추가해주기
"engines": { "node": "10.9.0" },
-
-
Procfile
- 루트 폴더에 Procfile 생성하기 : 어떤 언어인지 명시하기
web: node app.js
- 루트 폴더에 Procfile 생성하기 : 어떤 언어인지 명시하기
-
.gitignore- node_modules를 추가해줍니다. Heroku에는 이미 Package가 설정 되어 있습니다..
-
Heroku 사이트에서 환경변수 설정하기
-
git 업로드하기
-
준비가 되면 코드를 업로드 합니다.
$ git add. $ git commit -m "prepared for deployment" $ git push heroku master
-
-
Deploy 확인하기
- 앱을 열어보니 Error가 발생했습니다.
- Error를 확인하기 위해 Bash에서
heroku logs를 입력하면 log를 확인할 수 있습니다.
-
mongoDB에 접근할 수 있도록 Atlas 설정하기
- heroku 서버는 IP 가 동적을 할당 되어 있기 때문에 Atlas에 모든 IP가 접근할 수 있도록 열어줍니다.
- 이렇게 설정해도 비밀번호가 필요하기 때문에 안전합니다. (그전 보다는 위험)
- Heroku는 일반적으로 AWS에 가격이 비쌉니다. 따라서! 개인 프로젝트에만 사용하도록 하고 트래픽이 많이 발생하는 서버를 제작할 때는 AWS 서비스를 사용합시다.



