REPO DEEP DIVE · 2026-07-29 · GOOGLECHROME/LIGHTHOUSE · 웹페이지 품질을 자동으로 재는 구글의 잣대

GoogleChrome/lighthouse 딥다이브
"내 웹사이트, 얼마나 건강한가"를 자동으로 검진하는 도구

Lighthouse는 구글이 만든 오픈소스 웹페이지 품질 자동 감사(audit) 도구다. 어떤 URL이든 넣으면 크롬을 띄워 그 페이지를 실제로 로딩해보고, 성능·접근성·모범 사례·검색엔진 최적화(SEO) 항목을 자동으로 채점해 0~100점 리포트를 만들어준다.

가장 큰 특징은 이 도구가 혼자 도는 앱이 아니라 "엔진"이라는 점이다. 크롬 개발자도구(DevTools)의 Lighthouse 패널, 구글 검색 결과에 뜨는 PageSpeed Insights, 터미널에서 쓰는 CLI, Node.js 코드에서 부르는 API가 전부 이 하나의 엔진을 공유한다. 2026년에는 여기에 AI 에이전트가 웹사이트를 얼마나 잘 이해하는지를 검사하는 "Agentic Browsing" 카테고리까지 새로 생겼다.

(저장소 GoogleChrome/lighthouse · 제작/유지 Google Chrome 팀 · 라이선스 Apache-2.0 · 버전 13.4.1 · Node.js 기반, Puppeteer + Chrome DevTools Protocol 사용 · 소스 파일 약 1,500여 개(감사 규칙만 171개) · 최신 커밋 d1af2ee(2026-07-28) · 정리 기준일 2026-07-29)
목차
  1. 한 줄 정체
  2. 왜 지금 주목받는가
  3. 무엇을 해결하나
  4. 전체 구조
  5. 핵심 설계·동작 원리
  6. 기술 스택 · 의존성
  7. 설치 · 요구사항
  8. 실제 사용 흐름
  9. 함정 · 오해 방지
  10. 대안 비교
  11. 정리 · 누가 쓰면 좋은가

1한 줄 정체

"페이지를 실제로 로딩해보고 채점하는" 자동 감사 도구 — 자기 자신은 화면이 없다

Lighthouse는 웹페이지를 대상으로 하는 자동 건강검진기다. URL 하나를 주면 ① 실제 크롬 브라우저를 뒤에서 띄워 그 페이지를 로딩하고, ② 로딩되는 동안 벌어지는 일(네트워크 요청, 화면이 그려지는 순간, 자바스크립트 실행 시간 등)을 기록하고, ③ 그 기록을 미리 정해둔 171개의 검사 규칙(Audit)에 대입해 점수를 매기고, ④ 사람이 읽을 수 있는 리포트(HTML·JSON)로 뽑아준다.

리포트는 크게 네 개(+신규 하나) 카테고리로 나뉜다: Performance(성능), Accessibility(접근성 — 시각·청각 장애인도 쓸 수 있는가), Best Practices(웹 개발 모범 사례), SEO(검색엔진 최적화), 그리고 2026년에 새로 생긴 Agentic Browsing(AI 에이전트 대응력). 각 카테고리는 0~100점 게이지 하나로 요약된다.

중요한 점은 Lighthouse가 독립 실행형 앱이 아니라 재사용되는 엔진이라는 것이다. 크롬 개발자도구의 "Lighthouse" 탭, 구글의 PageSpeed Insights 웹사이트, 터미널의 lighthouse 명령어, Node.js 코드에서 쓰는 프로그래밍 API가 모두 저장소 core/ 아래의 같은 엔진 코드를 공유한다.

한 줄 비유

"자동차 정기검진소"가 웹페이지에도 있다면, 그게 Lighthouse다

정기검진소는 차를 직접 몰아보고(주행 데이터를 재고), 배출가스·제동력·타이어 상태 같은 정해진 항목표에 하나씩 대조해 점수를 매긴 뒤 "정비가 필요한 부분"을 알려준다.

Lighthouse는 이 검진소를 웹페이지용으로 만든 것이다. 크롬이라는 "테스트 주행차"로 페이지를 한 번 몰아보고, 미리 정해둔 171개 항목표에 대조해 성능·접근성·SEO 점수를 매기고 개선점을 알려준다.

용어
감사 (Audit)
Lighthouse에서 "감사"란 하나의 구체적인 검사 규칙을 말한다. 예를 들어 "이미지에 alt 속성이 있는가", "첫 콘텐츠가 얼마나 빨리 그려지는가" 같은 개별 항목 하나하나가 audit이다. Lighthouse에는 이런 감사 규칙이 171개 있다.
용어
CDP (Chrome DevTools Protocol · 크롬 개발자도구 프로토콜)
외부 프로그램이 크롬 브라우저를 원격으로 조종하고, 그 안에서 벌어지는 일(네트워크·화면·자바스크립트 실행)을 실시간으로 엿볼 수 있게 해주는 표준 통신 규약. Lighthouse가 크롬을 "리모컨으로 조종하며 관찰"하는 방법이 바로 이것이다.

2왜 지금 주목받는가

Core Web Vitals가 검색 순위에 반영되는 시대 · AI 에이전트가 웹을 "읽는" 시대

