노트

Lighthouse 성능 점수 읽기

Lighthouse Performance Score

프런트엔드#performance#tooling · 연결된 개념 3개

쉽게 말하면

Lighthouse 성능 점수는 과목마다 비중이 다른 성적표의 평균 점수 같은 거예요. 다섯 지표를 각각 점수로 바꿔 가중 평균하니, 총점 하나보다 어느 과목이 깎였는지 보는 게 중요해요.

비유가 깨지는 곳 성적표와 달리 같은 페이지도 잴 때마다 점수가 흔들려서 여러 번 돌린 중앙값을 봐요. 한 지표를 고쳤더니 원래 있던 JS 비용이 측정 구간에 들어와 TBT가 뛰는 일도 있어요.

Lighthouse 성능 점수(0~100)는 랩(lab) 환경에서 잰 다섯 지표를 각각 점수로 바꾼 뒤 가중 평균한 값이다. 지표별 점수는 HTTP Archive의 실제 사이트 데이터로 만든 로그 정규 곡선에서 정해진다. 90 이상 초록, 50~89 주황, 49 이하 빨강이다.

가중치 (Lighthouse 10부터 2026년 13.x까지 동일)

지표가중치
TBT(Total Blocking Time)30%
LCP(Largest Contentful Paint)25%
CLS(Cumulative Layout Shift)25%
FCP(First Contentful Paint)10%
SI(Speed Index)10%

TBT는 FCP부터 TTI(Time to Interactive)까지 일어난 긴 작업(50ms 초과)에서 50ms를 넘긴 부분을 모두 더한 값이다. 모바일에서 600ms를 넘기면 빨강이다. 가중치가 가장 크고 곡선이 가팔라서, TBT가 무너지면 다른 지표의 개선이 점수에 거의 드러나지 않는다.

한 지표를 고쳤더니 다른 지표가 나빠지는 역설

이미지를 지연 로딩하고 품질을 낮춰 전송량을 크게 줄였더니 LCP는 좋아졌는데 점수는 오히려 떨어지는 경우가 있다. 원인이 TBT라면 이런 메커니즘을 의심해 볼 수 있다.

  • 느린 망 스로틀링에서는 큰 이미지가 대역폭을 독점해 JS가 찔끔찔끔 도착한다. 서드파티 스크립트는 측정 구간 안에 실행을 다 끝내지도 못하고, 메인 스레드는 한가해 보인다
  • 이미지가 비켜 주면 JS가 일찍, 몰려서 도착해 연달아 실행된다. 긴 작업이 측정 구간(FCP~TTI) 안에 빽빽하게 들어오고 TBT가 뛴다
  • 즉 새로 생긴 비용이 아니라 원래 있던 JS 비용이 측정 구간 안으로 들어온 것일 수 있다. 빠른 망의 실제 사용자는 이전에도 그 JS를 다 실행하고 있었다

확인하려면 JS 전송량이 그대로인지, 같은 스크립트의 실행 시간이 트레이스 안에서 늘었는지를 본다. 다만 같은 기간에 다른 배포가 섞였다면 진짜로 실행 비용이 늘었을 가능성도 따로 확인해야 한다. 점수 하나가 아니라 지표별로 쪼개 보는 습관이 필요한 이유다. "점수를 올리는 것"이 목표가 되면 굿하트의 법칙에 빠진다.

점수는 흔들린다

같은 페이지도 실행마다 점수가 다르다. 페이지 자체의 비결정성(A/B 테스트, 광고), 네트워크·서버 응답 시간, 측정 기기의 CPU 경쟁이 원인이다. Lighthouse 문서는 5번 돌린 중앙값이 1번보다 두 배쯤 안정적이라고 말한다. 비교할 때는 같은 환경에서 여러 번 돌려 중앙값을 쓰고, 점수를 한 숫자가 아니라 분포로 본다.

랩 데이터와 필드 데이터

Lighthouse는 기기 하나, 망 하나, 빈 캐시로 잰 랩 데이터다. 실제 사용자 데이터(필드 데이터)와는 화면 크기, 캐시 상태, bfcache(뒤로·앞으로 가기 캐시) 복원, 스크롤·상호작용 여부 때문에 차이가 난다. INP(Interaction to Next Paint)는 사용자 입력이 있어야 재지므로 랩에서는 TBT가 대리 지표 역할을 한다. 우선순위는 필드 데이터(Core Web Vitals의 p75)로 정하고, Lighthouse는 원인을 찾고 변경 전후를 비교하는 도구로 쓴다.

출처: Lighthouse performance scoring · Lighthouse 기본 설정(default-config.js) · Total Blocking Time · Lighthouse — Score variability · web.dev — Why lab and field data can be different

연결된 개념

이 노트를 가리키는 문서

아직 없습니다.

뜻이 가까운 노트

  • 도허티 임계

    컴퓨터와 사용자가 서로를 기다리지 않는 속도, 대략 400ms 이내로 반응하면 생산성이 급격히 높아진다는 원칙. 1982년 IBM의 월터 도허티와 아르빈드 타다니의 논문에서 나왔다. 반응이 이 선 아래로 내려가면 사용자가 흐름을 잃지 않는다.

  • 테스트 피라미드

    테스트를 어떤 비율로 갖출지를 피라미드 모양으로 나타낸 모델. 마이크 콘이 『Succeeding with Agile』에서 소개했다. 아래로 갈수록 빠르고 싸서 많이, 위로 갈수록 느리고 비싸서 적게 둔다.

  • 이미지 loading 속성

    img·iframe의 loading 속성으로 리소스를 언제 내려받을지 정한다. eager(기본)는 태그를 만나자마자, lazy는 화면에 가까워질 때까지 미룬다. JS(JavaScript) 없이 동작하는 브라우저 기본 기능이라 IntersectionObserver로 직접 만들 필요가 없다.

  • SEO

    SEO(Search Engine Optimization)는 검색 엔진이 페이지를 잘 찾고(크롤링, crawling), 이해해서 저장하고(색인, indexing), 알맞은 검색어로 노출하도록(순위, ranking) 사이트를 다듬는 일이다. 개발자가 맡는 부분은 대부분 앞의 두 단계, 즉 "검색 엔진이 읽을 수 있게 만드는 것"이다.

  • 핫 패스

    프로그램에서 가장 자주 실행되는 코드 경로. 수백만 번 도는 반복문의 몸통, 매 프레임 불리는 렌더링 함수, 모든 요청이 지나가는 미들웨어가 그렇다. 반대로 거의 실행되지 않는 경로를 콜드 패스(Cold Path)라 한다.

보기 옵션