Rails 103 Early Hints: 개선점과 현실적 한계

Rails 103 Early Hints could be better, maybe doesn’t matter

작성자
발행일
2025년 10월 18일

핵심 요약

  • 1 HTTP 103 Early Hints는 메인 응답 전에 자산 로드를 미리 알림으로써 웹 페이지 로딩 속도를 향상시키는 기술입니다.
  • 2 Rails의 103 Early Hints 구현은 여러 개의 힌트가 전송되거나 응답 처리 후반부에 발생하여 개선의 여지가 있습니다.
  • 3 다수의 프로덕션 환경에서 프록시 및 CDN 등으로 인해 103 Early Hints가 차단되어 실제 적용에 어려움이 있습니다.

도입

최근 Shakapacker PR을 통해 103 Early Hints 지원에 대한 관심을 갖게 되어 이 기술에 대해 심층적으로 살펴보았습니다. 103 Early Hints는 HTML과 같은 실제 콘텐츠 응답이 전송되기 전에 발생하는 HTTP 응답 상태 코드입니다. 이 선행 응답은 브라우저가 이후의 콘텐츠 응답을 렌더링할 때 로드해야 할 추가 자산(JavaScript, CSS)을 미리 알려주는 역할을 합니다. 이를 통해 브라우저는 전체 콘텐츠 응답을 기다리는 동안 해당 리소스를 미리 로드하여 전체 페이지 로딩 및 렌더링 시간을 단축하는 것을 목표로 합니다.

103 Early Hints는 실제 콘텐츠 응답의 Link 헤더와 목적 및 내용이 유사하여 혼동되는 경우가 많습니다. Rails에서 Eileen Uchitelle가 초기 구현을 담당했으며, 현재 구현에는 몇 가지 개선점이 존재합니다.

Rails 103 Early Hints 개선 방안

  • 단일 103 Early Hints 응답: 브라우저는 첫 번째 103 응답만 처리하지만, Rails는 javascript_include_tag, stylesheet_link_tag 등 호출 시마다 여러 103 Early Hints를 전송합니다. 여러 자산 링크를 모아 단일 응답으로 플러시하는 것이 더욱 효율적입니다.

  • before_action에서의 조기 전송: 현재 103 Early Hints는 레이아웃 렌더링 등 응답 처리 후반부에 발생합니다. 힌트의 ‘조기’ 목적에 맞게, 느린 DB 쿼리나 뷰 렌더링 전인 before_action에서 전송하는 것이 바람직합니다.

103 Early Hints 동작 방식 (Rack/Puma)

웹 서버(예: Puma)는 request.env["rack.early_hints"]에 콜러블을 제공하여 애플리케이션이 이를 호출, 103 Early Hints 내용을 소켓에 직접 작성하게 합니다.

ruby # Puma 웹 서버 측 request.env["rack.early_hints"] = lambda do |early_hints_str| # ... 103 Early Hints 응답을 소켓에 직접 작성 end # 애플리케이션 측 request.env["rack.early_hints"]&.call("link: </application.css>; ...")

결론

이러한 개선점에도 불구하고, 103 Early Hints의 실제 적용 가능성은 의문입니다. 저자는 Heroku, Cloudfront, Digital Ocean App Platform, Cloudflare 등 다양한 프로덕션 환경에서 103 Early Hints가 네트워크 장치, 프록시, CDN 등에 의해 차단되어 동작하지 않는 것을 확인했습니다. 로컬 환경에서는 작동하지만, Basecamp, GitHub 등 주요 웹사이트들조차 103 Early Hints를 제공하는 사례를 찾기 어렵습니다. 이는 103 Early Hints가 기술적으로 흥미롭고 개선 가능성이 있음에도 불구하고, 현실적인 배포 환경의 제약으로 인해 그 효과를 체감하기 어려울 수 있음을 시사합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!