Lighthouse는 2016년에 나온 오래된 프로젝트지만, 2026년 현재도 계속 주목받는 이유가 뚜렷하다. 크게 세 가지 흐름이 겹쳐 있다.

① Core Web Vitals가 "느낌"이 아니라 "숫자"가 됐다

구글은 Core Web Vitals(핵심 웹 바이탈)라는 세 가지 성능 지표 — LCP(가장 큰 콘텐츠가 그려지는 시각)·CLS(레이아웃이 갑자기 흔들리는 정도)·INP(사용자 조작에 반응하는 속도) — 를 검색 순위에도 영향을 주는 공식 지표로 삼았다. "우리 사이트 느린 것 같다"는 감이 아니라 구체적인 밀리초 숫자로 관리해야 하는 시대가 됐고, Lighthouse는 이 숫자를 재는 가장 표준적인 무료 도구다.

② "AI 에이전트가 웹을 읽는다"는 새로운 과제 — Agentic Browsing

실제 소스코드를 보면 2026년에 새로 생긴 agentic-browsing 카테고리와 webmcp-* 감사 규칙들을 확인할 수 있다(core/audits/webmcp-schema-validity.js 등, 저작권 표기 2026년). 이건 "사람이 아니라 AI 에이전트가 이 페이지를 방문했을 때 제대로 이해하고 조작할 수 있는가"를 검사하는 완전히 새로운 관점이다. /llms.txt 파일이 있는지 확인하는 감사, WebMCP(웹용 Model Context Protocol) 스키마가 올바른지 검증하는 감사가 대표적이다. "검색엔진 최적화(SEO)" 다음으로 "에이전트 최적화"라는 새 과제가 등장했음을 보여주는 신호다.

③ "한 번의 측정"이 아니라 "파이프라인에 박아 넣는" 문화

성능 예산(performance budget)을 CI(지속적 통합)에 넣어 "이 커밋이 페이지를 느리게 만들면 빌드를 막는다"는 문화가 자리잡으면서, Lighthouse는 사람이 가끔 눌러보는 도구에서 자동화 파이프라인의 부품으로 역할이 커졌다. Node API·CI 액션·Lighthouse CI 같은 주변 생태계가 이런 흐름을 뒷받침한다.

경쟁 지형에서 Lighthouse의 위치
"측정 엔진의 표준" — 다른 도구들이 이걸 가져다 쓴다

WebPageTest·PageSpeed Insights처럼 성능을 재는 서비스는 여럿 있지만, 그중 상당수가 내부적으로 Lighthouse 엔진을 그대로 가져다 쓰거나 참고한다(PageSpeed Insights가 대표적). "독자적인 1등 도구"라기보다는 웹 품질 측정의 공용 기준선(baseline)에 가깝다는 점이 Lighthouse의 진짜 위치다.

3무엇을 해결하나

"느낌"이 아니라 "재현 가능한 측정" · 사람이 매번 확인하던 체크리스트의 자동화

Lighthouse 이전, 웹 성능·접근성 점검은 개발자가 직접 개발자도구를 열고, 눈으로 로딩을 지켜보고, 감으로 판단하는 일이 많았다. "이 페이지 느린 것 같다"는 말은 있어도 "왜 느린지, 얼마나 느린지, 무엇부터 고쳐야 하는지"를 숫자로 답하기는 어려웠다. Lighthouse가 푸는 문제는 크게 세 가지다.

① 체크리스트의 자동화

"이미지에 대체 텍스트가 있는가", "HTTPS를 쓰는가", "메타 description이 있는가" 같은 항목은 사람이 페이지마다 일일이 확인하기엔 지루하고 실수하기 쉽다. Lighthouse는 이런 171개 항목을 크롬으로 페이지를 열어본 뒤 기계적으로, 빠짐없이 확인한다.

② "몇 번을 재도 비슷한 숫자가 나오게" 만드는 재현성

같은 페이지라도 회선 상태·기기 성능에 따라 로딩 시간이 매번 다르게 느껴진다. Lighthouse는 가상의 느린 회선·느린 CPU를 시뮬레이션(뒤에서 설명할 Lantern)해서, 인터넷 환경이 다른 두 사람이 같은 페이지를 재도 비교적 비슷한 점수가 나오도록 만든다. 완벽하진 않지만(9번 섹션에서 한계도 다룬다), "감"보다는 훨씬 일관된 기준선을 제공한다.

③ "어디서든 같은 엔진" — 도구 파편화 방지

Lighthouse가 하나의 공용 엔진으로 자리잡으면서, 크롬 개발자도구·PageSpeed Insights·터미널 CLI·CI 파이프라인이 서로 다른 도구인데 같은 채점 기준을 쓰게 됐다. 이는 "이 도구에선 90점인데 저 도구에선 60점"이라는 혼란을 크게 줄여준다.

비유

사람 몸무게를 잴 때 집 체중계·병원 체중계·헬스장 체중계가 서로 다른 숫자를 보여주면 신뢰하기 어렵다. Lighthouse는 "웹페이지 체중계"를 하나로 통일해, 어디서 재든 같은 기준을 쓰게 만드는 역할이다.

4전체 구조

