블로그
tech
6遺??뚯슂

내일 만료되는 토큰이 던진 경고: npm이 '클래식 토큰'을 영구 폐기한 이유

2026년 2월 24일, 수백만 개발자의 npm 토큰이 만료된다. GitHub가 2025년 12월 클래식 토큰을 전면 폐기하고 Granular Access Tokens 전환을 강제한 배경에는 급증하는 소프트웨어 공급망 공격이 있다.

이미지 미확보 사유: GitHub/npm 공식 보안 정책 문서 및 토큰 관리 UI 스크린샷은 저작권 보호 대상이며, 실시간 변동성이 있어 장기 URL 확보가 불가능합니다. 본문은 텍스트 중심으로 구성했습니다.

내일 아침, 당신의 CI/CD가 멈출 수 있다

2026년 2월 24일 오전, 전 세계 수백만 개발자의 npm 토큰이 일제히 만료된다. "NPM_TOKEN" 이라는 이름의 Granular Access Token이 90일 유효기간을 채우고 사라지는 날이다. 이 토큰이 사라지면 자동화된 배포 파이프라인이 멈추고, 패키지 퍼블리싱이 실패하며, GitHub Actions 워크플로우가 빨간불을 켜게 된다.

이 사태는 단순한 기술적 불편이 아니다. 소프트웨어 공급망 보안이라는 거대한 전환의 신호탄이다.

TL;DR

  • 2025년 12월 9일, GitHub npm이 만료일 없는 '클래식 토큰' 전면 폐기
  • Granular Access Tokens(GAT) 강제 전환: 최대 90일 유효기간, 범위 제한
  • 2026년 2월 24일, 최초 발급 GAT 만료 예정 → 대규모 CI/CD 장애 우려
  • 배경: 2025년 9월 Shai-Hulud 웜 등 공급망 공격 급증
  • 대안: Trusted Publishing(OIDC) 전환 권장

📌 사실관계: 무슨 일이 일어났나

클래식 토큰의 종말

2025년 12월 9일, GitHub는 npm 레지스트리에서 Classic Tokens(장기 토큰)을 영구 폐기했다. 만료일 없이 무제한 사용 가능했던 이 토큰은 그동안 개발자들이 CI/CD 파이프라인에서 패키지를 인증할 때 가장 흔하게 사용하던 방식이었다.

기존 클래식 토큰은 더 이상 인증되지 않으며, 재생성도 불가능하다. 개발자는 두 가지 선택지 중 하나를 택해야 한다:

  1. Granular Access Tokens(GAT): 최대 90일 유효기간, 권한 범위 제한, 수동 갱신 필요
  2. Trusted Publishing(OIDC): OpenID Connect 기반, 토큰 없이 GitHub Actions/GitLab CI에서 자동 인증

2026년 2월 24일, 첫 만료일

2025년 11월~12월 GAT로 전환한 개발자들의 토큰이 2026년 2월 24일(내일) 일제히 만료된다. npm은 만료 하루 전인 오늘(2월 23일) 수백만 개발자에게 "Granular access tokens expiring tomorrow" 경고 이메일을 발송했다.

토큰을 갱신하지 않으면:

  • CI/CD 파이프라인 중단: GitHub Actions, GitLab CI, Jenkins 등에서 npm publish 실패
  • 자동화 배포 불가: 수동으로 토큰 재발급 후 CI 환경 변수 업데이트 필요
  • 프로젝트 릴리스 지연: 긴급 패치 배포 불가

🔍 확산 요인: 왜 GitHub는 이렇게 강제했나

2025년 9월, Shai-Hulud 웜 사건

2025년 9월 8일, npm 생태계를 뒤흔든 Shai-Hulud 웜 공격이 발생했다. 공격자는 패키지 메인테이너를 대상으로 피싱 이메일(support@npmjs.help)을 발송해 2FA 자격 증명을 탈취했다.

공격 과정:

  1. 메인테이너에게 "2FA 업데이트 필요" 가짜 이메일 발송
  2. 중간자 공격(AiTM)으로 ID, 비밀번호, OTP 실시간 탈취
  3. 탈취한 세션으로 18개 핵심 패키지 쓰기 권한 획득
  4. 수만 개 프로젝트가 의존하는 패키지에 악성 코드 주입

이 사건은 클래식 토큰의 근본적 취약성을 드러냈다:

  • 만료일 없음 → 한번 탈취되면 영구 사용 가능
  • 전체 권한 → 모든 패키지에 접근 가능
  • 감사 기록 부족 → 공격 탐지 지연

@ctrl/tinycolor 사건: GitHub Actions 워크플로우 공격

2025년 하반기, @ctrl/tinycolor 패키지(주간 다운로드 200만 회)가 악성 코드에 감염됐다. 공격자는 협업 저장소의 GitHub Actions 워크플로우에 악성 코드를 푸시해 npm 토큰을 탈취하고, 20개 패키지에 악성 버전을 배포했다.

이 사건은 "토큰 기반 인증"의 한계를 보여줬다. 토큰이 CI 환경 변수에 저장되어 있으면, 워크플로우를 조작한 공격자가 언제든지 탈취할 수 있다.


🧠 맥락과 배경: 소프트웨어 공급망 보안의 패러다임 전환

공급망 공격의 급증

Node.js 생태계는 의존성 체인이 깊다. 하나의 패키지가 수십~수백 개의 다른 패키지를 의존하고, 그 패키지들이 또 다른 패키지를 의존한다. 공격자는 이 체인의 최하위 패키지 하나만 장악해도 수만 개 프로젝트를 감염시킬 수 있다.

