Node.js/Node.js Doc

[Node.js] dotenv로 환경변수 (process.env)관리하기

장일규 2022. 5. 11. 08:33

dotenv란?

개발 중에 필요한 API_KEY, SECRET_KEY, 포트 등 보안에 신경 써야 할 정보들을 소스코드 로직에 그대로 작성하거나, 오픈소스와 같은 github 등 외부에 노출되면 불특정 사람들이 사용을 할 수 있게 됩니다.

따라서 이번 시간에는 .env라는 외부 파일을 만들어 중요한 정보를 환경변수로 저장하여 관리할 수 있는 dotenv 라이브러리에 대해서 공부해 보겠습니다.

자세한 설치 방법은 npm dotenv에서 확인할 수 있습니다.

크로스 플랫폼 환경변수 설정

Node.js는 크로스 플랫폼입니다. Windows, OSX, Linux 플랫폼에서 실행이 가능합니다.

개발을 혼자 하기 보다는 여러 개발자들과 Github/SVN을 통해 형상관리를 하면서 프로젝트를 진행 시, 개발자마다 사용하는 컴퓨터에 OS가 다를 수 있습니다.

OS마다 환경 변수를 설정하는 방법이 다르기 때문에 OS에 맞는 환경 변수를 설정해 주어야 합니다.

어떤 OS에서 개발해도 동일한 환경 변수를 생성하고 사용할 수 있게 된다.
dotenv 라이브러리를 활용해보자.

dotenv특징

  • dotdenv는 환경변수를 .env파일에 저장 후 process. env로 로드하는 의존성 모듈입니다.

dotenv 라이브러리 설치

# npm

$ npm install dotenv --save

.env 파일 생성

1. 루트 경로에 환경 변수를 관리하는 .env 파일을 만들어 줍니다.

.env 파일 생성

2. .env파일 안에 필요한 환경 변수들을 다음과 같이 키=값의 형식으로 나열합니다.

#.env

S3_BUCKET="YOURS3BUCKET"
SECRET_KEY="YOURSECRETKEYGOESHERE"

위와 같이 .env에 환경변수들을 저장해놓으면 dotenv라이브러리를 활용해 process.env에 설정할 수 있습니다.

require('dotenv').config()

//import dotenv from 'dotenv'
require('dotenv').config();
  • .env를 사용하고자 하는 파일 안에 dotenv모듈을 가져온다.
  • dotenv.config({ path: 경로 }); 직접 .env에 경로를 지정해줄 수 있다.
  • dotenv.config()는 현재 디렉토리에 .env파일을 자동으로 인식해 세팅하여 환경변수를 세팅한다.

활용 예

MongoDB 연동하기 에서 다음과 같이 DB 커넥션 코드를 작성했습니다.

 

이 문자열에는 몽고DB에 접근할 수 있는 아이디와 패스워드, DB명 등이 적혀있습니다.

해당 정보를 Git-hub(오픈소스)등 취약한 곳에 올리게 되면 해커가 공격할 수 있는 이슈가 있습니다.

따라서, 외부 파일인 .env에 환경변수에 키=값형태로 정의하여 사용합니다.

 

📁 .env

다음과 같이 PORT MONGO_URI 변수를  키값으로 설정하고, 값을 대입합니다.

 

# .env
PORT=5000
MONGO_URI = mongodb+srv://<id>:<password>@...

📁 app.js

 

# app.js

require('dotenv').config(); // 현재 디렉토리에 .env파일을 자동으로 인식해 세팅하여 환경변수를 세팅한다.

// db
const connectDB = require('./db/connect'); 

// start server
const port = process.env.PORT || 3000; // 서버 포트 번호, .env에 PORT값이 있으면 전자, 없을 경우 후자

const start = async() => {
    try {
        await connectDB(process.env.MONGO_URI); // connectDB함수에 MONGO_URI 값을 세팅

        app.listen(port, () => {
            console.log(`server is listening on port ${port}`);
        });
    } catch (e) {
        console.log(`error has occured ${e}`);
    }
}