Gatherer(수집) → Audit(판정) → Category/Scoring(점수) → Report(보고), 4단 파이프라인

실제 저장소를 열어보면 Lighthouse의 구조는 정확히 4단 파이프라인으로 나뉘어 있고, 각 단계가 폴더 하나씩과 정확히 대응한다. 이건 문서의 설명이 아니라 core/ 디렉터리를 직접 열어 확인한 사실이다.

┌────────────────────────────────────────────────────────────────┐ │ LIGHTHOUSE 4단 파이프라인 (core/ 기준) │ └────────────────────────────────────────────────────────────────┘ [1] GATHER (core/gather/) # "수집" — 크롬에서 원재료를 모은다 driver.js + driver/*.js → Puppeteer + CDP로 크롬을 조종 gatherers/*.js (30여 개) → 각자 한 가지 artifact를 수집 navigation-runner.js / timespan-runner.js / snapshot-runner.js │ 결과물: Artifacts (trace.json · devtoolslog.json · DOM 스냅샷 등) ▼ [2] AUDIT (core/audits/, 171개 파일) # "판정" — 원재료를 보고 점수를 매긴다 audit.js(베이스 클래스) 를 상속 Artifacts + Computed Artifacts(core/computed/) 를 입력받아 score(0~1) 하나를 반환 │ 결과물: AuditResult[] (각 감사의 점수·세부 정보) ▼ [3] CATEGORY / SCORING (core/config/default-config.js, core/scoring.js) config가 "이 카테고리엔 이 감사들을 이 가중치로 넣는다"를 정의 scoring.js 의 ReportScoring.arithmeticMean() 이 가중평균으로 점수 산출 │ 결과물: LHR (Lighthouse Result — 최종 JSON) ▼ [4] REPORT (report/) # "보고" — 사람이 읽을 형태로 report/generator → LHR을 HTML/JSON 파일로 포장 report/renderer → 브라우저에서 그 HTML을 그리는 실제 UI 코드

"수집(Gather) → 판정(Audit) → 점수화(Category/Scoring) → 보고(Report)"라는 4단계가 폴더 구조 그대로 드러난다. 각 단계는 다음 단계가 필요로 하는 딱 그만큼의 데이터만 넘겨주는 방식으로 느슨하게 연결돼 있어서, 예를 들어 "감사 규칙 하나만 새로 추가"하는 작업이 나머지 세 단계를 건드리지 않고 가능하다.

용어
Artifact (아티팩트)
수집(Gather) 단계가 만들어내는 "원재료" 데이터. 예: 페이지의 모든 이미지 태그 목록, 콘솔 에러 로그, 네트워크 요청 기록, 브라우저 성능 추적(trace) 파일 등. 감사(Audit)는 이 원재료를 받아서 채점만 한다 — 직접 크롬을 조종하지 않는다.
용어
LHR (Lighthouse Result)
Lighthouse 실행이 끝나면 나오는 최종 결과 JSON 객체의 공식 이름. 카테고리 점수, 개별 감사 결과, 원본 아티팩트 요약이 전부 이 안에 들어 있다. HTML 리포트는 이 LHR을 사람이 보기 좋게 그린 것일 뿐이다.

5핵심 설계 · 동작 원리

Gatherer 인터페이스 · 채점 산식 · 세 가지 실행 모드 · Lantern 시뮬레이션 · CDP 함정 · 신규 Agentic 카테고리

이 섹션이 이 문서에서 가장 두꺼운 이유는, Lighthouse의 진짜 가치가 "무엇을 검사하는가"보다 "어떻게 하면 브라우저를 매번 다르게 만들지 않고 일관되게 관찰할 것인가"라는 엔지니어링 문제를 정면으로 풀고 있기 때문이다. 하나씩 실제 코드로 확인해보자.

① Gatherer — "관찰만 하고 판단은 안 한다"는 원칙

core/gather/base-gatherer.js를 열어보면 모든 Gatherer가 상속하는 베이스 클래스가 놀랍도록 단순하다. startInstrumentation(관찰 시작) → startSensitiveInstrumentation(민감한 구간 관찰 시작) → stopSensitiveInstrumentationstopInstrumentation(관찰 종료) → getArtifact(최종 데이터 반환), 이 다섯 개 메서드 뼈대뿐이다. "민감한(sensitive)" 계측을 따로 분리해둔 이유는 Lighthouse 자신이 페이지에 끼치는 영향을 최소화하려는 것 — 성능을 재는 도구 자신이 성능을 왜곡하면 안 되기 때문이다.

// core/gather/base-gatherer.js (뼈대만 발췌)
class BaseGatherer {
  meta = {supportedModes: []};  // navigation / timespan / snapshot 중 어디서 쓰이는지

  startInstrumentation(passContext) { }          // 관찰 시작
  startSensitiveInstrumentation(passContext) { }  // 성능에 민감한 구간만 별도로 시작
  stopSensitiveInstrumentation(passContext) { }
  stopInstrumentation(passContext) { }
  getArtifact(passContext) { }                    // 최종 데이터 반환
}

