본문으로 건너뛰기
>_ITDITD웹 보안 플랫폼

보안 가이드

TanStack, Nx Console, GitHub로 이어진 침해 연쇄 (2026년 5월): 개발자가 확인할 것

2026년 5월 TanStack의 npm 침해가 Nx Console VS Code 확장 변조와 GitHub 내부 저장소 탈취로 이어졌습니다. 세 조직의 공식 사후 보고서를 바탕으로 영향 여부 확인 방법, 교체할 인증 정보, 점검할 CI 설정을 정리합니다.

게시 2026-09-30 업데이트 2026-09-30 최종 확인 2026-09-30 14분 읽기

대상: npm(pnpm, yarn 포함)으로 JavaScript 의존성을 설치하는 개발자, VS Code나 그 파생 에디터에서 확장을 쓰는 사람, GitHub Actions에서 패키지를 배포하는 메인테이너, GitHub Enterprise Server 관리자. 이 글은 TanStack, Nx, GitHub가 공개한 사후 보고서와 발표를 바탕으로 하며, 공격 기법은 다루지 않습니다.

개발자가 지금 할 일

1

lockfile과 CI 로그에서 영향받은 TanStack 버전을 확인한다

영향받은 패키지는 @tanstack/react-router, @tanstack/react-start, @tanstack/router-core, @tanstack/history 등 Router/Start 패키지 42개, 84개 버전입니다(전체 목록은 GitHub 권고 GHSA-g7cv-rxg3-hmpx). TanStack은 Query, Table, Form, Virtual 등 다른 패키지는 영향을 받지 않았다고 밝혔습니다. lockfile의 현재 내용만이 아니라 2026년 5월 11일 전후의 변경 이력도 확인하세요. 악성 버전은 몇 시간 안에 npm에서 제거됐기 때문에, 그 사이의 설치가 지금의 lockfile에는 남아 있지 않을 수 있습니다. CI에서는 5월 11일 19:20(UTC) 이후 설치를 실행한 잡을 찾아보세요.

2

Nx Console v18.95.0이 설치돼 있었는지 확인한다

Nx의 사후 보고서는 code --list-extensions --show-versions로 설치된 버전을 확인하는 방법을 안내합니다(확장 ID에 angular-console이 포함됨). 영향받은 것은 v18.95.0뿐이며, 5월 18일 12:30부터 13:09(UTC) 사이에 배포됐습니다. Nx는 이 시간대에 자동 업데이트를 켠 상태로 Nx Console을 쓰던 사람은, 설치 수치가 결국 어느 쪽으로 확정되든 그 기기를 침해된 것으로 취급하라고 요청합니다. 사후 보고서에는 찾아볼 파일과 프로세스(침해 지표)도 나와 있으니, 영향이 있다면 그 목록을 따라 확인하세요.

3

영향을 받았다면 그 기기에서 접근할 수 있던 인증 정보를 전부 교체한다

TanStack과 Nx는 같은 대상을 듭니다. GitHub 토큰, npm 토큰, SSH 키, 클라우드 인증 정보(AWS, GCP, Azure), Kubernetes, Vault 토큰, 그리고 .env 파일의 내용입니다. Nx는 기기의 도구가 그 시간대에 발급받았을 수 있는 인증 정보(임시 클라우드 인증 정보, GitHub CLI 토큰 등)도 추가하고, 교체 후 기기를 완전히 다시 구축하는 것도 검토하라고 권합니다. 폐기 순서와 상주형 악성 코드 대응은 npm 공급망 웜 방어의 "감염이 의심될 때" 부분을 참고하세요.

4

npm 패키지를 관리한다면 배포 이력을 확인한다

TanStack에 따르면 이 코드는 피해자가 관리하는 다른 패키지를 찾아 같은 코드를 심어 다시 배포하려고 했습니다. npm에 패키지를 배포하고 있다면 5월 11일 이후 패키지의 버전 이력에 내가 배포하지 않은 버전이 없는지 확인하세요.

5

내 기기에서 GitHub 토큰이 어디에 저장돼 있는지 확인한다

