κΉνλΈ, NPM βν΄λμ ν ν°β μ λ©΄ νκΈ°Β·Β·Β·μννΈμ¨μ΄ 곡κΈλ§ 보μ κ°ν λμ
κΉνλΈκ° μ΄λ² μ£Ό μμ¬ npm(Node Package Manager) λ μ§μ€νΈλ¦¬μ 보μ 체κ³λ₯Ό λν κ°ννλ λ§μ§λ§ λ¨κ³λ₯Ό μ μ©νλ€. Node.js μνκ³μμ κ°μ₯ λ리 μ¬μ©λλ npm λ μ§μ€νΈλ¦¬λ₯Ό λμμΌλ‘, μ¦κ°νλ μννΈμ¨μ΄ 곡κΈλ§ 곡격 μνμ λ³΄λ€ κ°νκ² λμνκ² λ€λ μ·¨μ§λ€.
μμ λ λ¬ μ μκ³ ν λλ‘, 12μ 9μΌμ κΈ°μ μΌλ‘ npmμ λ§λ£ κΈ°ν μμ΄ μ¬μ©λλ βν΄λμ(classic) ν ν°β λλ βμ₯κΈ° ν ν°(long-lived tokens)βμ μ λ©΄ νκΈ°νλ€. μ΄ ν ν°μ κ·Έλμ κ°λ°μκ° ν¨ν€μ§λ₯Ό μΈμ¦ν λ λ³λμ λ§λ£μΌ μμ΄ μ¬μ©ν μ μμμ§λ§, μμΌλ‘λ λ μ΄μ νμ©λμ§ μλλ€.
μ΄μ λ°λΌ κ°λ°μλ λ κ°μ§ λ°©μ μ€ νλλ‘ μ νν΄μΌ νλ€. νλλ μλͺ μ΄ μ§§κ³ κΆν λ²μκ° μ νλ βμΈλΆν μ κ·Ό ν ν°(GAT, Granular Access Tokens)βμ μ¬μ©νλ λ°©μμ΄λ©°, λ€λ₯Έ νλλ OpenID Connect(OIDC)μ OAuth 2.0μ κΈ°λ°μΌλ‘ ν μμ ν μλ‘μ΄ μλν CI/CD νΌλΈλ¦¬μ± νμ΄νλΌμΈμΌλ‘ μ κ·Έλ μ΄λνλ λ°©μμ΄λ€.
μ΄λ² μ‘°μΉλ μ΅κ·Ό κΈμ¦ν 곡κΈλ§ 곡격μ λν μ§μ μ μΈ λμμ΄λ€. νΉν 9μ λ°μν βShai-Hulud μβ μ¬κ±΄μμλ 곡격μκ° κ°λ°μ κ³μ κ³Ό ν ν°μ νμ·¨ν λ€ μλ°± κ°μ ν¨ν€μ§μ λ°±λμ΄λ₯Ό μ¬λ λ° μ±κ³΅ν΄ μ κ³μ ν° μΆ©κ²©μ 쀬λ€.
κΉνλΈμ 보μ μ°κ΅¬ λλ ν°μΈ μλΉμ λ₯΄λ€-μ½λΌμ΄μ λ λΉμ βμ΄λ¬ν μΉ¨ν΄ μ¬κ³ λ μ€νμμ€ μνκ³μ λν μ λ’°λ₯Ό μ½νμν€κ³ , μ 체 μννΈμ¨μ΄ 곡κΈλ§μ 무결μ±κ³Ό 보μμ μ§μ μ μΈ μνμ΄ λλ€βλΌλ©° βμΈμ¦κ³Ό μμ ν νΌλΈλ¦¬μ± κ΄νμ κΈ°μ€μ λμ΄λ κ²μ΄ npm μνκ³λ₯Ό λ―Έλμ 곡격μΌλ‘λΆν° 보νΈνλ λ° νμμ βμ΄λΌκ³ μ€λͺ νλ€.
κ°λ°μ λΆλ΄κ³Ό μ€μ§μ μν₯
μ΄λ² λ³κ²½μΌλ‘ κ°λ°μκ° μ²΄κ°νλ μν₯μ μ μ§ μλ€. μ΄λ² μ£ΌλΆν° ν΄λμ ν ν°μΌλ‘ μΈμ¦λ ν¨ν€μ§μ λν΄ npm publishλ npm installμ μ€ννλ©΄ β401 Unauthorizedβ μ€λ₯κ° λ°μνλ€. λ§λ£ κΈ°νμ΄ μλ μλ‘μ΄ ν΄λμ ν ν°μ λ μ΄μ μμ±ν μ μλ€.
λ€λ§, λ§λ£μΌμ΄ μ€μ λ μΈλΆν ν ν°μ 2026λ 2μ 3μΌκΉμ§ κ³μ μ¬μ©ν μ μλ€. μ΄νμλ ν ν°μ μ΅λ μλͺ μ΄ 90μΌλ‘ μ νλλ©°, μ£ΌκΈ°μ μΌλ‘ ν ν° λ‘ν μ΄μ μ μνν΄μΌ νλ€.
μΆκ° μ 무μ κ·λͺ¨λ μ‘°μ§μ ν¬κΈ°μ κ΄λ¦¬ μ€μΈ ν¨ν€μ§ μμ λ°λΌ λ¬λΌμ§λ€. λκ·λͺ¨ μ‘°μ§μ κ²½μ°, μ΄λ―Έ λλΉκ° λμ΄ μμ§ μλ€λ©΄ μ¬λ¬ νμ κ±Έμ³ μλ°± κ° ν¨ν€μ§λ₯Ό μ κ²ν΄μΌ ν μ μλ€. μ΄ κ³Όμ μμ κΈ°μ‘΄ ν΄λμ ν ν°μ λͺ¨λ νκΈ°νκ³ , μΈλΆν ν ν°μ μ£ΌκΈ°μ μΌλ‘ κ΅μ²΄νλ μ μ°¨λ₯Ό μλ‘ λ§λ ¨ν΄μΌ νλ€.
βμμ§ μΆ©λΆνμ§ μλ€βλ μ§μ λ
κ·Έλ¬λ μ΄λ² κ°νΈμ΄ 보μ μΈ‘λ©΄μμ μΆ©λΆν μ‘°μΉμΈμ§μ λν΄μλ νμμ μΈ μκ°λ μλ€. μ§λλ¬, μ€νJS μ¬λ¨(OpenJS Foundation)μ κΉνλΈκ° μ₯κΈ°μ μΌλ‘ λμ νλ €λ ν ν°λ¦¬μ€(tokenless) OIDC 보μ λͺ¨λΈμ μ±μλκ° μμ§ λΆμ‘±νλ€κ³ μ§μ νλ€.
μ¬λ¨μ 곡격μκ° ν¨ν€μ§λ₯Ό μΉ¨ν΄νλ κ³Όμ μμ κ°λ°μ κ³μ νμ·¨κ° λΉλ²νκ² λ°μνλ λ§νΌ, κ³μ μ체μ λν λ€μ€μμμΈμ¦(MFA) κ°νμ λ ν° λΉμ€μ λ¬μΌ νλ€κ³ μΈκΈνλ€. νμ¬ npmμ μκ·λͺ¨ κ°λ°μ κ³μ μ MFAλ₯Ό μ무ννμ§ μκ³ μμΌλ©°, OIDC μμ ν¨ν€μ§ νΌλΈλ¦¬μ± κ³Όμ μμ μΆκ°μ μΈ MFA λ¨κ³λ₯Ό μꡬνμ§ μλλ€. νΉν μλν μν¬νλ‘ νκ²½μμλ MFAλ₯Ό μ μ©ν λ°©λ² μμ²΄κ° μλ μν©μ΄λ€.
μ¬κΈ°μ λν΄, μΌλΆ MFA λ°©μμ μ€κ°μ 곡격(man-in-the-middle)μ μ·¨μ½ν μ μλ€λ μ λ λ¬Έμ λ‘ μ§μ λλ€. μ΄ λλ¬Έμ μΈμ¦ μλ¨μ μ΄λ¬ν 곡격 κΈ°λ²μ μ νν μ μμ΄μΌ νλ€λ μκ΅¬κ° λμ¨λ€.
곡κΈλ§ 보μ κΈ°μ μλνμ (Sonatype)μ μ§μ λΆμ¬μ₯μΈ λ―Έν° μλ² λ¦¬λ β곡격μλ μμμ΄ λΆμ‘±νμ§λ§ λ리 μ¬μ©λλ νλ‘μ νΈμ μ μ§κ΄λ¦¬μλ₯Ό λ Έλ¦¬λ λλ ·ν ν¨ν΄μ 보μ΄κ³ μλ€βκ³ λΆμνλ€. κ·Έλ βμ΅κ·Ό Chalk, Debug κ°μ npm ν¨ν€μ§ μΉ¨ν΄ μ¬λ‘λ XZ Utilities λ°±λμ΄ μ¬κ±΄κ³Ό μ μ¬νλ€βλ©° β곡격μλ μ€λ μκ° μ λ’°λ₯Ό μμ λ€ ν΅μ κΆμ ν보νκ³ , μ΄λ μ¬ν곡νμ΄ μ΄μ 곡κΈλ§ 곡격μ ν΅μ¬ λ¨κ³κ° λλ€λ μ μ 보μ¬μ€λ€βκ³ μ€λͺ νλ€.
μλ² λ¦¬λ npmκ³Ό κ°μ μ€νμμ€ ν¨ν€μ§ κ΄λ¦¬ λ μ§μ€νΈλ¦¬λ₯Ό μ€μ μΈνλΌλ‘ μΈμνκ³ κ·Έμ κ±Έλ§μ μμ ν¬μκ° νμνλ€κ³ μ§μ νλ€. μμΈλ¬ μ‘°μ§μ μΉ¨ν΄ κ°λ₯μ±μ μ μ λ‘, μ νν μννΈμ¨μ΄ μμ¬ λͺ
μΈμ(SBOM)λ₯Ό μ μ§νκ³ , μμ¬μ€λ¬μ΄ μμ‘΄μ± λ³κ²½μ λͺ¨λν°λ§νλ©°, λΉλ νκ²½μ μλλ°μ±νλ λ°©μμΌλ‘ λμν΄μΌ νλ€κ³ μ μΈνλ€.
dl-ciokorea@foundryco.com