실제로 core/gather/gatherers/ 아래에는 accessibility.js(axe-core 실행 결과)·console-messages.js(콘솔 로그)·trace.js(성능 추적 파일)·image-elements.js(이미지 태그 정보) 등 약 30여 개의 Gatherer가 있으며, 각자 정확히 한 가지 원재료만 책임진다. 하나의 페이지 로딩 동안 이 Gatherer들이 동시에 관찰을 진행한다.

② Audit — 점수는 항상 0~1 사이, "적용 불가"라는 특수 처리가 있다

core/audits/audit.jsAudit.SCORING_MODES를 보면 각 감사는 NUMERIC(숫자 기준 점수)·BINARY(통과/실패)·NOT_APPLICABLE(이 페이지엔 해당 없음)·INFORMATIVE(정보 제공용, 채점 안 함)·MANUAL(사람이 직접 확인해야 함) 중 하나로 동작한다. NOT_APPLICABLE·INFORMATIVE·MANUAL인 항목은 가중치가 강제로 0이 돼 최종 점수 계산에서 빠진다 — 예를 들어 페이지에 표(table)가 없으면 "표 관련 접근성 감사"는 채점에서 제외되고 리포트엔 "해당 없음"으로만 표시된다.

용어
METRIC_SAVINGS_PRECISION
audit.js 안에 정의된 상수로, FCP·LCP·INP·TBT는 50ms 단위, CLS는 0.001 단위로 개선폭을 반올림한다는 규칙. "이 항목을 고치면 몇 ms 빨라질까"를 리포트에 표시할 때 쓰인다.

③ Category/Scoring — 성능 점수의 실제 가중치 (문서보다 코드가 먼저다)

카테고리 점수가 어떻게 계산되는지는 core/scoring.jsReportScoring.arithmeticMean() 딱 한 함수에 담겨 있다. 원리는 단순한 가중평균이다: 감사마다 정해진 weight(가중치)를 곱해 합산하고, 가중치 합으로 나눈다. 앞서 말한 대로 "해당 없음" 판정을 받은 감사는 가중치가 0으로 바뀌어 이 계산에서 자동으로 빠진다.

// core/scoring.js — 가중평균 산식 (실제 코드 그대로)
static arithmeticMean(items) {
  items = items.filter(item => item.weight > 0);      // 가중치 0은 애초에 제외
  if (items.some(item => item.score === null)) return null;

  const results = items.reduce((result, item) => ({
    weight: result.weight + item.weight,
    sum: result.sum + item.score * item.weight,
  }), {weight: 0, sum: 0});

  return clampTo2Decimals(results.sum / results.weight || 0);
}

그리고 core/config/default-config.js에서 실제로 확인한 2026년 기준 Performance(성능) 카테고리의 실제 가중치는 아래 표와 같다. 블로그 글이나 오래된 강의 자료에는 다른 숫자가 적혀 있을 수 있는데, 이 가중치는 종종 바뀌므로 진짜 진실은 항상 이 파일 하나라는 점이 중요하다.

지표가중치의미
TBT(Total Blocking Time)30%메인 스레드가 입력에 응답 못 하고 막혀 있던 총 시간
LCP(Largest Contentful Paint)25%가장 큰 콘텐츠가 화면에 그려지는 시각
CLS(Cumulative Layout Shift)25%레이아웃이 예고 없이 흔들린 누적 정도
FCP(First Contentful Paint)10%첫 콘텐츠가 그려지는 시각
Speed Index10%화면이 시각적으로 채워지는 속도
INP(Interaction to Next Paint)0%실제 클릭 등 상호작용 반응 속도 — 아직 랩 환경에선 가중치 0(9번 섹션 참고)
코드 vs 흔한 오해
"INP가 이제 핵심 웹 바이탈이니 Lighthouse 점수에도 크게 반영된다"는 착각

구글 검색 순위용 필드 데이터 기준으로는 2024년부터 INP가 CLS를 대신해 핵심 웹 바이탈 3종에 들어갔다. 하지만 Lighthouse 랩 리포트의 Performance 점수에서는 INP 가중치가 여전히 0이다(default-config.js 실측). 이유는 랩 환경에선 진짜 사용자의 클릭이 없어 INP를 정확히 재현하기 어렵기 때문 — core/audits/metrics.js엔 실려도 점수엔 안 들어간다.

④ 세 가지 실행 모드 — navigation · timespan · snapshot

core/gather/ 아래에는 navigation-runner.js·timespan-runner.js·snapshot-runner.js 세 개의 실행 진입점이 나란히 있다. 예전 Lighthouse는 "페이지를 새로 열어서 처음부터 로딩을 재는" 것만 할 수 있었지만, 지금은 사용자 흐름(User Flow) 전체를 다룰 수 있다.

모드무엇을 잰다예시
navigation페이지를 처음부터 새로 로딩하는 과정 전체"홈페이지 접속 시 성능"
timespan이미 열려 있는 페이지에서 일정 시간 동안 벌어지는 일"검색창에 타이핑하는 동안의 반응성"
snapshot지금 이 순간의 페이지 상태 한 장"모달을 연 지금 화면의 접근성"

이 세 모드를 이어붙여 하나의 시나리오로 만드는 게 core/user-flow.jsUserFlow 클래스다. "홈페이지 로딩(navigation) → 검색어 입력(timespan) → 검색 결과 모달 확인(snapshot)"처럼, 실제 사용자가 겪는 다단계 흐름을 하나의 리포트로 묶어낼 수 있다. 이는 로그인 후 화면, SPA(단일 페이지 앱)의 페이지 전환처럼 "새로고침 없는" 상호작용을 재는 데 필수적이다.