Nx에 따르면 탈취된 인증 정보는 GitHub CLI 토큰이었습니다. 그 환경에서는 디스크의 파일에 저장돼 있어 사용자 권한으로 실행되는 모든 프로세스가 읽을 수 있었고, 74초 안에 GitHub API에 쓰였습니다. gh auth status로 내 토큰이 어디에 저장돼 있는지 확인하고, 평문 파일에 있다면 OS 키체인이나 실행 시에만 인증 정보를 넣어 주는 비밀번호 관리자 연동으로 옮기는 것을 검토하세요. Nx는 사고 후 개발자 기기에서 GitHub CLI를 직접 쓰는 것을 정책으로 금지했습니다. 토큰의 유효 기간과 범위를 좁히는 방법은 npm 공급망 웜 방어를 참고하세요.

6

릴리스 경과 기간 설정이 실제로 적용되는지 확인한다

Nx에 따르면 침해된 기여자의 프로젝트는 .npmrc에 minimum-release-age=10080(7일)을 설정해 두었지만, 프로젝트가 고정한 pnpm 10.14는 이 설정을 지원하지 않아 조용히 무시했습니다. 지원은 pnpm 10.16부터입니다. 악성 버전은 설치 시점에 공개된 지 77분밖에 안 됐으므로, 설정이 동작했다면 막혔을 것입니다. package.json의 packageManager 필드에 고정된 버전을 확인하고, 충분히 새 버전인지 CI에서 검증하게 하세요. npm에서 같은 역할을 하는 설정은 npm 공급망 웜 방어에서 다룹니다.

7

GitHub Enterprise Server 관리자: 서명 키를 교체한다

5월 26일 GitHub는 GitHub Enterprise Server 업데이트 패키지에 서명하는 키를 포함해 키를 교체하고 있다고 발표했습니다. 관리자는 인스턴스의 GPG 공개 키를 교체해야 하며, 그렇지 않으면 앞으로의 업그레이드가 올바른 GHES 패키지가 아니라는 오류로 실패합니다. 절차와 보조 스크립트의 SHA256 다이제스트는 GitHub의 게시물에 있습니다. GitHub는 GHES 업데이트를 공식 경로에서만 내려받고, 앞으로 몇 달 동안 보안 업데이트가 평소보다 잦을 것에 대비하라고도 요청합니다. GitHub Enterprise Cloud 고객은 별도 조치가 필요 없습니다.

패키지 배포자가 CI에서 점검할 것

TanStack과 Nx의 사후 보고서는 어떤 설정 때문에 연쇄가 통과됐는지 구체적으로 밝히고 있습니다. 아래는 그 내용을 내 저장소에서 확인할 수 있는 설정과 정책으로 옮긴 것입니다.

1

pull_request_target에서 포크의 코드를 실행하지 않는다

TanStack에 따르면 번들 크기를 재는 워크플로가 pull_request_target으로 실행됐고, 그 안에서 포크 풀 리퀘스트의 코드를 체크아웃해 빌드했습니다. pull_request_target은 기본 저장소의 권한으로 실행되며, TanStack은 첫 기여자에 대한 승인 관문이 이 트리거에는 적용되지 않는다고 지적합니다. 라벨 붙이기나 댓글 달기처럼 외부 코드를 실행하지 않는 작업에만 쓰세요. TanStack은 사고 후 CI에서 pull_request_target 사용을 모두 없앴습니다.

2

신뢰할 수 없는 잡과 릴리스 잡이 캐시를 공유하지 않게 한다

TanStack에 따르면 GitHub Actions 캐시는 저장소 단위로 공유되며, pull_request_target 실행과 main으로의 push가 같은 범위를 씁니다. 워크플로의 permissions:를 읽기 전용으로 해도 캐시 저장은 막히지 않습니다. 그 결과 릴리스 워크플로가 외부 코드를 실행한 잡이 쓴 캐시를 복원했습니다. TanStack은 사고 후 릴리스 파이프라인의 패키지 캐시를 끄고 모든 캐시를 삭제했습니다. 배포하는 워크플로에서는 캐시를 복원하지 않는 것이 가장 단순한 경계선입니다.

3

배포 권한(id-token: write)은 배포 잡에만, 승인을 거쳐서 준다

