
1. 서론: 개발 속도의 이면 – Vercel 환경의 Secret 노출 위험
Vercel: 현대 웹 개발의 핵심 동력
Vercel과 같은 플랫폼은 프론트엔드를 손쉽게 빌드하고 배포하도록 지원하며 개발 속도와 편의성을 극대화합니다. 서버리스 함수, 엣지 네트워크, Git 통합 등 강력한 기능으로 개발자 경험(DX)을 개선하고, 복잡한 인프라 관리를 추상화하여 개발자가 핵심 로직 구현에 집중하도록 돕습니다. Git 커밋만으로 빌드 및 배포가 자동으로 이루어져 아이디어를 빠르게 서비스로 구현할 수 있습니다.
개발 속도 vs. 보안 규율: 위험한 불균형
Vercel 등이 추구하는 개발 및 배포 속도 극대화는 개발자 경험 향상에 기여하지만, 보안 검토나 신중한 설정 확인 절차를 간소화하려는 압력으로 작용할 수 있습니다. 속도 우선주의는 보안보다 기능 출시를 중시하는 문화를 조성할 수 있으며, 플랫폼의 장점이 역설적으로 보안 사고의 간접적 원인이 될 수 있습니다.
치명적 실수: 프론트엔드에 숨겨진 Secret의 위험성
이러한 편의성 이면에는 AWS Secret Key, Stripe Secret Key, 데이터베이스 비밀번호, GitHub 개인 접근 토큰(PAT) 등 민감한 자격 증명 정보('Secret')가 개발자의 실수나 지식 부족으로 프론트엔드 JavaScript 번들에 포함되어 노출되는 심각한 보안 위험이 존재합니다. 사용자 브라우저로 다운로드되는 프론트엔드 코드는 사실상 공개 정보이며, 여기에 Secret을 포함하는 것은 NHI OWASP Top 10의 '시크릿 유출'에 해당하는 매우 위험한 행위입니다.
유출된 Secret은 공격자에게 시스템 및 데이터 무단 접근 권한을 부여하여 데이터 유출/조작, 금전적 손실, API 서비스 남용 등 심각한 결과를 초래할 수 있습니다.
Vercel 환경에서의 Secret 노출 실태 정량화
본 연구는 Vercel에서 호스팅되는 환경에서 실제로 얼마나 많은 위험한 Secret이 노출되고 있는지 정량적으로 파악하고자 수행되었습니다. 실제 운영 중인 사이트를 대상으로 대규모 식별 및 필터링 과정을 거쳐 프론트엔드 코드를 심층 분석한 결과, 악용 가능한 AWS 및 Stripe Secret 등 다양한 유형의 Secret이 상당수 노출된 것을 발견했습니다. 본 보고서는 연구 방법론, 발견된 Secret 노출 수치와 유형, 잠재적 위험, 그리고 문제 해결 및 예방을 위한 실질적인 방안을 공유합니다.
Next.js 환경 변수 규칙과 Vercel 자동 배포의 결합 위험
Vercel의 빠른 개발 속도는 환경 변수 처리와 같이 세밀한 설정과 정확한 이해가 필요한 부분에서 실수를 유발하기 쉽습니다. 특히 Next.js는 클라이언트 측 노출 방지를 위해 환경 변수 이름 앞에 NEXT_PUBLIC_ 접두사 규칙을 사용합니다. 개발자가 이 규칙을 오용하여 서버 전용 Secret(예: AWS Secret Key)에 실수로 NEXT_PUBLIC_ 접두사를 붙이면, Vercel 빌드 시 해당 Secret의 실제 값이 클라이언트 JavaScript 번들에 포함되어 즉시 운영 환경에 배포될 위험이 크게 증가합니다. 편리한 자동 배포 시스템과 환경 변수 규칙이 결합될 때, 개발자의 부주의나 설정 오류는 심각한 Secret 유출 사고로 이어질 수 있으며, 이는 플랫폼과 프레임워크의 특정 기능들이 상호작용하며 의도치 않은 위험을 증폭시키는 시스템적 위험 요소가 존재함을 보여줍니다.