용어
User Flow (사용자 흐름)
한 번의 페이지 로딩이 아니라, 로그인 → 장바구니 담기 → 결제 같은 여러 단계를 이어서 측정하는 Lighthouse 기능. navigation·timespan·snapshot 세 모드를 자유롭게 섞어 하나의 리포트로 만든다.

⑤ Lantern 시뮬레이션 — "진짜 3G가 아니라 계산으로 만든 3G"

Lighthouse의 기본 설정(core/config/constants.js 실측)은 throttlingMethod: 'simulate'다. 이건 실제로 회선 속도를 느리게 만드는 게 아니라, 빠른 회선으로 페이지를 한 번 받아본 뒤 "만약 느린 회선이었다면 각 리소스가 언제 도착했을지"를 그래프 알고리즘으로 계산하는 방식이다. 이 계산 엔진의 이름이 Lantern이다.

기본 프로필은 코드에서 직접 확인한 값 기준으로 왕복 지연시간(RTT) 150ms · 다운로드 속도 1.6Mbps · CPU 4배 느리게(cpuSlowdownMultiplier: 4)다(모바일 기준 "Slow 4G" 프로필). 페이지의 리소스 요청 관계를 하나의 의존성 그래프(dependency graph)로 만든 뒤, 이 그래프 위에서 네트워크·CPU 시뮬레이션을 동시에 굴려 "몇 초에 무엇이 그려질지"를 예측한다.

비유

실제로 느린 와이파이 환경을 만들어 매번 테스트하는 건 매번 다른 날씨에 시험 운전하는 것과 같아서 결과가 들쭉날쭉하다. Lantern은 대신 "맑은 날 찍은 주행 데이터"를 놓고 "비가 오면 이 구간은 이만큼 느려질 것이다"를 미리 계산된 물리 모델로 예측하는 쪽을 택했다 — 더 빠르고 더 일관되지만, 실제 빗길과 100% 같지는 않다.

코드에서 발견한 구조 변화
Lantern은 이제 Lighthouse "자체 코드"가 아니다

core/lib/lantern/lantern.js 파일을 열어보면 내용이 단 두 줄, export * from '@paulirish/trace_engine/models/trace/lantern/lantern.js'이다. 즉 시뮬레이션 알고리즘의 실체는 이제 크롬 개발자도구 팀이 관리하는 별도 npm 패키지(@paulirish/trace_engine, 크롬 DevTools Frontend의 trace 처리 엔진 일부)로 옮겨갔다. "Lantern은 Lighthouse 안에 있다"는 오래된 자료의 설명은 저장소 구조상 더는 정확하지 않다 — Lighthouse는 이제 이 로직을 가져다 쓰는 소비자에 가깝다.

⑥ CDP 사용 방식 — "이벤트 구독은 항상 enable보다 먼저"

Lighthouse는 puppeteer-core로 크롬에 연결한 뒤, core/gather/driver.js에서 page.target().createCDPSession()으로 저수준 CDP 세션을 직접 얻는다. 그 뒤 session.sendCommand('Page.enable')·session.sendCommand('Network.getResponseBody', ...)처럼 CDP 명령을 직접 호출한다. 즉 Puppeteer는 브라우저를 켜고 붙는 얇은 껍데기로만 쓰고, 실제 관찰은 CDP를 날것 그대로 다룬다.

docs/architecture.md가 공식적으로 남긴 함정 하나: CDP의 Domain.enable()먼저 호출한 뒤 이벤트를 구독하면 그 사이에 발생한 이벤트를 놓친다. 반드시 이벤트 리스너를 먼저 걸어두고 enable을 나중에 불러야 한다 — Node.js는 콜백을 동기적으로 등록하므로 이 순서가 실제로 안전하다.

// docs/architecture.md 에 실제로 적힌 경고 예시
// 이렇게 하면 안 됨 — enable 이후에 리스너를 걸면 그 틈의 이벤트를 놓친다
session.sendCommand('Security.enable').then(_ => {
  session.on('Security.securityStateChanged', state => { /* ... */ });
});

// 이렇게 해야 함 — 리스너를 먼저, enable을 나중에
session.on('Security.securityStateChanged', state => { /* ... */ });
session.sendCommand('Security.enable');

⑦ 랩(Lab) 데이터 vs 필드(Field) 데이터 — 이 저장소는 "랩" 전용이다

Lighthouse가 만드는 모든 점수는 랩 데이터(lab data)다 — 즉 "지금 이 순간, 이 한 대의 크롬으로, 한 번 시뮬레이션해서" 잰 값이다. 반면 실제 방문자 수백~수만 명의 진짜 로딩 경험을 모은 값은 필드 데이터(field data)라 부르고, 구글은 이를 CrUX(Chrome User Experience Report)라는 별도 데이터셋으로 따로 수집한다. report/renderer/report-utils.js에 실제로 "이 데이터는 여러 세션을 요약하는 필드 데이터와 달리, 단일 세션 하나에서 나온 것"이라는 안내 문구가 박혀 있을 만큼, Lighthouse 스스로도 이 차이를 리포트에 명시한다.