TanStack의 릴리스 워크플로는 npm 신뢰 게시(OIDC)를 위해 id-token: write를 갖고 있었습니다. 사후 보고서에 따르면 악성 배포는 워크플로에 정의된 배포 단계에서 나온 것이 아니라, 같은 실행의 다른 단계에서 돌던 코드가 토큰을 꺼내 직접 배포한 것이었습니다. TanStack 자신의 교훈은 신뢰 게시 연결에는 배포마다의 검토가 없다는 것입니다. 배포를 빌드·테스트와 분리된 별도 잡으로 나누고, 그 잡에만 권한을 주고, 필수 검토자(required reviewers)를 지정한 GitHub 환경(environment) 뒤에 두세요. Nx는 사고 후 실행한 사람과 다른 사람의 승인을 배포의 필수 조건으로 만들었습니다.

4

서드파티 액션은 커밋 SHA로 고정한다

사고 후 TanStack과 Nx는 모두 액션 참조를 태그나 브랜치가 아니라 커밋 SHA로 고정했습니다. TanStack은 바뀔 수 있는 참조를 "이번 사고와 무관하게 늘 존재하는 공급망 위험"이라고 표현합니다.

5

배포 알림과 감사 로그가 실제로 읽는 사람에게 가게 한다

Nx는 확장 마켓플레이스가 업로드 때마다 보내는 일상적인 알림 메일로 변조된 릴리스를 발견했습니다. 릴리스를 예상하지 않던 메인테이너가 이상을 알아차리고 약 11분 만에 게시를 내렸습니다. 두 번째 배포 경로에는 그런 알림이 없었고, 제거까지 약 36분이 걸렸습니다. 한편 탈취된 토큰으로 한 활동(워크플로 실행 기록 삭제 등)은 감사 로그에 남아 있었지만 1주일 동안 아무도 알아차리지 못했습니다. 배포 알림이 팀의 누군가에게 도착하는지, 워크플로 실행 기록 삭제를 감사 로그에서 누군가 보고 있는지 확인하세요.

무슨 일이 있었나 (세 조직의 공개 내용 기준)

아래는 모두 TanStack의 사후 보고서, Nx의 사후 보고서, GitHub의 발표에 적힌 내용입니다. 시간은 UTC입니다.

  1. 2026년 5월 11일 19:20~19:26

    TanStack의 Router/Start 저장소의 릴리스 워크플로를 통해 42개 패키지의 악성 버전 84개가 npm에 배포됨.
  2. 5월 11일 19:46

    외부 연구자가 TanStack 저장소에 상세 보고를 올림. TanStack이 대응 시작.
  3. 5월 11일 20:43

    Nx 기여자가 Nx와 무관한 프로젝트에서 pnpm install을 실행해 악성 @tanstack/zod-adapter@1.166.15를 받음. Nx에 따르면 GitHub CLI 토큰이 탈취돼 74초 안에 쓰임.
  4. 5월 11일 21:03까지

    TanStack이 84개 버전을 모두 사용 중단(deprecate) 처리.
  5. 5월 11일 22:13~23:55

    npm이 레지스트리에서 해당 tarball을 제거.
  6. 5월 15일

    TanStack이 현재 공개된 모든 버전은 안전하다고 발표.
  7. 5월 18일 12:30~13:09

    탈취된 기여자의 접근 권한으로 Nx Console v18.95.0이 확장 배포 경로 두 곳에 공개됐다가 내려짐.
  8. 5월 18일 (미국 시간 월요일)

    GitHub가 악성 VS Code 확장이 관련된 직원 기기 침해를 탐지·차단하고, 악성 확장 버전을 제거하고 해당 기기를 격리. 중요한 비밀값은 그날부터 다음 날에 걸쳐 교체.
  9. 5월 20일

    GitHub가 공개 발표. 유출된 것은 GitHub 내부 저장소뿐이라는 평가.
  10. 5월 21일

    Nx가 사후 보고서 공개.
  11. 5월 26일

    GitHub가 게시물을 업데이트. GitHub Enterprise Server 서명 키를 포함한 키 교체와 관리자 조치 사항을 안내.
