frontend

Next.js 환경 변수 NEXT_PUBLIC 접두사 역할

KUKJIN LEE
KUKJIN LEE
2025년 6월 13일
156

NEXT_PUBLIC 접두사를 붙이면 변수의 접근 범위가 완전히 달라집니다. 이 차이점을 이해하는 것이 안전하고 효율적인 Next.js 애플리케이션을 구축하는 데 중요합니다.

 

NEXT_PUBLIC 접두사가 없는 환경 변수 (서버 전용)

NEXT_PUBLIC 접두사 없이 선언된 환경 변수는 서버 측(Server-Side)에서만 접근이 가능합니다.

  • 접근 범위: 서버 측 렌더링(getServerSideProps), 정적 사이트 생성(getStaticProps), API 라우트 (app/api 또는 pages/api 폴더 내부) 등 Node.js가 실행되는 환경에서만 process.env.변수명으로 접근할 수 있습니다.

  • 처리 방식: 이 변수들은 클라이언트로 전송되는 JavaScript 번들에 포함되지 않습니다. 오직 서버가 코드를 실행하는 시점에만 메모리에 로드되어 사용됩니다.

  • 주요 용도: 데이터베이스 접속 정보, 외부 API의 비밀 키, 내부 서비스의 인증 토큰 등 민감하거나 클라이언트에 노출되어서는 안 되는 값을 저장하는 데 사용됩니다.

    • DATABASE_URL

    • API_SECRET_KEY

    • CMS_API_TOKEN

  • 보안: 클라이언트에 절대 노출되지 않으므로, 애플리케이션의 핵심 비밀 정보를 안전하게 관리할 수 있습니다.

 

NEXT_PUBLIC 접두사가 있는 환경 변수 (클라이언트 노출)

NEXT_PUBLIC 접두사를 붙여 선언한 환경 변수는 서버와 클라이언트(브라우저) 양쪽에서 모두 접근이 가능합니다.

  • 접근 범위: 서버 측 코드는 물론, 브라우저에서 실행되는 클라이언트 측 JavaScript 코드(React 컴포넌트 등)에서도 process.env.NEXT_PUBLIC_변수명으로 접근할 수 있습니다.

  • 처리 방식: Next.js는 빌드 시점에 NEXT_PUBLIC으로 시작하는 모든 환경 변수의 값을 JavaScript 코드에 그대로 삽입(inlining)합니다. 즉, 최종적으로 생성된 JS 파일 안에 변수 값이 텍스트로 포함됩니다.

  • 주요 용도: 클라이언트 측 코드에서 알아야 하는 공개적인 정보를 저장하는 데 사용됩니다.

    • NEXT_PUBLIC_API_BASE_URL (프론트엔드에서 호출할 백엔드 API의 기본 주소)

    • NEXT_PUBLIC_FIREBASE_API_KEY (Firebase 웹 클라이언트 설정용 공개 키)

    • NEXT_PUBLIC_GOOGLE_ANALYTICS_ID (구글 애널리틱스 추적 ID)

  • 보안 (매우 중요): JavaScript 번들에 값이 포함되므로, 브라우저의 개발자 도구를 통해 누구나 이 값을 볼 수 있습니다. 따라서 절대 민감한 정보(비밀 키, 암호 등)를 담아서는 안 됩니다.

 

핵심 차이점 요약

구분

NEXT_PUBLIC 미사용 (예: DB_HOST)

NEXT_PUBLIC_ 사용 (예: NEXT_PUBLIC_API_URL)

접근 범위

서버 측 전용 (Node.js 환경)

서버 및 클라이언트(브라우저)

처리 방식

서버 런타임에만 사용

빌드 시점에 JS 번들에 값이 인라인됨

주요 용도

비밀 키, DB 접속 정보, 내부 인증 토큰

공개 API 주소, 기능 플래그, 외부 서비스의 공개 키

보안

높음 (클라이언트에 노출되지 않음)

주의 필요 (누구나 볼 수 있는 공개 정보만 저장)

 

언제 무엇을 사용해야 할까? 

"사용자와 상호작용을 하는가?"

  • 아니오 (No): 브라우저가 알 필요 없는 데이터를 가져오거나 처리한다면, NEXT_PUBLIC 접두사를 붙이지 마세요.

    • 예를 들면 비밀번호

  • 예 (Yes): 사용자의 상호작용에 따라 클라이언트 컴포넌트에서 직접 API를 호출해야 한다면, NEXT_PUBLIC 접두사를 붙여야 합니다.

    • 예를들면 사용자가 버튼을 클릭했을 때 사용자 정보를 가져오는 경우 ${process.env.NEXT_PUBLIC_API_URL}/users

# 서버에서만 접근 가능
DATABASE_PASSWORD=12345678

# 클라이언트에서도 접근 가능
NEXT_PUBLIC_API_URL=https://api.test.com

 

"그럼 전부 다 NEXT_PUBLIC 안 붙이면 되는 거 아닌가?"

클라이언트에서 사용해야 하는 값이라면 반드시 NEXT_PUBLIC을 붙여야 합니다.

 

관련 글

TypeScript any 린트 에러(no-explicit-any) 근본적으로 해결하기

TypeScript 프로젝트에서 @typescript-eslint/no-explicit-any 린트 에러는 단순 규칙 비활성화로 해결할 문제가 아닙니다. 눈 앞 문제는 해결할 수 있지만, TypeScript를 사용하는 가장 중요한 이유를 위배하게 됩니다. any 타입은...

2025년 7월 23일269

JSP 주석, 아직도 `` 쓰시나요? 올바른 사용법

코드를 작성하다 보면 주석을 남기는 경우가 많습니다. 하지만 JSP 환경에서 어떤 주석을 사용하냐에 따라 보안 수준과 성능 이 크게 달라집니다. 표준 주석: 서버 사이드 주석 <%-- --%> JSP 페이지 내 개발 관련 주석은 <%-- --%> 를 사용하는게 좋습니다...

2025년 7월 9일144

쉽게 만드는 React Tab 라이브러리 react-tabs

개발자가 커스텀 스타일을 쉽게 적용할 수 있도록 최소한의 스타일만 제공하여 유연한 스타일링 이 가능한 라이브러리입니다. 상태 관리가 내장되어 있어 탭 선택 및 패널 표시 로직을 직접 구현할 필요 없이 간편하게 사용할 수 있습니다. 기본 사용법 먼저, 라이브러리를 설치합...

2025년 6월 17일173

Next.js와 Spring Boot 연동 시 API 호출 방식

프론트엔드에서 데이터를 어떻게 가져올 것인지에 대한 논의이므로, 프론트엔드 카테고리에 가장 잘 어울린다고 판단했습니다. 방식 1. Next.js의 api 폴더를 사용하는 방법 (중간 API 서버를 두는 방식) 설명 Next.js에서 제공하는 pages/api 또는 ap...

2025년 6월 10일221