구분랩 데이터 (Lighthouse)필드 데이터 (CrUX 등)
측정 대상한 번의 시뮬레이션 실행실제 방문자 수백~수만 명
일관성비교적 일정(같은 조건 재현)기기·회선에 따라 들쭉날쭉
장점배포 전 미리 확인, 원인 진단(어떤 리소스가 느린지)까지 가능진짜 사용자의 실제 경험 반영
한계실사용 환경 다양성을 반영 못 함"왜 느린지" 원인은 알려주지 않음

⑧ 신규 — Agentic Browsing 카테고리(2026년 추가)

core/config/default-config.js'agentic-browsing' 항목과 core/audits/webmcp-schema-validity.js·webmcp-registered-tools.js·webmcp-form-coverage.js(파일 저작권 표기 2026년) 감사들이 이 새 카테고리를 구성한다. 대응하는 수집기 core/gather/gatherers/agentic/llms-txt.js는 페이지의 /llms.txt 경로를 직접 요청해 이 사이트가 AI 크롤러/에이전트를 위한 안내 파일을 제공하는지 확인한다. 사람이 보는 SEO 다음으로 "AI 에이전트가 보는 접근성"을 재는 시대가 코드로 이미 시작됐다는 실물 증거다.

배울 점
"실험적 기능은 weight 0으로 조용히 들어온다"는 패턴

새 카테고리가 생겨도 기존 성능·접근성 점수 계산 방식을 건드리지 않는다. Agentic Browsing은 완전히 독립된 카테고리로 추가됐고, INP처럼 아직 불확실한 지표는 가중치 0으로 "리포트엔 보이지만 점수엔 영향 없이" 조용히 실험된다. 큰 오픈소스 프로젝트가 새 기능을 안전하게 얹는 전형적인 방식이다.

6기술 스택 · 의존성

Node.js + Puppeteer-core + Chrome DevTools Protocol · 버전 진실원은 package.json

Lighthouse는 순수 Node.js(≥ 22.19) 프로그램이다. 프론트엔드 프레임워크 없이 자바스크립트/TypeScript 타입 주석만으로 작성돼 있고, 실행 시점에 별도의 크롬 브라우저가 필요하다. package.json에서 직접 확인한 런타임 의존성(26개) 중 핵심만 추리면 다음과 같다.

패키지역할
puppeteer-core크롬을 띄우고 붙는 얇은 제어 계층. 무거운 크롬 바이너리는 포함하지 않는 "core" 버전
devtools-protocolCDP 명령·이벤트의 타입 정의(버전이 특정 크롬 빌드에 고정됨)
chrome-launcher로컬에 설치된 크롬을 찾아 실행 옵션과 함께 띄워주는 유틸리티
@paulirish/trace_engine성능 추적(trace) 파싱 + Lantern 시뮬레이션의 실제 구현체(크롬 DevTools Frontend에서 옮겨온 코드)
axe-core접근성 감사의 실질 엔진 — 유명한 오픈소스 접근성 검사 라이브러리를 그대로 내장
csp_evaluator콘텐츠 보안 정책(CSP) 헤더의 안전성을 분석
third-party-web / js-library-detector페이지에 들어간 광고·분석 스크립트, 사용 중인 JS 라이브러리를 식별
web-features웹 표준 기능별 브라우저 지원 현황 데이터(Baseline 감사에 사용)
speedline-coreSpeed Index(화면이 시각적으로 채워지는 속도) 계산
yargsCLI 명령줄 인자 파싱

개발 의존성(devDependencies)은 79개로, 빌드 도구(esbuild 계열)·타입 검사(TypeScript)·테스트(Mocha)·문서 생성 도구가 대부분을 차지한다. 라이선스는 Apache License 2.0이며, 저장소 전역에 이 라이선스 헤더가 파일마다 반복해서 박혀 있다.

용어
버전 진실원 (single source of truth)
여러 곳에 버전이 적혀 있을 때 "진짜 기준"이 되는 한 곳. Lighthouse는 루트의 package.json "version" 필드가 그 진실원이며, CLI의 --version, npm 배포판 버전, 리포트 하단의 버전 표시가 전부 여기서 나온다.

7설치 · 요구사항

Node 22.19+ · 로컬 크롬(또는 자동 다운로드) · CLI 한 줄이면 끝
항목요구사항
Node.js22.19 이상(package.jsonengines.node 실측)
브라우저크롬(또는 크로미움 계열). chrome-launcher가 로컬 설치본을 자동으로 찾아 실행. 없으면 puppeteer로 별도 다운로드도 가능
설치(전역 CLI)npm install -g lighthouse
설치 없이 1회 실행npx lighthouse https://example.com
Node API로 사용import lighthouse from 'lighthouse' — 코드에서 직접 흐름 제어
브라우저에서 바로크롬 개발자도구 > Lighthouse 탭(별도 설치 불필요, 크롬 내장)
웹으로만 확인PageSpeed Insights(pagespeed.web.dev)에 URL만 입력 — 설치 자체가 필요 없음
주의
"크롬이 있어야 돈다"는 것을 잊기 쉽다