통계 (GitHub 보안 연구팀):

  • 2024년 대비 2025년 npm 공급망 공격 300% 증가
  • 피싱을 통한 메인테이너 계정 탈취가 가장 흔한 공격 벡터
  • 평균 탐지 시간: 72시간 (악성 코드가 이미 수천 프로젝트에 전파된 후)

클래식 토큰 vs. Granular Access Tokens

구분Classic TokensGranular Access Tokens (GAT)
유효기간무제한최대 90일
권한 범위전체 패키지패키지별/조직별 제한
2FA 우회가능옵션 (Bypass 2FA)
IP 제한불가CIDR 기반 제한 가능
감사 로그제한적상세 기록
탈취 시 피해전체 계정 장악제한된 범위만 영향

GAT는 최소 권한 원칙을 강제한다. 하나의 토큰이 특정 패키지에만 접근하도록 제한하면, 토큰 탈취 시 피해 범위를 최소화할 수 있다.

Trusted Publishing: 토큰 없는 미래

GitHub가 가장 권장하는 방식은 Trusted Publishing(OIDC 기반)이다.

작동 방식:

  1. GitHub Actions 워크플로우에서 npm publish 실행
  2. GitHub가 단기 OIDC 토큰 자동 발급 (수명: 수분)
  3. npm이 GitHub의 OIDC 제공자를 신뢰해 인증
  4. 토큰이 환경 변수에 저장되지 않음 → 탈취 불가

장점:

  • 토큰 갱신 불필요 → 운영 부담 제거
  • 자동 Provenance 생성 → OpenSSF 표준 준수
  • 워크플로우 조작 공격 방어 → 토큰이 노출되지 않음

한계:

  • GitHub Actions, GitLab CI만 지원 (Jenkins, CircleCI 등 미지원)
  • 기존 워크플로우 대규모 수정 필요
  • 학습 곡선

🔮 전망: 90일마다 반복되는 갱신 지옥, 또는 OIDC 전환

단기: 토큰 갱신 자동화 전쟁

대부분의 개발자는 당분간 GAT를 사용할 것이다. 문제는 90일마다 갱신해야 한다는 점이다.

자동화 전략:

  1. 캘린더 알림: Google Calendar, Notion 등에 갱신 일정 등록
  2. 토큰 관리 도구: Vault, 1Password, AWS Secrets Manager 등에서 만료일 추적
  3. 스크립트 자동화: CLI로 토큰 생성 후 CI 환경 변수 자동 업데이트

하지만 이는 운영 부담을 크게 증가시킨다. 패키지를 10개 관리하는 팀은 연간 40회 토큰 갱신을 해야 한다.

중기: OIDC 전환 가속화

2026년 상반기, 토큰 갱신 피로도가 임계점에 달하면 OIDC 전환이 본격화될 것이다.

예상 시나리오:

  • Q1~Q2: 주요 오픈소스 프로젝트(Next.js, Vite, React 등)가 OIDC 전환 사례 공개
  • Q3: Jenkins, CircleCI 등 주요 CI 플랫폼이 OIDC 지원 추가
  • Q4: npm이 OIDC를 "기본 권장 방식"으로 공식화

장기: 소프트웨어 공급망 보안의 새 표준

OIDC는 단순히 npm을 넘어 모든 패키지 레지스트리의 표준이 될 것이다.

확산 예상:

  • PyPI (Python): 이미 Trusted Publishing 지원 중
  • RubyGems: 2026년 상반기 OIDC 도입 예정
  • Maven Central (Java): 논의 중
  • Docker Hub: GitHub Container Registry가 선도

궁극적으로 "토큰 없는 퍼블리싱"이 업계 표준이 되고, Provenance Attestations(패키지가 어디서, 누가, 어떻게 빌드했는지 증명)가 필수 요구사항이 될 것이다.


✅ 개발자 체크리스트

지금 당장 확인해야 할 것

npmjs.com/settings/~/tokens에서 토큰 만료일 확인
2026년 2월 24일 만료 예정 토큰이 있다면 오늘 안에 갱신
CI/CD 환경 변수(NPM_TOKEN) 업데이트
로컬 .npmrc 파일 토큰 확인

중기 대응 (1~3개월)

패키지별로 최소 권한 GAT 생성 (전체 권한 토큰 1개 → 패키지별 토큰 N개)
토큰 갱신 캘린더 등록 (만료 7일 전 알림)
IP 화이트리스트 설정 (가능한 경우)
2FA 강화 (하드웨어 키 사용 권장)

장기 전환 (3~12개월)

Trusted Publishing(OIDC) 전환 계획 수립
GitHub Actions 워크플로우 OIDC 마이그레이션
Provenance Attestations 활성화 (npm publish --provenance)
팀 내 보안 정책 문서화

피해야 할 것

  • ❌ 토큰을 코드 저장소에 커밋
  • ❌ 여러 패키지에 하나의 토큰 공유 (compromise 시 전체 피해)
  • ❌ "Bypass 2FA" 옵션 무분별 사용
  • ❌ 토큰 만료를 무시하고 배포 당일 갱신 시도

🔗 참고 링크

  1. GitHub Changelog: npm classic tokens revoked (2025-12-09)
  2. npm Docs: About Granular Access Tokens
  3. GitHub Security: Our plan for a more secure npm supply chain
  4. The Hacker News: npm's Update to Harden Their Supply Chain
  5. CIO Korea: 깃허브, NPM '클래식 토큰' 전면 폐기
  6. OpenJS Foundation: npm Security Best Practices
  7. Socket.dev: npm Revokes Classic Tokens

마무리: 내일 아침, 토큰 만료 알림을 받고 당황하지 말자. 이것은 단순한 불편이 아니라, 더 안전한 개발 생태계로 가는 과정이다. 90일의 갱신 주기가 부담스럽다면, 지금이 OIDC를 진지하게 검토할 타이밍이다.

관련 게시물