2. 공격 표면 분석: Vercel 호스팅 식별 및 실제 운영 환경 필터링
공유 인프라의 익명성과 탐색의 어려움
Vercel과 같은 플랫폼은 애니캐스트(Anycast) IP 주소 등 공유 인프라를 광범위하게 사용하므로, 특정 웹사이트나 전체 호스팅 목록을 찾아내기 어렵습니다. 예를 들어, Vercel의 대표 IP 주소 76.76.21.21에는 수십만 개의 도메인이 호스팅될 수 있습니다. 복잡한 DNS 라우팅과 IP 주소 할당은 플랫폼 내부적으로 관리되어 단일 IP 정보만으로는 식별이 어렵습니다.
탐색 방법론: OSINT 기법의 복합적 활용
Vercel에 호스팅된 사이트들을 대규모로 식별하기 위해 공개 출처 정보 수집(OSINT) 기법들을 복합적으로 활용했습니다.
첫째, Vercel 사용 IP 주소(예: 76.76.21.21, 76.76.21.0/24)를 시작점으로 IPinfo.io, MxToolbox 등 도구를 사용해 매핑된 도메인 목록을 대량 수집했습니다.

둘째, 이렇게 얻은 도메인 기반으로 SecurityTrails, OWASP Amass, Subfinder, crt.sh 등 다양한 도구를 활용해 서브도메인 탐색을 광범위하게 수행했습니다. 이 도구들은 인증서 투명성 로그, DNS 레코드, 웹 아카이브 등 다양한 출처 정보를 활용합니다.

마지막으로, 수집된 목록에서 Vercel의 특징적인 CNAME 레코드(cname.vercel-dns.com)나 특정 A 레코드(예: 76.76.21.21)를 확인하고, 추가로 HTTP 응답 헤더나 소스코드에서 Vercel 또는 Next.js 흔적을 탐색하여 정확성을 높였습니다..
결과: 4만 개 잠재 호스트 식별 및 6천여개 실 서비스 분석 대상 필터링
초기에는 약 40,000개의 잠재적 호스트 목록을 식별했으나, 만료된 도메인, 중단된 프로젝트, 임시 프리뷰 배포, 잘못된 DNS 설정 등 실제 운영되지 않거나 분석 불가능한 대상이 다수 포함되어 있었습니다. 연구 결과의 정확성과 실질적인 위험 평가를 위해, 이 중 실제로 도메인이 유효하고, 웹 서버가 응답하는 약 6,657개의 활성 도메인을 최종 분석 대상으로 필터링했습니다.

공격자의 시선으로, 공유 인프라는 대량 탐색의 기회
본 연구에서 사용된 OSINT 기법들은 실제 공격자들이 목표 시스템 정찰에 사용하는 표준 방법입니다. Vercel과 같은 PaaS 플랫폼의 공유 IP나 표준 DNS 패턴(cname.vercel-dns.com)은 역설적으로 공격자들에게 대량의 잠재적 공격 대상을 쉽게 발견할 기회를 제공합니다. 공격자들은 자동화된 도구를 사용해 이러한 특성을 활용하여 Vercel 호스팅 웹사이트를 대규모로 식별하고, 그중 Secret 유출과 같은 취약점을 가진 활성 타겟을 효율적으로 찾아낼 수 있습니다. 플랫폼의 효율성을 위한 아키텍처 설계 자체가 오히려 매력적인 대규모 공격 벡터 탐색 공간이 되는 것입니다.
3. JavaScript 번들 내 숨겨진 Secret 탐지 기법과 정확성의 중요성
JavaScript 번들 분석 과정
필터링된 6,657개의 활성 서비스들에 대해, 최종 사용자 브라우저에 전달되는 프론트엔드 JavaScript 파일들을 다운로드하여 심층 분석했습니다. 웹사이트를 자동으로 방문하여 .js 파일 링크를 추출하고 다운로드했으며, 동적으로 로드되는 콘텐츠까지 포함하기 위해 SeleniumBase 라이브러리와 Chrome DevTools Protocol (CDP) 모드를 활용한 브라우저 자동화를 수행했습니다.
아래는 CDP 모드를 통한 Script 파일들과 document 파일들의 내용을 읽는 예제 코드 입니다.