Lighthouse는 크롬을 흉내 내는 게 아니라 진짜 크롬을 백그라운드에서 실행해 측정한다. 서버·컨테이너(Docker, CI 환경)에서 돌릴 땐 GUI 없이 크롬을 띄우는 --headless=new 옵션과 함께, 컨테이너 안에 크롬(또는 크로미움)이 설치돼 있는지, 필요한 리눅스 의존 라이브러리(폰트·GPU 관련 패키지 등)가 있는지 먼저 확인해야 한다. 이 부분에서 CI 셋업 실패가 가장 흔하다.

8실제 사용 흐름

터미널 한 줄 → 리포트 확인 → CI에 박아넣기 → User Flow로 다단계 측정
흐름 ①

터미널에서 가장 빠르게 한 번 측정하기

설치 없이 바로 시도할 수 있다. 실행이 끝나면 같은 폴더에 .report.html 파일이 생기고, 더블클릭하면 브라우저에서 점수 게이지와 각 감사 결과를 확인할 수 있다.

npx lighthouse https://example.com --view

--view는 리포트가 완성되자마자 자동으로 브라우저로 열어주는 옵션이다. 복사만 하면 바로 실행된다.

흐름 ②

크롬 개발자도구에서 클릭 몇 번으로

설치가 전혀 필요 없는 가장 쉬운 경로다. 크롬에서 F12(또는 우클릭 → 검사)로 개발자도구를 열고, 상단 탭에서 Lighthouse를 찾아 카테고리를 체크한 뒤 "Analyze page load" 버튼만 누르면 된다. 지금 열려 있는 그 탭을 그대로 측정한다.

흐름 ③

Node API로 여러 페이지를 자동 반복 측정

CLI 대신 코드로 직접 부르면, 측정 전후에 로그인 처리를 넣거나 여러 URL을 반복 처리하는 스크립트를 짤 수 있다.

import lighthouse from 'lighthouse';
import * as chromeLauncher from 'chrome-launcher';

const chrome = await chromeLauncher.launch({chromeFlags: ['--headless=new']});
const result = await lighthouse('https://example.com', {port: chrome.port});
console.log(result.lhr.categories.performance.score * 100);  // 0~100점
await chrome.kill();
흐름 ④

User Flow로 "로그인 후 화면"까지 측정

core/user-flow.jsUserFlow 클래스를 코드에서 직접 부르면, 여러 단계를 이어서 하나의 리포트로 만들 수 있다. 개념만 보면 아래와 같은 흐름이다(실제 API는 Puppeteer의 page 객체와 함께 쓰인다).

// 개념 설명용 의사코드 — 실제로는 puppeteer의 page와 함께 사용
flow.startNavigation()   // 1단계: 홈페이지 로딩(navigation 모드)
flow.startTimespan()     // 2단계: 검색창 타이핑 동안 반응성(timespan 모드)
flow.snapshot()          // 3단계: 검색 결과 모달의 접근성(snapshot 모드)
flow.generateReport()    // 세 단계를 하나의 리포트로 합쳐서 출력
흐름 ⑤

CI 파이프라인에 성능 예산 걸기

Lighthouse CI 같은 주변 도구를 붙이면, "이 커밋의 Performance 점수가 이전보다 5점 이상 떨어지면 빌드를 실패시킨다" 같은 규칙을 걸 수 있다. Lighthouse 저장소 자체도 .github/workflows/smoke.yml 등에서 매 커밋마다 수십 개 실제 테스트 페이지를 대상으로 스모크 테스트(smokehouse)를 돌려 회귀를 방지한다.

9함정 · 오해 방지

점수는 매번 달라진다 · 랩 데이터의 한계 · "100점 신화" 조심
함정 ①
"같은 페이지를 다시 재도 점수가 똑같이 나올 것"이라는 오해

Lighthouse의 공식 문서(docs/lantern.md)조차 스스로 이 점을 인정한다: 같은 페이지를 여러 번 측정한 점수의 95% 신뢰구간이 1회 측정 시 ±15점에 달할 수 있다(중앙값 50점 기준 35~65점 범위). 서버 부하, 백그라운드 프로세스, 기기 발열 등 미세한 변수가 매번 결과를 흔든다. 3회 측정하면 ±11점, 5회면 ±8점으로 줄어든다 — 즉 한 번 측정한 점수 하나만 믿지 말고, 여러 번 재서 중앙값을 보라는 것이 프로젝트 자체의 권고다.

함정 ②
"랩 데이터 점수 = 실제 사용자 경험"이라는 오해

Lighthouse 점수는 어디까지나 한 번의 시뮬레이션이다. 실제 방문자는 저사양 폰, 혼잡한 공용 와이파이, 캐시가 이미 쌓인 재방문 등 Lighthouse가 재현하지 않는 매우 다양한 조건에서 페이지를 연다. 100점이어도 실제 사용자 다수가 느리다고 느낄 수 있고, 반대의 경우도 있다. 진짜 사용자 경험을 보려면 CrUX 같은 필드 데이터를 같이 봐야 한다(10번 섹션 참고).

함정 ③
"점수만 올리면 된다"는 목표 왜곡

