iBetter Books
수정

Ch 01. 환경별 설정 분리 (.env, runtimeConfig)

개발할 때 쓰는 데이터베이스 주소와 실제 서비스에서 쓰는 주소가 같으면 큰일입니다. 개발자가 테스트하다가 실서비스 데이터를 날릴 수도 있고, JWT 비밀키가 "test-secret" 그대로 운영에 올라가면 보안 사고로 이어집니다. 환경별 설정 분리는 선택이 아니라 필수입니다.

.env 파일 우선순위

Nuxt는 다음 순서로 .env 파일을 읽습니다. 나중에 읽은 값이 앞의 값을 덮어씁니다.

.env            → 기본값 (모든 환경)
.env.local      → 로컬 개발자 개인 설정 (git 제외)
.env.development → 개발 환경 전용
.env.production  → 운영 환경 전용

.env.local은 반드시 .gitignore에 추가해야 합니다. 개인 API 키나 로컬 DB 접속 정보를 여기에 보관합니다.

runtimeConfig와 NUXT_ 접두사

nuxt.config.ts에서 runtimeConfig를 정의하면, NUXT_ 접두사가 붙은 환경변수가 자동으로 매핑됩니다.

// nuxt.config.tsexport default defineNuxtConfig({  runtimeConfig: {    jwtSecret: 'dev-secret',          // NUXT_JWT_SECRET으로 덮어씀    databaseUrl: '',                   // NUXT_DATABASE_URL로 덮어씀    public: {      appName: '내 블로그'             // NUXT_PUBLIC_APP_NAME으로 덮어씀    }  }})

public 안에 있는 값은 클라이언트 브라우저에도 노출됩니다. 비밀 키는 절대 public 안에 넣지 않습니다.

실전 .env.production 예시

DATABASE_URL="postgresql://user:pass@db:5432/blog"
NUXT_JWT_SECRET="production-secret-key"
NUXT_PUBLIC_APP_NAME="내 블로그"

배포 환경에서 환경변수 주입

Vercel 대시보드. Project Settings > Environment Variables 메뉴에서 키와 값을 입력합니다. 재배포 시 자동으로 반영됩니다.

Docker -e 옵션. docker compose.ymlenvironment 섹션에 직접 기입하거나, 호스트의 .env 파일을 env_file로 주입합니다.

services:  app:    env_file:      - .env.production

서버 코드에서는 useRuntimeConfig()로 값을 읽습니다.

// server/api/auth/login.post.tsconst config = useRuntimeConfig()const secret = config.jwtSecret   // 서버 전용

로컬 개발 시에는 .env.local을 만들어 개인 설정을 기입하고 git에 올리지 않습니다. 이것만 지켜도 많은 보안 사고를 예방할 수 있습니다.

Ch 01. 환경별 설정 분리 (.env, runtimeConfig) — 실전 Nuxt.js | iBetter Books