탐지 기법: 단순 패턴 매칭의 한계와 검증 기반 접근 방식
과거에는 주로 정규 표현식(regex) 기반 패턴 매칭으로 알려진 Secret 형식(AWS 키, Stripe 키 등)을 탐지했습니다. 하지만 이 방식은 오탐(false positive) 비율이 매우 높아 실제 Secret이 아닌 문자열(Git 커밋 해시, UUID 등)을 잘못 탐지하는 문제가 심각합니다. 이는 경고 피로(alert fatigue)를 유발하여 실제 위협을 놓치게 만들 수 있습니다.
본 연구에서는 단순 패턴 매칭을 넘어, Cremit의 CLI 도구 등을 활용하여 발견된 잠재적 Secret 문자열의 유효성(validity)과 행동(Behavior) 가능성을 확인하는 검증 기반 접근 방식을 채택했습니다. 이는 정교한 패턴 매칭, 엔트로피 분석, 컨텍스트 분석뿐만 아니라, 발견된 키 후보를 사용하여 실제 서비스(AWS, Stripe 등) API를 안전하게 호출하여 유효성 및 권한 범위를 확인하는 능동적 검증(active validation)을 포함할 수 있습니다. 예를 들어, AWS 키 후보 발견 시 AWS STS API(GetAccessKeyInfo, GetCallerIdentity)를 호출하여 유효성 및 권한을 확인합니다. 이를 통해 실제 악용 가능한 유효한 Secret만을 정확하게 식별하여 보고함으로써, 불필요한 오탐으로 인한 시간 낭비와 피로도를 줄이고 실제 위험에 집중할 수 있습니다.
Secret 스캔 기술은 단순 탐지(detection)에서 검증(validation) 및 컨텍스트 분석으로 진화하고 있습니다. 빠른 개발 환경과 공격자들의 신속한 악용 시도를 고려할 때, 빠르고 정확하게 '실제 위험'만을 식별하는 능력이 중요하며, 유효성/권한 검증은 Secret 스캔 솔루션의 핵심 가치를 '찾는 것'에서 '검증하고 우선순위를 정하는 것'으로 변화시키고 있습니다.
활용 도구 및 기술
Secret 탐지에는 Gitleaks, Yelp/detect-secrets, TruffleHog, Semgrep 등 다양한 오픈소스 및 상용 도구가 활용될 수 있습니다. GitHub, GitLab 등도 자체 Secret 스캔 기능을 제공합니다. JS Snitch와 같은 도구는 원격 JavaScript 스캔에 특화되어 있습니다. 이러한 도구들은 종종 CI/CD 파이프라인이나 Git 사전 커밋 후크(pre-commit hook)에 통합되어 예방적인 조치로 활용됩니다. 본 연구에서는 특정 도구 의존보다는 다양한 탐지 원리(패턴 매칭, 엔트로피, 키워드)와 검증 기법을 종합적으로 고려하고, 대용량 처리와 프로그래밍한 접근을 위해 Cremit의 서비스와 CLI 도구를 같이 활용했습니다.
정확한 Secret 탐지는 운영 효율성과 보안 대응 속도에 직접적인 영향을 미칩니다. 오탐 처리에 시간을 허비하는 동안 실제 유출된 키가 공격자에 의해 악용될 수 있습니다. 유효성 검증을 통해 실제 위험만을 정확하게 식별하는 능력은 제한된 시간 내 효과적인 위협 대응을 위한 필수 요소입니다.
4. 연구 결과: Vercel 환경에서의 Secret 노출 현황 분석
발견: 6,657개 중 0.45%에서 실제 Secret 유출 확인
실제 운영 중인 6,657개 Vercel 호스팅된 서비스들을 분석 결과, 약 0.45%에 해당하는 사이트(30개)에서 실제 운영 환경 사용 또는 민감 데이터 접근 권한을 가진 유효한 Secret 키가 프론트엔드 코드 내에 노출된 것을 확인했습니다.
이 0.45% 비율은 몇 가지 중요한 의미를 가집니다. 첫째, 실제 운영 중인 활성 서비스를 대상으로 한 현실적인 위험을 반영합니다. 둘째, 분석된 샘플 내(전체 Vercel 70만개가 넘는 호스트 사이트가 아닌)에서만 30개 웹사이트가 심각한 보안 위험에 노출되어 있다는 것을 의미합니다. 셋째, 각 유출 사례는 잠재적으로 상당한 금전적 손실, 데이터 유출, 서비스 중단 등 심각한 보안 사고로 이어질 수 있어 발생 시 영향이 매우 클 수 있습니다. 마지막으로, 사용한 탐지/검증 방법론을 고려할 때 실제 노출 규모는 더 클 수 있는 보수적인 추정치입니다. 발생 빈도는 낮아 보일 수 있으나, 각 유출의 잠재적 파급력을 고려할 때 간과할 수 없는 위험입니다.
노출된 Secret 유형과 심각성
분석 과정에서 발견된 Secret의 종류는 매우 다양했으며, 각 Secret이 가지는 잠재적 위험성의 수준 또한 천차만별이었습니다. 발견된 Secret 유형은 크게 상대적으로 가치가 낮은 유틸리티성 API 키와 높은 가치의 중요 자격 증명으로 분류할 수 있습니다.
상대적으로 가치가 낮은 유틸리티성 API 키에는 날씨 정보 제공 API(예: OpenWeatherMap), IP 주소 기반 위치 정보 API(예: IPinfo.io), 블록체인 데이터 조회 API(예: Etherscan API) 등이 포함됩니다. 이러한 키들의 유출은 주로 해당 서드파티 서비스의 사용량 제한 초과로 인한 일시적인 서비스 장애를 유발하거나, 사용량 기반 과금 정책을 사용하는 경우 약간의 추가 비용 발생 문제로 이어질 수 있습니다. 데이터 유출이나 시스템 장악과 같은 심각한 보안 위험으로 직접 연결될 가능성은 상대적으로 낮지만, 서비스 가용성에 영향을 줄 수 있으므로 여전히 관리가 필요합니다.

