...
dotenv 모듈
- dotenv는 환경변수를 .env파일에 저장하고 process.env로 로드하는 의존성 모듈이다.
- dotenv를 사용하는 이유는 우리가 개발을 하는 과정에서 서버주소, 고유 API KEY 값 등 필요한 정보들을 저장을 하게 된다. 그리고 이러한 정보들은 민감한 정보임과 동시에 보안이 이루어져야 하는 정보들이다.
만약 이러한 정보들이 오픈소스(깃허브)에 공개될 경우, 해킹을 당하거나 보안적인 면에서 위험할 수 있다. - 이러한 문제로 dotenv 패키지를 이용하여 환경변수 파일(.env)을 따로 만들어 관리하고, 개발 초기 단계에서 세팅하기를 권고한다.
선행 학습 ✍️
dotenv은 환경변수를 다루는 모듈이다.
따라서 dotenv을 배우기 전에 노드에서 환경변수를 어떻게 다루는지에 대한 학습을 선행으로 한다.
dotenv 사용하는 이유
만일 쿠키 인증에 쓰이는 비밀키 값을 그대로 쓰게 된다면,
소스코드에 그대로 노출되어 있어, 쿠키를 위조해서 로그인 해킹이 발생될 수 있게 된다.
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('passward-key')); // 쿠키들을 서명(암호)하는 키
app.use(session({
resave: false,
saveUninitialized: false,
secret: 'passward-key', // 인증키 사용
cookie: {
httpOnly: true,
secure: false
},
name: 'session-cookie'
}));
뿐만 아니라 예를들어 구글지도 api사용 키같은경우, 구글지도를 호출할때마다 사용요금이 부과되는데, 타인이 api키를 탈취해서 마두 사용하면 문제가 생긴다.
그래서 이러한 키들을 환경변수에 숨겨놓는 것이다.
따라서 다음 처럼, 환경변수명으로 설정을 한다면, 해커는 비밀번호를 알수없게 된다.
dotenv 패키지는 이 환경변수들을 하나의 파일(.env)에 편리하게 관리하게 해주게 한다.
process.env 는 노드 환경변수를 불러오는 객체이고, COOKIE_SECRET은 사용자가 정한 키이다.
설정한 .env 파일을 읽어 process.env로 만든후, COOKIE_SECRET에 키의 value인 'passward-key' 값이 할당되는 식이다.
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'
}));
.env파일 작성
dotenv 라이브러리는 디폴트로 현재 디렉토리에 위치한 .env 파일로 부터 환경 변수를 읽어낸다.
따라서, .env 파일을 생성하고, 그 안에 필요한 환경 변수를 키=값의 포멧으로 나열하도록 하면 된다.
!! 주의
.env파일 작성 할때, 뒤에 ; 세미콜론 쓰면 안된다.
dotenv 사용하기 (환경변수 불러오기)
dotenv 문법은 이용해 환경변수를 불러오는 방법은 여러가지가 있다.
각 환경에 맞춰 사용하자.
CommonJS에서 환경 변수 불러오기 (require)
require("dotenv").config(); // 모듈 불러오기
console.log("COOKE_PASS:", process.env.COOKIE_SECRET);
console.log("DB_PASS:", process.env.DB_PASSWORD);
만약에 .env가 아닌 다른 경로에 있는 파일에 환경 변수를 저장해놨다면 config() 함수를 호출 시 path 옵션을 넘기면 된다.
require("dotenv").config({ path: "/path/to/.env.local" });
ES 모듈에서 환경 변수 불러오기 (import)
// db.js
export const db_host = process.env.DB_HOST;
export const db_user = process.env.DB_USER;
export const db_pass = process.env.DB_PASS;
// env.js
import dotenv from "dotenv";
dotenv.config();
// index.js
import "./env.js"; // dotenv를 임포트하는 모듈을 따로 뺀 이유는, import는 기본적으로 맨 위에 와야하는 특성때문에다.
import { db_host, db_user, db_pass } from "./db.js"; // 환경변수 설정한 모듈 임포트
console.log("DB_HOST:", process.env.DB_HOST);
console.log("DB_USER:", process.env.DB_USER);
console.log("DB_PASS:", process.env.DB_PASS);
console.log({ db_host, db_user, db_pass });
node 커맨드 -r 옵션 사용
본인 프로젝트가 CommonJS 기반인지 ES 모듈 기반인지 신경쓰기 싫다면 node 커맨드를 이용하는 방법도 있다.
애플리케이션을 구동할 때, node 커맨드의 -r 또는 --require 옵션으로 dotenv/config를 넘기는 것이다.
$ node -r dotenv/config index.js
이 방법을 사용하면 dotenv 라이브러리를 코드에 직접 임포트하지 않아도 .env 파일에 저장된 환경 변수가 process.env에 설정된다.
만약에 .env가 아닌 다른 경로에 있는 파일에 환경 변수를 저장해놨다면 DOTENV_CONFIG_PATH 환경 변수를 사용하면 된다.
$ DOTENV_CONFIG_PATH=/path/to/.env.local node -r dotenv/config index.js
Reference
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.