[NODE.JS] 비밀 정보 보호하기 (FEAT. PROCESS.ENV.NODE_ENV & .GITIGNORE)

node와 MongoDB를 연결했던 날로 돌아가보자. 두 아이를 연결해주기 위해 MongoDB에서 발급받았던 키와 그 안에 본인이 직접 설정했던 비밀번호를 넣어주어야했다. <비밀번호!!> 이 자리에 말이다.

이 코드는 github에 올린다면 어떻게 될까? 누구나 나의 MongoDB 비밀번호를 알 수 있게된다. 그렇기 때문에 외부에 노출되지 않아야 하는 코드가 있다면 잘 숨겨줄 방법이 필요하다.

// index.js

...

// 몽구스 연결
const mongoose = require('mongoose');
mongoose
  .connect('mongodb+srv://devCecy:<비밀번호!!>@devcecy.dprgf.mongodb.net/myFirstDatabase?retryWrites=true&w=majority', {
    // useNewUrlParser: true,
    // useUnifiedTopology: true,
    // useCreateIndex: true,
    // useFindAndModify: false,
  })
  .then(() => console.log('MongoDB conected'))
  .catch((err) => {
    console.log(err);
  });

...

개발환경과 배포환경 두가지 경우로 나눠 비밀정보를 숨겨주려고 한다. 오늘은 개발환경을 위해 비밀정보를 숨겨보자.

root 디렉토리에 config라는 폴더를 생성하고, 그 안에 development.js, key.js, production.js 3가지 파일을 생성했다.

development.js 파일에는 개발환경을 위한 비밀정보를 작성해 줄것이고, production.js파일에는 배포환경을 위한 비밀정보를 작성해 줄것이다. 그리고 key.js 파일에서 현재 어떤환경에 있는지 파악해 그에 맞는 환경을 위한 코드로 분기를 나눠줄 것이다.

자, 이제 숨겨주고 싶은 아래의 URI를 뽑아와보자. 물론 실제 코드에서는 <비밀번호!!> 이 자리에 실제 비밀번호가 들어있을 것이다.

'mongodb+srv://devCecy:<비밀번호!!>@devcecy.dprgf.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'

먼저, 개발환경을 위한 development.js 파일이다.

다른파일에서도 사용할 수 있도록 module.export로 감싸준뒤, 변수 mongoURI에 숨기고 싶은 정보를 넣어주었다.

// development.js

module.exports = {
  mongoURI:
    'mongodb+srv://devCecy:<비밀번호!!>@devcecy.dprgf.mongodb.net/myFirstDatabase?retryWrites=true&w=majority',
};

production.js파일도 개발환경과 마찬가지로 바깥 파일에서 사용할 수 있도록 export모듈로 감사준 후, 그 안에는 process.env.MONGO_URI 라는 환경변수를 넣어주었다.

배포환경는 개발환경과 달리 실제 배포 후에도 비밀정보를 사용해야 하므로 Heroku라는 사이트에 MONGO_URI 라는 변수에 숨기고 싶은 코드를 넣어주어 사용해 주었다. 나는 아직 배포단계가 아니여서 실제 Heroku라는 사이트는 이용하지 않고 코드만 작성해 주었다. (웹 환경에서도 환경변수를 사용하여 개발,테스트,배포 환경에 따라 파일을 작성해 정보를 숨겨주곤 하는데, 따로 사이트를 사용하진 않았다. 그래서 이 부분은 좀 더 서칭을 해보려고한다. )

// production.js

module.exports = {
  mongoURI: process.env.MONGO_URI,
};

key.js 파일에는 어떤 환경에 있는지 파악해 분기를 나눠주는 코드를 작성한다.

process.env.NODE_ENV 는 환경변수로 실제 서버를 실행했을때 개발환경이면 development, 배포환경이면 production 이 찍히는 걸 확인해볼 수 있다. 그걸 이용해서 아래와 같이 분기를 해주었다. (지금은 process.env.NODE_ENV를 찍어보면 undefined가 나오는데 그래서 분기가 else로 빠져 개발환경 코드를 사용하게 된다. )

if (process.env.NODE_ENV === 'production') { // 배포환경이면, 
  module.exports = require('./production'); // production.js 파일 코드를 사용하고,
} else { // 배포환경 이외의 환경이라면 (현재는 배포,개발환경 2가지이기때문에!)
  module.exports = require('./development'); // development.js파일 코드를 사용한다. 
}

분기를 해주었으므로, 다시 index.js 파일로 돌아와 비밀정보였던 URI자리에 방금 만든 key.js 코드를 넣어주자.

./config/key을 require로 가져온 후, 원래 URI가 있던 자리에 넣어주면 된다. key.js파일은 {}객체를 export하고 있는데, 실제로 사용하고 싶은건 그 객체안의 mongoURI이기 때문에 config.mongoURI로 가져오면 된다.

...

// development와 production 분기
const config = require('./config/key');

...

// 몽구스 연결
const mongoose = require('mongoose');
mongoose
  .connect(config.mongoURI, {
    // useNewUrlParser: true,
    // useUnifiedTopology: true,
    // useCreateIndex: true,
    // useFindAndModify: false,
  })
  .then(() => console.log('MongoDB conected'))
  .catch((err) => {
    console.log(err);
  });

마지막으로, 개발환경을 위한 development.js파일에는 여전히 비밀정보들이 들어있다. 그러므로 .gitignore 파일에 development.js파일을 넣어주면 github에 코드가 올리가지 않게 된다.

// .gitignore

node_modules

development.js 

John Ahn님의 유튜브 강의를 통해 공부하며 글을 작성했습니다😊

좋은 웹페이지 즐겨찾기