반면, 높은 가치의 중요 자격 증명에는 GitHub 토큰, AWS Secret Access Key, Stripe Secret Key (sk_live_...) 또는 Restricted Key (rk_live_...) 등이 해당하며, 이는 핵심적인 위험 요소입니다. GitHub 토큰은 개인 또는 조직의 코드 저장소 접근 권한을 부여하여 소스 코드 유출, 악성 코드 삽입을 통한 공급망 공격, CI/CD 파이프라인 조작 등 심각한 지적 재산 손실 및 추가 보안 침해로 이어질 수 있습니다.

AWS Secret Access Key는 클라우드 인프라 자원(EC2, S3, RDS 등)에 대한 프로그래밍 방식 접근 권한을 제공하며, 유출된 키의 IAM 권한 범위에 따라 단순 S3 접근부터 전체 클라우드 계정 관리 권한 탈취까지 가능하여 상당한 금전적 손실(예: 암호화폐 채굴 악용)과 데이터 유출 또는 파괴를 초래할 수 있습니다.

Stripe Secret Key 또는 Restricted Key는 Stripe 계정을 통해 직접적인 금융 거래(결제, 환불)를 수행하고 민감한 고객 PII 및 결제 데이터에 접근할 수 있는 강력한 권한을 부여합니다. 유출 시 사기 거래를 통한 자금 탈취, 고객 데이터 대량 유출(법적 책임, 신뢰도 하락), 서비스 중단 등 비즈니스 운영에 치명적인 금전적, 법적, 평판상의 손해를 입힐 수 있습니다. 특히, 권한 범위를 제한하여 생성된 Restricted Key(rk_live_)라 할지라도 여전히 민감한 작업 수행이 가능하여 프론트엔드 노출 시 매우 위험합니다.

이러한 '높은 가치의 중요 자격 증명'들은 식별자 역할을 하는 AWS Access Key ID (AKIA...)나 프론트엔드용 Stripe Publishable Key (pk_live_...)와는 근본적으로 다른 차원의 위험성을 가집니다. 본 연구는 서버 측에서만 사용되어야 하는 AWS Secret Access Key나 Stripe Secret/Restricted Key 유출을 심각하게 다룹니다.
표 4.1: 발견된 Secret 유형 요약
'고가치/중요' 자격 증명의 발견은 심각한 보안 관리 개선 필요성을 나타냅니다.
위험의 일상화? 보안 인식 부족과 구조적 문제의 증거
프론트엔드에서 실제 운영 환경 Secret, 특히 핵심 자격 증명이 발견된다는 사실은 일부 개발팀/조직 내 기본적인 보안 원칙이 심각하게 간과되고 있음을 시사합니다. 이는 개인의 실수를 넘어 조직적인 인식 부족이나 관리 미흡의 증거일 수 있습니다. AWS, Stripe 등 서비스 제공 업체들은 공식 문서에서 클라이언트 측 코드에 민감 키 포함 금지를 명확히 경고함에도 실수가 발생하는 것은 개발 속도 우선 문화, 교육 및 인식 부족, 부실한 검토 프로세스, 자동화된 안전장치 부재, 개발자 경험(DX)의 역설 등 구조적인 문제들이 존재할 가능성을 시사합니다.
결국, 프론트엔드 Secret 노출은 개인 부주의를 넘어 조직의 보안 문화, 개발 프로세스, 교육, 기술적 안전장치 등 여러 요소가 복합적으로 작용한 결과일 가능성이 높으며, '보안은 모두의 책임' 원칙이 제대로 실현되지 못하고 있음을 보여줄 수 있습니다.
5. 유출된 Secret의 파괴력: 실제 비즈니스에 미치는 영향