84개 버전
TanStack 악성 버전 (42개 패키지 × 2)
약 39분
Nx Console v18.95.0이 배포돼 있던 시간 (두 경로 합계)
7일
Nx에 따르면 탈취된 토큰이 Nx 저장소에서 활동한 기간
조치 불필요
GitHub Enterprise Cloud 고객 (GitHub 기준)
세 조직이 공개한 내용
TanStack: 범위
Router/Start 저장소의 42개 패키지, 84개 버전. Query, DB, Store, Table, Form, Virtual 등 다른 저장소는 영향 없음. TanStack은 npm 토큰이 탈취됐다는 증거는 없다고 설명
TanStack: 코드가 한 일
설치 시 스크립트로 실행돼 클라우드, Kubernetes, Vault, npm, GitHub, SSH 인증 정보를 수집해 외부로 보내고, 피해자가 관리하는 다른 패키지로 퍼지려고 함
TanStack: 근본 원인
(1) pull_request_target에서 포크 코드를 빌드, (2) 그 잡이 릴리스 워크플로가 복원하는 캐시에 쓸 수 있었음, (3) 릴리스 워크플로가 배포 가능한 OIDC 토큰을 발급받을 수 있었음, 이 세 가지의 조합
Nx: 범위
Nx Console v18.95.0만(v18.100.0 이후는 안전). Nx CLI, 공식 @nx/* 플러그인, Nx Cloud는 영향 없음. 공식 마켓플레이스 집계는 설치 28건, 두 번째 경로는 다운로드 41건. Nx 자체 분석으로는 약 6,000건 활성화가 있었으며, 차이는 아직 확인 중
Nx: 근본 원인
(1) 상류인 TanStack의 침해, (2) 오래된 pnpm이 조용히 무시한 릴리스 경과 기간 설정, (3) 디스크에서 읽을 수 있던 GitHub CLI 토큰, (4) 기여자 한 명이 확장을 배포할 수 있었던 파이프라인
GitHub: 범위
평가: GitHub 내부 저장소만 유출. 고객 자신의 엔터프라이즈, 조직, 저장소 등 그 밖에 저장된 고객 정보에 영향이 있다는 증거는 없음. 일부 내부 저장소에는 지원 문의 내용 발췌 같은 고객 정보가 포함돼 있음
GitHub: 대응
악성 확장 버전을 제거하고 해당 기기를 격리. 영향이 큰 것부터 중요한 비밀값을 교체. GitHub Enterprise Server 서명 키를 포함한 키를 교체하고 관리자에게 공개 키 교체를 요청. 조사가 끝나면 더 자세한 보고서를 공개하겠다고 밝힘

읽는 법: 'GitHub에서 빠져나간 저장소 수'는 GitHub 자신의 수치가 아니다

GitHub의 게시물에는 유출된 저장소 수가 언급되지만, GitHub는 그 수치를 공격자의 주장으로 소개하며 지금까지의 조사와 "directionally consistent"(대체로 같은 방향)하다고만 밝혔습니다. 이 사이트는 공격자의 주장을 사실로 다루지 않으므로 그 수치를 옮기지 않습니다. 마찬가지로 Nx도 설치 수치가 출처마다 다르며 아직 확인 중이라고 밝혔습니다. 어떤 숫자보다 그 시간대에 영향받은 버전을 갖고 있었는가로 판단하세요.

연쇄를 어디서 끊을 수 있었나

1. TanStack의 CI

외부 PR 코드가 릴리스와 공유하는 캐시에 씀

↓

여기서 끊기

pull_request_target 금지 / 배포 워크플로에서 캐시 복원 금지 / 배포에 승인

2. 악성 npm 버전 84개

정상 경로로 배포돼 진짜처럼 보임

↓

여기서 끊기

릴리스 경과 기간 대기 — 그 설정을 지키는 도구 버전에서

3. Nx 기여자의 기기

디스크의 파일에서 GitHub CLI 토큰을 읽음

↓

여기서 끊기

평문 토큰 파일 금지 / 감사 로그의 삭제 감시

4. Nx Console v18.95.0

한 사람의 접근 권한으로 확장 배포

↓

여기서 끊기

실행한 사람이 아닌 다른 사람의 승인 필수

5. GitHub 직원 기기

악성 확장, 이어서 내부 저장소 유출

↓

여기서 끊기

확장 업데이트를 의존성처럼 다루기 (다음 절)

세 조직의 공개 내용을 바탕으로 재구성한 연쇄. 오른쪽 열은 각 단계에서 연쇄를 끊을 수 있었던 설정이나 정책입니다(조직들이 사후에 도입한 조치 포함).

이번에 안전의 증거가 되지 못한 것

  • 정상 배포 경로와 출처 증명: TanStack의 악성 버전은 유효한 OIDC 연결에서 나옴
  • 실제 기여자 계정: Nx Console은 진짜 기여자의 접근 권한으로 공개됨
  • 배포 경로의 자동 검사: Nx에 따르면 변조된 버전은 공식 마켓플레이스의 자동 검증을 통과함
  • 설정은 했지만 실제로는 적용되지 않은 설정: 릴리스 경과 기간 설정이 오래된 pnpm에서 조용히 무시됨

연쇄를 끊을 수 있었던 것 (사후 보고서 기준)

  • 배포 전 두 번째 사람의 승인: Nx는 다른 저장소에는 이미 있었지만 Nx Console에는 없었음
  • 배포 워크플로와 캐시의 분리: TanStack은 사후에 캐시를 끔
  • 실제로 동작하는 릴리스 경과 기간 대기: 악성 버전은 설치 시점에 공개 77분째였음
  • 일상적인 배포 알림을 사람이 읽는 것: Nx가 발견한 유일한 계기

이 사이트의 시각: 확장 자동 업데이트는 의존성 자동 반영과 같다

npm 의존성에서는 "최근 며칠 안에 공개된 것은 설치하지 않는다"가 일반적인 관행이 돼 가고 있습니다. 하지만 에디터 확장은 대개 기본값으로 자동 업데이트되며, 같은 생각이 아직 따라가지 못했습니다. 그래서 Nx는 자동 업데이트를 켠 사람은 침해를 전제로 하라고 썼습니다. 게다가 확장은 GitHub와 클라우드 인증 정보가 있는 기기에서 내 권한으로 실행됩니다. 운영 환경이나 패키지 배포 권한을 가진 기기에서는 VS Code의 extensions.autoUpdate 설정으로 자동 업데이트를 끄고 며칠 지난 뒤 직접 업데이트하는 것을 검토하세요. 보안 수정이 늦어지는 비용은 있지만, 이번처럼 공개 몇 분 만에 내려진 버전은 기다리는 것만으로 피할 수 있습니다.

한 가지 더. 이 연쇄는 조직의 경계를 넘었습니다. Nx 기여자는 Nx와 무관한 프로젝트에서 악성 패키지를 설치했고, GitHub 직원은 Nx의 확장을 설치했습니다. 내 개발 기기는 회사 프로젝트만이 아니라, 내가 코드를 보내는 모든 프로젝트의 공급망의 일부입니다.

출처 (공개 기록)

이 글의 사실관계는 아래 공개 자료를 따릅니다. 공격 기법이나 공격자를 특정하는 정보는 다루지 않았습니다.

  • TanStack, "Postmortem: TanStack npm supply-chain compromise"(2026년 5월 11일 공개, 5월 15일 업데이트) — tanstack.com
  • TanStack, "Hardening TanStack After the npm Compromise"(사고 후 변경 사항) — tanstack.com
  • GitHub Advisory Database, "GHSA-g7cv-rxg3-hmpx (CVE-2026-45321)"(영향받은 버전 전체 목록) — github.com
  • Nx, "Postmortem: Nx Console v18.95.0 supply-chain compromise"(2026년 5월 21일) — nx.dev
  • Nx Console 보안 권고 "GHSA-c9j4-9m59-847w" — github.com
  • GitHub, "Investigation update: GitHub Enterprise Server signing key rotation"(2026년 5월 20일 공개, 5월 26일 업데이트) — github.blog
  • GitHub Security Lab, "Keeping your GitHub Actions and workflows secure: Preventing pwn requests"(pull_request_target의 안전한 사용) — securitylab.github.com
  • GitHub Docs, "Managing environments for deployment"(필수 검토자) — docs.github.com

업데이트 기록

2026-09-30: 첫 공개. TanStack의 사후 보고서(5월 15일 개정), Nx의 사후 보고서(5월 21일), GitHub의 발표(5월 26일 업데이트)를 바탕으로 작성. GitHub는 조사가 끝나면 더 자세한 보고서를 공개하겠다고 밝혔으며, 공개되면 이 글을 업데이트하겠습니다.

다음에 읽을 글

FAQ

Q어떤 TanStack 패키지가 침해됐나요?
A

TanStack의 사후 보고서에 따르면 Router/Start 저장소에서 배포되는 42개 패키지가 각각 2개 버전씩, 총 84개 버전이 영향을 받았습니다(예: @tanstack/react-router 1.169.5와 1.169.8, @tanstack/history 1.161.9와 1.161.12). 전체 목록은 GitHub 보안 권고 GHSA-g7cv-rxg3-hmpx(CVE-2026-45321)에 있습니다. Query, Table, Form, Virtual 등 다른 저장소의 패키지는 영향을 받지 않았으며, TanStack은 현재 공개된 모든 버전은 안전하게 설치할 수 있다고 밝혔습니다.

Q영향받은 버전을 설치했다면 무엇을 해야 하나요?
A

TanStack은 2026년 5월 11일(UTC)에 영향받은 버전을 설치한 사람은 설치한 호스트에서 접근할 수 있던 AWS, GCP, Kubernetes, Vault, GitHub, npm, SSH 인증 정보를 교체할 것을 강력히 권고합니다. 코드가 설치 중에 실행됐기 때문에 개발자 PC뿐 아니라 CI 러너도 해당합니다.

QNx Console을 쓰고 있습니다. 영향을 받았나요?
A

Nx의 사후 보고서에 따르면 영향받은 것은 Nx Console v18.95.0뿐이며, 2026년 5월 18일 12:30부터 13:09(UTC) 사이에 배포됐습니다. v18.100.0 이후는 안전합니다. Nx는 이 시간대에 자동 업데이트를 켠 상태로 Nx Console을 설치하고 있던 사람은 그 기기를 침해된 것으로 보고 모든 인증 정보를 교체하라고 요청합니다. Nx CLI(nx 패키지), 공식 @nx/* 플러그인, Nx Cloud는 영향을 받지 않았습니다.

QGitHub 사용자의 저장소가 유출됐나요?
A

GitHub에 따르면 이번 활동은 GitHub 내부 저장소의 유출만 포함하며, 고객 자신의 엔터프라이즈, 조직, 저장소 등 내부 저장소 밖에 저장된 고객 정보에 영향이 있다는 증거는 없습니다. 일부 내부 저장소에는 지원 문의 내용 발췌 같은 고객 정보가 포함돼 있으며, GitHub는 영향이 확인되면 기존 경로로 고객에게 알리겠다고 밝혔습니다. GitHub Enterprise Cloud 고객은 별도 조치가 필요 없습니다.

QGitHub Enterprise Server 관리자는 무엇을 해야 하나요?
A

GitHub는 5월 26일 업데이트에서 GitHub Enterprise Server 업데이트 패키지 서명에 쓰는 키를 포함해 키를 교체하고 있다고 밝히고, 관리자에게 인스턴스의 GPG 공개 키를 교체하라고 요청했습니다. 교체하지 않으면 앞으로의 업그레이드가 검증에 실패합니다. 절차와 보조 스크립트의 SHA256 다이제스트는 GitHub의 게시물에 있습니다. GitHub는 GHES 업데이트를 공식 경로에서만 내려받으라고도 요청합니다.

Q세 사건은 연결돼 있나요?
A

TanStack과 Nx의 연결은 Nx의 사후 보고서에 적혀 있습니다. 5월 11일 Nx 기여자가 Nx와 무관한 프로젝트에서 pnpm install을 실행해 침해된 @tanstack/zod-adapter 1.166.15를 받았고, GitHub CLI 토큰이 탈취됐습니다. GitHub의 게시물은 직원 기기를 침해한 '악성 VS Code 확장'을 Nx Console 보안 권고로 링크하고 있습니다.

Q근본 원인은 무엇이었나요?
A

TanStack의 사후 보고서는 함께 작동해야만 성립한 세 가지 약점을 듭니다. pull_request_target 워크플로가 포크의 풀 리퀘스트 코드를 빌드했고, 그 잡이 릴리스 워크플로와 공유하는 GitHub Actions 캐시에 쓸 수 있었으며, 릴리스 워크플로가 npm 배포에 쓰이는 OIDC 토큰(CI 실행마다 발급되는 단기 토큰)을 발급받을 수 있었습니다. Nx는 오래된 pnpm 버전이 조용히 무시한 릴리스 경과 기간 설정, 로컬의 어떤 프로세스든 읽을 수 있는 곳에 저장된 토큰, 한 사람이 확장을 배포할 수 있었던 파이프라인을 듭니다.