HTTPQUERY
한국어

103 Early Hints

사용법

서버가 103 Early Hints를 보내면 클라이언트는 그 안의 Link 헤더를 해석하여 지정된 리소스를 미리 가져옵니다. 이는 서버가 최종 응답을 조립하기 전에 요청을 처리할 시간이 필요한 경우에 가장 유용합니다. 서버가 작업하는 동안 클라이언트는 그 시간을 활용해 최종 페이지에 필요한 스타일시트, 이미지, 스크립트를 로드합니다.

참고

최종 HTTP 응답에 앞서 여러 개의 103 Early Hints 응답이 전송됩니다.

힌트는 보장이 아닙니다

예측에 의존하는 모든 시스템에서 정확도는 달라집니다. 서버가 103 Early Hints를 반환하여 특정 리소스를 가져오도록 제안할 때, 그 제안은 합리적인 가정에 기반한 것입니다. 권위 있는 Link 헤더를 제공하는 것은 최종 HTTP 응답뿐입니다.

힌트와 최종 헤더 사이의 간극은 두 가지 형태로 나타납니다. 최종 응답이 힌트에 언급되지 않은 추가 리소스를 필요로 하거나, 조기 힌트로 가져온 리소스가 결국 불필요한 것으로 드러나는 경우입니다. 후자의 경우 클라이언트는 아무런 이득 없이 추가 작업을 수행한 셈이 되고, 전체 트랜잭션 시간은 늘어납니다.

조기 힌트에 기반해 수행되는 작업은 안전합니다. 예를 들어 GET 메서드를 사용하는 것은 서버 상태를 변경하지 않습니다.

SEO 영향

103 Early Hints는 최종 상태 코드에 앞서는 정보성 응답입니다. 검색 엔진 크롤러는 중간의 정보성 응답이 아니라 최종 응답을 처리합니다. 조기 힌트로 얻는 성능 이득은 크롤러가 아니라 브라우저에 적용됩니다. 이 상태 코드는 안전하게 사용할 수 있으며 Google이 페이지를 처리하는 방식을 방해하지 않습니다.

서버 푸시 대체

103 Early Hints 메커니즘은 rel=preload를 사용하는 리소스 힌트 프레임워크의 일부로서, 최신 브라우저에서 서버 푸시 메커니즘을 대체하는 위치에 있습니다. 서버 푸시와 달리 103 Early Hints는 브라우저가 지정된 리소스를 가져오기 시작하는 데 최종 응답을 기다릴 필요가 없습니다.

참고

보안상의 이유로 브라우저는 103 Early Hints의 사용을 HTTP/2 및 HTTP/3 연결로만 제한합니다.

예시

클라이언트가 index.html 파일을 요청하고, 서버는 필요할 가능성이 높은 리소스에 대한 세 가지 힌트를 반환합니다. 서버가 아직 응답을 생성하는 중이므로 요청한 파일은 메시지 본문에 들어 있지 않습니다. 클라이언트는 각 Link 지시문이 지정한 리소스를 로드하기 시작합니다.

잠시 뒤 서버는 공식 Link 지시문과 메시지 본문의 index.html과 함께 최종 200 응답을 반환합니다. 조기 힌트와 최종 리소스 목록 사이의 차이에 주목하세요.

요청

GET /index.html HTTP/1.1
Host: example.com

응답

HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </videos/instructions_simple.mp4>; rel=preload; as=video

<there is a short pause in the transmission>
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 100
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </images/pro_badge.svg>; rel=preload; as=image
Link: </videos/instructions_advanced.mp4>; rel=preload; as=video

<message body will follow>

첫 번째 조기 힌트 리소스인 style.css는 로고 이미지 및 instructions_simple.mp4 비디오와 함께 클라이언트가 가져와 처리합니다. 스타일시트와 로고는 둘 다 그대로 사용할 수 있습니다. 최종 응답의 pro_badge 이미지는 힌트에 나타나지 않으므로, 클라이언트는 최종 응답을 받은 뒤에야 이 리소스를 가져옵니다.

최종 Link 헤더의 instructions_advanced.mp4 비디오는 조기 힌트와 다릅니다. 서버는 조기 힌트를 통해 instructions_simple.mp4를 제안했지만 그 가져오기는 불필요했습니다. 새로 지정된 비디오는 index.html이 완전히 렌더링되기 전에 여전히 가져와 처리해야 하며, 비디오를 하나가 아니라 둘 가져온 탓에 로드 시간이 늘어날 가능성이 큽니다.

코드 참고

.NET

HttpStatusCode.EarlyHints

Rust

http::StatusCode::EARLY_HINTS

Rails

:early_hints

Go

http.StatusEarlyHints

Symfony

Response::HTTP_EARLY_HINTS

Python3.9+

http.HTTPStatus.EARLY_HINTS

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_EARLY_HINTS

Angular

@angular/common/http/HttpStatusCode.EarlyHints