유출된 Stripe Secret (sk_live)
유출된 Stripe Secret/Restricted Key는 즉각적이고 심각한 피해를 입힐 수 있습니다. 공격자는 탈취한 키로 Stripe API를 호출하여 직접적인 금전 탈취(사기성 결제 생성, 반복 요금 부과, 무단 환불 처리, 은행 계좌 정보 변경 시도 등 , 민감 데이터 유출(고객 PII 대량 유출로 인한 법적 책임 및 신뢰도 손상, 그리고 서비스 조작 및 중단(상품 정보 임의 조작, 웹사이트 운영 방해, Stripe 계정 정지)과 같은 다양한 악의적인 활동을 수행할 수 있습니다.
유출된 AWS Secret Access Key의 광범위한 위협
유출된 AWS Secret Access Key의 피해 범위와 심각성은 해당 키에 연결된 IAM 사용자/역할 권한에 따라 달라집니다. 최소 권한 원칙이 지켜지면 피해가 제한될 수 있으나, 관리자 수준 권한이면 거의 모든 종류의 피해가 가능합니다.
공격자는 키 탈취 후 sts:GetCallerIdentity 등으로 권한을 파악하는 정찰 활동을 수행한 뒤, 파악된 권한을 바탕으로 상당한 금전적 손실 유발(고성능 EC2 대량 실행을 통한 암호화폐 채굴, 핵심 데이터 유출, 변조, 파괴(S3, RDS, DynamoDB 데이터 유출/수정/삭제, 추가 침투 및 권한 상승(Lateral Movement & Privilege Escalation을 통한 접근 권한 확장 및 지속적 접근 경로 확보), 그리고 인프라 설정 변경(보안 그룹 규칙 변경, VPC 구성 변경, Lambda 코드 수정 등 과 같은 다양한 악의적 활동을 시도할 수 있습니다.
공격자들은 노출된 AWS 키를 매우 빠르게(때로는 몇 분 내) 자동으로 탐지하여 악용합니다. AWS의 경고 시스템이 있지만, 그 전에 피해가 발생할 수 있습니다.
클라우드 환경: 피해 범위의 증폭
AWS, Stripe 등 클라우드 서비스 API 키 유출은 단일 기능 마비 이상입니다. 클라우드 환경은 수많은 서비스(컴퓨팅, 스토리지, DB 등)와 데이터가 긴밀히 연결되어 있어, 하나의 고수준 권한 자격 증명(Secret Key) 탈취 시 해당 계정 아래 거의 모든 자산이 동시 위험에 처합니다. 이는 전통적 온프레미스 환경보다 "폭발 반경(blast radius)"이 훨씬 큽니다.
유출된 AWS 키 하나로 EC2, S3, RDS, Lambda, VPC, IAM 등 다수 서비스 접근/조작이 가능하며, Stripe Secret Key는 결제, 고객 정보, 상품, 구독, 정산 등 광범위한 금융/비즈니스 기능 접근에 사용될 수 있습니다. 공격자들은 초기 접근 후 정찰(Reconnaissance), 측면 이동(Lateral Movement), 권한 상승(Privilege Escalation)을 통해 점차 접근 범위를 확장하여 환경 전체 장악이나 최대 피해를 목표로 합니다. 따라서 클라우드 환경 Secret 키 유출은 기업 운영에 심각한 차질을 줄 수 있는 잠재적 위험으로 인식하고, 개별 자격 증명 보호를 넘어 전체 시스템 상호 연결성을 고려한 '시스템적 방어' 관점에서 접근해야 합니다.
6. 왜 민감 정보는 프론트엔드로 유출되는가?
프론트엔드 Secret 노출 사고는 단일 원인보다는 다양한 기술적, 절차적, 문화적 요인이 복합적으로 작용한 결과일 수 있습니다. 주요 원인으로는 환경 변수 관리의 실패, 복잡한 빌드 프로세스에 대한 무관심, Git 커밋 실수, 보안 인식 부족, 그리고 프레임워크 자체의 함정 등이 있습니다.
환경 변수 관리 실패는 가장 흔한 직접적 원인 중 하나입니다. Next.js의 NEXT_PUBLIC_ 접두사 규칙을 오용하여 서버 전용 Secret에 실수로 이 접두사를 붙이면 실제 값이 클라이언트 번들에 포함됩니다
또한, 구 버전 Next.js의 next.config.js 설정 오류나, Secret이 포함된 .env 파일을 .gitignore 누락으로 Git에 커밋하는 관리 부실, 그리고 환경 변수 자체의 부적절한 Secret 관리 방식(평문 저장, 노출 가능성, 체계적 관리 어려움)도 원인이 됩니다.

복잡한 빌드 프로세스와 그에 대한 무관심도 문제를 일으킵니다. 빌드 도구가 환경 변수 참조를 실제 값으로 대체하는 과정(Inlining)에서 서버 전용 Secret이 클라이언트 번들에 하드코딩될 수 있으며, 코드 제거(Code Elimination) 기능이 완벽하게 작동하지 않아 서버 전용 코드가 클라이언트 번들에 남아 유출될 수도 있습니다.
Git 커밋 실수는 Secret이 포함된 파일을 Git 저장소(특히 공개 저장소)에 직접 커밋하는 명백한 원인입니다. .gitignore 설정 오류나 누락이 주된 이유지만, 비공개 저장소도 접근 권한 관리 부실 시 위험합니다. 공격자들은 자동화된 도구로 GitHub 등을 스캔하여 유출된 Secret을 빠르게 탐색하고 악용합니다.
기술적인 실수 외에도, 개발자나 관련 담당자의 근본적인 보안 인식 부족이 Secret 유출의 원인이 되는 경우가 많습니다. 프론트엔드 코드의 본질적인 공개성을 간과하거나, 사용 중인 프레임워크/플랫폼의 안전한 Secret 관리 방법에 대한 이해가 부족하거나, "프론트엔드는 어차피..."라는 안일한 태도로 보안보다 편의성을 우선시하는 경향이 있습니다.
Next.js와 같은 최신 풀스택 프레임워크가 제공하는 고급 기능들은 클라이언트와 서버 코드의 경계를 유연하게 만들지만, 개발자가 실행 컨텍스트(클라이언트, 서버, 빌드 시점)를 명확히 이해하지 못하면 혼란을 야기하고 보안 실수로 이어질 수 있습니다. 서버에서만 실행되어야 할 Secret 처리 로직을 실수로 클라이언트 컴포넌트에 작성하거나, 잘못된 데이터 페칭 전략을 사용하는 경우가 이에 해당합니다. 프레임워크의 추상화 기능이 오히려 기본적인 보안 원칙을 간과하게 만들 수 있으므로, 동작 방식과 실행 컨텍스트의 정확한 이해가 필수적입니다.
특히 NEXT_PUBLIC_ 접두사 규칙은 원래 통제된 정보 노출을 위해 설계되었지만, 개발자가 민감한 Secret을 클라이언트에서 직접 사용해야 한다고 잘못 판단하고 이 접두사를 붙이면, 해당 Secret 값이 그대로 공개되어 유출 사고의 주범이 되는 역설적인 상황이 발생합니다. 편리함을 위해 만들어진 기능이 오용될 때 심각한 보안 취약점을 만드는 것입니다.
7. 방어 전략: Secret 노출 방지를 위한 다층적 접근법
프론트엔드 Secret 노출이라는 심각한 보안 위협을 방지하고 안전한 웹 애플리케이션을 구축하기 위해서는 단일 해결책에 의존하기보다는, 아키텍처 설계부터 코드 작성, 빌드/배포 파이프라인, 운영 환경 설정, 지속적인 모니터링에 이르기까지 다층적인 방어 전략을 수립하고 실행해야 합니다.
가장 기본적이고 절대적으로 지켜야 할 철칙은 Secret은 서버에만 보관하는 것입니다. AWS Secret Access Key, Stripe Secret/Restricted Key, DB 비밀번호 등 민감 자격 증명은 절대로 프론트엔드 코드에 포함되거나 클라이언트가 직접 접근 가능한 형태로 노출되어서는 안 됩니다. 모든 민감 정보 처리 및 외부 서비스 인증은 신뢰할 수 있는 서버 측 환경(백엔드 API, 서버리스 함수 등)에서 수행되어야 합니다.
안전한 환경 변수 관리 또한 중요합니다. 서버 전용 변수와 클라이언트 노출 가능 변수를 명확히 구분하고, Next.js의 NEXT_PUBLIC_와 같은 접두사는 Google Analytics ID처럼 비민감 설정값에만 매우 제한적으로 사용해야 합니다. Vercel 플랫폼 사용 시에는 대시보드/CLI를 통한 환경 변수 관리가 권장되며, 프로덕션/프리뷰/개발 환경별 분리 설정 기능을 활용하고, 중요 Secret에는 "민감(Sensitive)" 옵션을 활성화하는 것이 좋습니다. 또한, Secret 포함 가능성이 있는 .env 파일은 반드시 .gitignore에 추가하여 커밋을 방지해야 합니다.
아키텍처 수준에서는 Backend-for-Frontend (BFF) 또는 API 프록시 패턴을 도입하는 것이 근본적인 해결책이 될 수 있습니다.

이 패턴에서는 프론트엔드가 직접 외부 API를 호출하는 대신 전용 백엔드 서버(BFF)와 통신합니다. 모든 민감 Secret은 BFF 내부에 안전하게 보관되며, 외부 서비스 호출은 BFF가 대신 수행합니다. 이를 통해 Secret을 프론트엔드로부터 완전히 격리하고, API 응답을 최적화하며, 관심사를 분리하여 개발 효율성을 높일 수 있습니다.
환경 변수를 주입하는 방식과 관련하여, 빌드 시점 주입의 위험성을 인지하고 필요시 런타임 처리를 고려해야 합니다. NEXT_PUBLIC_ 등을 통한 주입은 빌드 시점에 값이 결정되어 코드에 하드코딩되므로 빌드 후 변경이 불가능합니다. 스테이징/프로덕션 환경에서 동일 빌드 결과물을 사용하며 환경별 다른 설정 적용이 필요하다면, 서버 측 런타임 환경 변수 사용, 동적 설정 로딩, 커스텀 서버 또는 초기화 로더 구현 등 런타임 처리 방식을 고려해야 합니다. 요구사항, 배포 전략, 민감도를 고려하여 가장 적합한 방식을 신중하게 선택해야 합니다.
더 높은 수준의 보안과 관리 효율성을 위해서는 전문 Secret 관리 솔루션의 도입을 적극적으로 고려해야 합니다. HashiCorp Vault, AWS Secrets Manager, Google Cloud Secret Manager, Azure Key Vault, Doppler, Infisical 등 다양한 솔루션은 Secret의 중앙 집중 관리, 강력한 접근 제어(RBAC), 자동 순환(Rotation), 상세 감사 로그, 저장 시 암호화, "Secret Zero" 문제 해결 지원, 플랫폼/도구 통합 등 강력한 기능을 제공하여 환경 변수 방식의 한계를 보완하고 보안 태세를 강화하는 데 도움을 줍니다.
마지막으로, 사람의 실수를 보완하기 위해 자동화된 Secret 스캔을 도입하고 구성 관리에 주의를 기울여야 합니다. Gitleaks, detect-secrets, TruffleHog 등 스캔 도구를 CI/CD 파이프라인에 통합하여 빌드/배포 전 단계에서 Secret 탐지 시 프로세스를 실패시키고, 개발자 로컬 환경에 사전 커밋 후크(Pre-commit Hooks)를 설정하여 커밋/푸시를 원천 방지하는 것이 효과적입니다.
이때 오탐 비율이 낮은 정확성 중심의 도구(예: 유효성 검증 기능이 있는 Cremit)를 선택하는 것이 중요합니다. 또한, GitHub/GitLab 등의 내장 스캔 기능 활성화 및 GitGuardian과 같은 전문 모니터링 서비스를 활용하여 지속적으로 저장소를 모니터링하는 것도 좋은 방법입니다. Vercel 등 플랫폼 설정 옵션을 정확히 이해하고 신중하게 구성하는 것 역시 필수적입니다.

결론적으로, 효과적인 Secret 관리는 안전한 아키텍처 설계, 신중한 환경 변수 및 구성 관리, 전문 솔루션 활용 및 플랫폼 설정 주의, 자동화된 검증 통합, 지속적인 개발자 교육 등 다층적인 접근 방식을 종합적으로 적용할 때 비로소 달성 가능합니다.
8. 결론: Non-Human Identity(NHI) 보안 관리의 시급성
프론트엔드 Secret 유출: 이론이 아닌 현실적 위협
본 연구는 Vercel에서 호스팅 하는 서비스들의 약 0.37%에서 검증된 Secret 유출 발견을 통해, 프론트엔드 Secret 노출이 더 이상 이론적 가능성이나 드문 사례가 아님을 정량적으로 보여주었습니다. 특히 SPA, Vercel, Next.js 등 현대적 개발 도구/플랫폼의 편리함 이면에는 환경 변수 관리 복잡성, 빌드 프로세스 함정, 클라이언트/서버 경계 모호성 등 개발자가 의도치 않게 심각한 보안 실수를 저지를 수 있는 새로운 위험 요인이 내재되어 있음을 확인했습니다.
노출된 Secret은 단순 문자열이 아닌 Non-Human Identity(NHI)
연구에서 발견된 AWS Secret Access Key, Stripe API Key, GitHub PAT 등은 단순 데이터 조각이 아닌, 시스템, 애플리케이션, 스크립트 등 '기계'/'소프트웨어'가 다른 시스템과 상호작용 시 자신을 인증하고 권한을 부여받는 Non-Human Identity (NHI), 즉 기계 정체성입니다. 사람 사용자 계정처럼 NHI에도 특정 역할과 권한이 부여됩니다.
따라서 NHI(Secret) 유출은 정보 노출을 넘어, 해당 정체성에 부여된 모든 권한과 능력이 공격자에게 탈취될 수 있음을 의미합니다. 이는 기업 핵심 클라우드 인프라, 금융 시스템, 소스 코드, 민감 데이터 등에 대한 무단 접근, 조작, 파괴로 직접 이어질 수 있는 매우 심각한 보안 위협입니다. 단 하나의 강력한 NHI 탈취로 기업 전체 운영이 마비되거나 상당한 손실을 입을 수 있습니다.
NHI 보안: 현대 개발 환경의 필수 불가결 요소
프론트엔드 코드와 같이 부적절한 위치에 NHI(Secret)가 노출되는 현상은 개발 프로세스와 배포 파이프라인 전반에 걸쳐 NHI 관리가 제대로 이루어지지 않고 있음을 보여주는 단적인 예입니다. 많은 조직이 개발 속도와 기능 구현 편의성에 집중한 나머지, 애플리케이션과 인프라를 연결하는 수많은 NHI의 생성부터 저장, 최소 권한 부여, 유효기간 관리/순환, 폐기에 이르는 전체 라이프사이클 관리에 소홀해지기 쉽습니다.
안전한 소프트웨어 공급망과 견고한 클라우드 네이티브 환경 구축을 위해서는 코드 자체 보안성 확보와 더불어, 이를 실행하고 서비스들을 연결하는 수많은 NHI에 대한 철저하고 체계적인 보안 관리 체계 구축이 필수적입니다. 개발 초기부터 배포, 운영, 폐기까지 모든 NHI를 식별, 분류, 보호하고 사용 현황과 활동 내역을 지속적으로 모니터링 및 감사해야 합니다. 클라우드 환경과 자동화 확산으로 NHI 수가 기하급수적으로 늘어나고 있으며, 이들을 인간 사용자 계정만큼, 혹은 그 이상으로 철저히 관리하는 것이 현대 보안 패러다임의 핵심 과제입니다.
Cremit과 같은 솔루션은 코드 저장소, 구성 파일 등 환경 전반에 흩어진 NHI(Secret)를 정확하게 탐지하고, 유효성/권한 검증으로 오탐을 최소화하며, 중앙 집중적인 가시성과 관리 기능을 제공하여 의도치 않은 NHI 노출 위험을 효과적으로 관리하고 안전한 개발/운영 환경 유지에 기여합니다.
궁극적으로, 현대 애플리케이션과 클라우드 인프라의 전반적인 보안 수준은 Non-Human Identity를 얼마나 효과적으로 식별, 관리, 보호하는지에 크게 좌우됩니다. 본 연구 결과가 개발 커뮤니티와 기업들에게 NHI 보안의 중요성을 새롭게 인식시키고, 보다 안전한 개발 문화와 프로세스 구축, 관련 솔루션 도입 검토의 계기가 되기를 바랍니다.
기본적인 데이터를 넘어, Non-Human Identity 위험을 선제적으로 완벽하게 관리하고 완화하는 데 필요한 실행 가능한 AI 기반 인사이트를 확보하세요.

Blog
최신 사이버 위협과 주요 업계 보안 트렌드에 대한 최신 정보를 확인하세요.