점수를 올리기 위해 감사 하나하나를 기계적으로 통과시키려다, 실제 사용자 경험과는 무관한 "점수용 최적화"에 매몰되는 경우가 있다. 예를 들어 이미지에 의미 없는 alt=""만 채워 접근성 감사를 통과시키는 식이다. Lighthouse는 "무엇을 점검해야 하는지 알려주는 체크리스트"이지, 그 자체가 목적이 되어서는 안 된다.

실전 팁
모바일(기본값)과 데스크탑 설정을 헷갈리지 않기

core/config/constants.js의 기본 설정은 모바일 화면 크기 + Slow 4G 시뮬레이션이다. 데스크탑에서 CLI로 그냥 실행해도 "느린 모바일 기준" 점수가 나온다는 뜻이다. 데스크탑 환경을 재고 싶다면 --preset=desktop 옵션을 명시해야 하며, 이걸 빼먹고 "우리 사이트 왜 이렇게 점수가 낮지"라고 오해하는 경우가 매우 흔하다.

10대안 비교

WebPageTest · PageSpeed Insights · CrUX · Sitespeed.io — 서로 다른 문제를 푼다
도구무엇이 다른가
PageSpeed Insights내부적으로 Lighthouse 엔진 + CrUX 필드 데이터를 함께 보여주는 구글의 웹 서비스. 설치가 필요 없고, "랩 데이터(Lighthouse)"와 "필드 데이터(CrUX)"를 한 화면에서 나란히 비교할 수 있다는 게 가장 큰 차이
CrUX (Chrome UX Report)Lighthouse처럼 페이지를 직접 로딩해보는 도구가 아니다. 실제 크롬 사용자 수백만 명의 익명 필드 데이터를 모아둔 데이터셋. Lighthouse의 "랩" 데이터와 정반대인 "필드" 데이터의 대표 격
WebPageTest전 세계 실제 위치의 실제 회선·실제 기기에서 측정 가능(시뮬레이션이 아닌 진짜 스로틀링). 폭포수(waterfall) 차트 등 더 깊은 네트워크 디버깅에 강하지만, Lighthouse만큼 "점수 하나로 요약"하는 데는 덜 초점이 맞춰져 있다
Sitespeed.io오픈소스 성능 측정 스위트로, 여러 브라우저(크롬 외 파이어폭스 등)를 지원하고 자체 호스팅해 대량의 URL을 배치로 모니터링하는 데 특화. Lighthouse보다 "직접 운영하는 대시보드" 성격이 강하다
크롬 개발자도구 성능 패널Lighthouse처럼 요약 점수를 주진 않지만, 프레임 단위·함수 호출 단위로 훨씬 상세한 실시간 프로파일링이 가능. "무엇이 느린지 점수로 알고 싶다"면 Lighthouse, "왜 느린지 코드 레벨로 파고들고 싶다"면 성능 패널
비유로 정리

Lighthouse는 "건강검진 결과표 한 장"이고, CrUX는 "건강보험공단이 모은 전 국민 통계"이며, WebPageTest는 "정밀 검진(MRI)", 개발자도구 성능 패널은 "수술실 안의 실시간 모니터"에 가깝다. 서로 대체재가 아니라 목적이 다른 도구들이며, Lighthouse는 그중 "가장 접근하기 쉬운 첫 검진표" 역할이다.

11정리 · 누가 쓰면 좋은가

웹 성능·접근성·SEO를 "숫자로" 관리하고 싶은 모든 사람에게

Lighthouse는 한 문장으로 "웹페이지의 성능·접근성·모범 사례·SEO를 크롬으로 직접 실행해보고 자동 채점하는 오픈소스 엔진"이다. 그 채점은 Gatherer(수집) → Audit(판정) → Category/Scoring(점수화) → Report(보고)라는 4단 파이프라인으로 구현돼 있고, 네트워크·CPU를 진짜로 늦추는 대신 Lantern이라는 그래프 시뮬레이션으로 예측한다는 게 가장 독특한 설계 결정이다. 2026년 들어서는 성능·접근성·SEO를 넘어 "AI 에이전트가 이 페이지를 이해할 수 있는가"까지 검사하는 Agentic Browsing 카테고리로 영역을 넓히고 있다.

이런 사람에게 좋다이유
프론트엔드 개발자배포 전 성능·접근성 회귀를 CI에서 자동으로 잡아내고 싶을 때
SEO 담당자 · 마케터검색 순위에 영향을 주는 Core Web Vitals를 정기적으로 확인하고 싶을 때
웹 접근성 담당자별도 스크린리더 없이도 기본적인 접근성 위반을 빠르게 스캔하고 싶을 때
오픈소스 아키텍처 학습자"관찰(Gather)과 판단(Audit)을 분리"하는 설계, 그래프 기반 시뮬레이션, 여러 실행 모드 조합 같은 실전 패턴을 큰 규모 코드에서 보고 싶을 때

다만 앞서 다룬 함정들 — 점수의 실행마다의 변동성, 랩 데이터와 실제 사용자 경험의 차이, 모바일 기본값 — 을 모르고 쓰면 숫자 하나에 일희일비하기 쉽다. Lighthouse는 "정답을 알려주는 도구"가 아니라 "어디를 봐야 할지 알려주는 체크리스트"로 다루는 것이 가장 안전한 사용법이다.