환경변수(Environment Variaable)란 애플리케이션 실행 환경에 따라 달라질 수 있는 설정 값 을 의미한다.😊
소스코드에 민감한 정보를 하드코딩해 사용하게 되면
무단 액세스 또는 데이터 유출과 같은 보안 위험이 발생할 수 있다.👿
Ex ) 외부 서비스 API Key, Secret Key, Token 등 ...
개발(Development), 스테이징(Staging), 운영(Production) 등
각 환경에 맞는 설정을 하는데 사용한다.
Ex) API 엔드포인트, 데이터베이스 URL, 스토리지 URL 등 ...
특정 값을 코드에 하드코딩하지 않고 변수로 관리하여
애플리케이션 자체를 수정하지 않고도 동작을 변경할 수 있게 한다.
Ex) 외부 서비스 API 주소, Base URL, 로그 레벨 등 ...
🚨 주의사항
클라이언트로 전달되는 환경변수는 반드시 공개되어도
괜찮은 값만 사용해야 한다.
Next.js가 구동 환경에 따라 자동으로 생성해주는 환경변수이다.
서버와 클라이언트에서 모두 참조할 수 있다.😁
// next.config.ts
console.log("$$$$ NODE_ENV: ", process.env.NODE_ENV);
// npm run dev
$$$$ NODE_ENV: development
// npm run build
$$$$ NODE_ENV: production
구동 환경별 환경 변수를 정의하는 파일이다.
해당 파일에 정의한 환경변수는 process.env.변수명 으로 로드할 수 있다.
우선순위는
.env.local > .env.${mode} > .env 순으로 높다
.env.local 파일의 우선순위가 가장 높은 이유 💡
개발에 필요한 개인의 로컬 환경변수로 사용되며
팀 공통 설정을 로컬에서 안전하게 덮어쓸 때 사용한다.
그래서.env.local은 기본적으로 .gitignore에 포함된다.
//.env
# 모든 환경에서 기본으로 사용하는 값
NEXT_PUBLIC_API_URL=https://api.env.com
NEXT_PUBLIC_APP_NAME=next-env-example
//.env.development
# 개발 환경에서만 덮어쓰는 값
NEXT_PUBLIC_API_URL=https://api.env.development.com
//.env.local
NEXT_PUBLIC_API_URL=https://api.env.local.com
// src/app/page.tsx
export default function Page() {
console.log('$$$$ API URL:', process.env.NEXT_PUBLIC_API_URL);
console.log('$$$$ APP NAME:', process.env.NEXT_PUBLIC_APP_NAME);
return <div>Check console</div>;
}
// npm run dev
$$$$ API URL: https://api.env.local.com
$$$$ APP NAME: next-env-example
NEXT_PUBLIC_ 접두사의 의미Next.js에서는 기본적으로 서버에서만 환경변수를 참조할 수 있다.
서버와 클라이언트 모두에서 환경변수를 참조하려면 변수명 앞에 NEXT_PUBLIC 를 붙여주어야 한다.😯
next.config.js의 env 옵션에 선언한 값도 process.env로 접근할 수 있다.
...
const nextConfig = {
env: {
VERSION: "1.2.1.5",
BUILD_TIME: new Date().toISOString(),
},
};
export default nextConfig;
다만, 이 방식은 모든 값이 클라이언트 번들에 포함되며,
NEXT_PUBLIC_ 접두사와 상관없이 노출된다. 🚨
따라서 보안이 필요한 환경변수 관리 용도로는 적합하지 않으며,
빌드 설정과 관련된 상수 값을 전달할 때만 제한적으로 사용하는 것이 좋다.👍
환경변수는 단순한 설정 값처럼 보이지만,
보안, 배포, 유지보수와 깊게 연결된 중요한 요소다.
Next.js의 환경변수 규칙을 정확히 이해하고 사용한다면
보다 안전하고 확장성 있는 프로젝트를 만들 수 있다.