사전 HEAD
인터페이스

HEAD

gabury1

HEAD 는 웹 서버에 내용물은 빼고 그에 대한 설명만 보내 달라고 요청하는 방법입니다. 큰 파일을 내려받기 전에 크기만 먼저 확인하는 일에 씁니다. 같은 이름이 버전관리 도구 Git 에도 있습니다. 그쪽 뜻은 HEAD (Git) 이 받습니다.

쉽고 빠른 이해

HEAD 는 GET 과 똑같이 보내되 응답에서 내용물만 빼 달라는 요청입니다. 영상 파일 주소에 HEAD 를 보내면 그 영상의 크기와 형식만 돌아오고 영상 자체는 안 옵니다.

이게 없으면 크기 하나를 알려고 파일 전체를 받아야 합니다. 링크가 아직 살아 있는지 훑는 작업도 매번 내용물을 끌고 옵니다.

어떻게 도나:

  1. 클라이언트가 확인하고 싶은 주소로 HEAD 를 보냅니다
  2. 서버는 GET 으로 왔을 때 붙였을 설명(헤더)을 똑같이 만듭니다
  3. 그 설명만 보내고 내용물은 안 붙입니다

대가도 있습니다. 서버가 크기를 맞게 적으려면 내용물을 어차피 만들어 봐야 할 때가 많습니다. 그래서 서버가 하는 일은 GET 과 크게 다르지 않습니다. 그리고 확인한 값이 곧이어 보낼 GET 에서도 같다는 보장은 없습니다.

그러니 어차피 받을 파일이면 GET 한 번이 낫습니다. 받을지 말지가 갈리는 큰 파일에서만 이득입니다.

상세

HEAD 는 HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜)의 요청 메서드 가운데 하나입니다. 요청 메서드는 요청이 서버에게 무엇을 해 달라는 것인지 알리는 낱말입니다. HEAD 는 GET 이 돌려줄 응답에서 내용물만 덜어 낸 것을 달라는 뜻입니다.

서버가 돌려주는 응답은 두 토막입니다. 앞 토막이 헤더이고 뒤 토막이 본문입니다.

본문은 요청한 내용물이 실제로 담기는 토막입니다. 영상을 달라고 했으면 영상 바이트가 여기 들어옵니다.

헤더는 그 본문을 어떻게 다뤄야 하는지 알려 주는 이름과 값의 짝입니다. 앞에서 「설명」이라 한 것이 이 헤더입니다. 형식과 길이와 마지막으로 바뀐 때가 여기 적힙니다.

HEAD 응답에는 이 둘 가운데 헤더만 옵니다. 그래서 응답을 끝까지 읽어도 파일은 한 조각도 안 받습니다.

block-beta
columns 3
  g["GET 응답"] gh["헤더"] gb["본문 · 영상 5MB"]
  h["HEAD 응답"] hh["헤더"] hb["본문 없음"]

HEAD 가 없으면 「이 주소에 무엇이 있나」를 물을 방법이 GET 뿐입니다. 크기만 알고 싶어도 본문이 전부 따라옵니다. 수천 개 링크가 아직 살아 있는지 훑는 작업이라면 그 본문이 남김없이 회선을 지나갑니다.

요청과 응답의 모양

가장 짧은 HEAD 요청은 메서드와 주소만 있습니다. 무엇을 알아볼지는 주소가 이미 말하므로 본문이 필요 없습니다.

http
HEAD /video.mp4 HTTP/1.1
Host: example.com

서버는 헤더만 돌려줍니다. 같은 주소에 GET 을 보냈다면 왔을 헤더와 같은 것입니다.

http
HTTP/1.1 200 OK
Content-Type: video/mp4
Content-Length: 5242880
Last-Modified: Tue, 09 Sep 2025 07:00:00 GMT

첫 줄의 200 OK 는 상태 코드입니다. 상태 코드는 요청이 어떻게 끝났는지를 세 자리 숫자로 알리는 값입니다. 그 아래 Content-Type 이 내용물의 형식, Content-Length 가 바이트 단위 길이, Last-Modified 가 마지막으로 바뀐 때입니다. 이 셋만 보고도 내려받을지 말지 정할 수 있습니다.

명령 한 줄로 보내려면 curl 의 -I 옵션을 씁니다.

터미널
curl -I example.com/video.mp4  # 헤더만 온다

GET 응답과 같아야 하는 헤더

HEAD 응답의 헤더는 같은 주소에 GET 을 보냈을 때 붙었을 헤더와 같아야 합니다. 이 약속이 HEAD 의 전부입니다. 약속이 깨지면 HEAD 로 확인한 값을 믿고 짠 코드가 어긋납니다.

Content-Length 가 대표입니다. 이 헤더는 보내지도 않은 본문의 길이를 적습니다. 안 보낼 것의 길이를 적는 것이 이상해 보이지만, 그 값을 알려 주는 것이 이 요청의 목적입니다.

서버 쪽에서 HEAD 를 「본문만 안 보내면 되는 요청」으로 대충 처리하면 문제가 생깁니다. 본문을 안 만들었으니 길이도 모릅니다. 그러면 Content-Length 가 빠지거나 0 이 됩니다. 클라이언트는 그 파일을 빈 파일로 읽습니다.

서버가 HEAD 를 처리하는 방법은 둘로 갈립니다.

처리 방식 하는 일 값 서버 부담
본문을 만든다 응답을 GET 처럼 다 만들고 본문만 떼어 낸다 언제나 맞다 GET 과 같다
본문을 안 만든다 길이와 형식만 따로 구한다 어긋날 수 있다 줄어든다

「만든다」 갈래가 아끼는 것은 회선뿐입니다. 서버는 GET 과 똑같이 일하고 다 만든 본문을 버립니다.

「안 만든다」 갈래는 서버 부담이 줄어듭니다. 그 대신 길이를 구하는 코드가 본문을 만드는 코드와 어긋나는 날 잘못된 값이 나갑니다.

안전성과 멱등성

HEAD 는 안전한 메서드입니다. 안전한 메서드는 서버에 남는 상태를 바꿔 달라고 하지 않는 메서드입니다. 검색 엔진의 크롤러처럼 사람이 누르지 않아도 요청을 보내는 도구가 있습니다. 그런 도구가 HEAD 를 마음대로 뿌려도 데이터는 사라지지 않습니다.

멱등하기도 합니다. 멱등하다는 것은 같은 요청을 여러 번 보내도 서버에 남는 효과가 한 번 보낸 것과 같다는 뜻입니다. 상태를 아예 안 바꾸는 메서드라면 멱등은 저절로 따라옵니다.

이 두 성질 덕분에 재시도가 쉬워집니다. 응답이 오다 끊겨도 그냥 한 번 더 보내면 됩니다. 앞의 요청이 서버에 남긴 것이 없으니 더 나빠질 것이 없습니다.

내려받기 전에 물어보기

HEAD 는 큰 파일을 받기 전에 살펴보는 데 가장 많이 씁니다. 앞의 /video.mp4 를 그대로 두고, 받을지 말지를 어떻게 가르는지 봅니다.

sequenceDiagram
    participant 클라이언트
    participant 서버
    클라이언트->>서버: HEAD /video.mp4
    서버-->>클라이언트: 길이와 형식만
    Note over 클라이언트: 받을지 말지 정한다
    클라이언트->>서버: GET /video.mp4
    서버-->>클라이언트: 영상 전체

왕복이 두 번입니다. 첫 왕복에서 받은 길이가 너무 크면 둘째 왕복을 아예 안 보냅니다. 반대로 파일이 작으면 HEAD 한 번이 왕복만 늘린 셈이 됩니다.

그래서 HEAD 는 받을지 말지가 갈리는 파일에서만 쓸모가 있습니다. 어차피 받을 것이면 GET 한 번이 낫습니다.

확인 목적별 메서드

「이 주소를 건드려 보고 싶다」는 요구는 여럿입니다. 그때마다 맞는 메서드가 다릅니다.

하려는 일 고르는 것
내려받기 전에 길이와 형식 확인 HEAD
링크가 아직 살아 있는지 훑기 HEAD
들고 있는 사본이 낡았는지 확인 조건부 요청
서버가 어떤 메서드를 받아 주는지 묻기 OPTIONS
파일의 앞 몇 바이트만 받기 Range 요청

조건부 요청은 「내가 가진 사본이 아직 맞으면 본문을 보내지 마라」는 조건을 요청에 붙이는 방식입니다. 사본이 그대로면 서버가 본문 없이 짧게 답합니다. 사본이 낡았을 때는 새 본문까지 한 번에 옵니다. 확인하고 다시 받을 두 왕복이 한 왕복으로 줄어듭니다.

OPTIONS 는 그 주소가 어떤 메서드를 받아 주는지 묻는 메서드입니다. HEAD 는 내용물에 대해 묻고, OPTIONS 는 그 주소가 무엇을 허용하는지를 묻습니다.

서버가 HEAD 를 안 받아 주는 경우도 있습니다. 그때는 405 Method Not Allowed 가 돌아옵니다. 훑는 도구라면 이 응답을 만났을 때 GET 으로 물러설 길을 마련해 두어야 합니다.

Git 의 HEAD 와 가르기

Git 은 소스 코드의 판을 관리하는 도구입니다. 그쪽 HEAD 는 요청이 아니라 이름표입니다. 지금 작업 중인 커밋 하나를 가리키고, 브랜치를 옮길 때마다 따라 움직입니다.

두 HEAD 는 이름만 같습니다. 웹 쪽 HEAD 는 클라이언트가 서버로 보내는 요청이고, Git 쪽 HEAD 는 저장소 안에 적혀 있는 값입니다. 이 이름을 만나면 앞뒤가 웹 요청 이야기인지 저장소 이야기인지 보고 가릅니다.

관련 항목

HEAD 와 나란히 서는 요청 메서드

요청 메서드 · GET · POST · PUT · DELETE · PATCH · OPTIONS · CONNECT · TRACE

HEAD 가 지키는 성질

멱등성 · 안전한 메서드 · 안전하지 않은 메서드 · 재시도

HEAD 응답에 실려 오는 헤더

헤더 · Content-Length · Content-Type · Last-Modified · ETag · Content-Encoding · 표현 메타데이터

HEAD 응답에 오는 상태 코드

상태 코드 · 200 OK · 304 Not Modified · 404 Not Found · 405 Method Not Allowed

HEAD 가 가리키는 대상과 그 주소

자원 · URI · 요청 대상 · 표현 · 본문

HEAD 대신 쓰는 다른 확인 수단

조건부 요청 · If-Modified-Since · If-None-Match · Range 요청 · 204 No Content

HEAD 요청이 지나가는 중간 장비

캐시 · 프록시 · 리버스 프록시 · 로드 밸런서 · CDN

HEAD 를 정의하는 표준·문서

HTTP · HTTP/1.1 · HTTP/2 · RFC 9110

HEAD 를 보내서 확인하는 작업

크롤러 · 링크 검사 · 헬스 체크 · 이어받기 · 웹 스크래핑

이름이 겹치는 이웃

HEAD (Git) · Git · 커밋 · 브랜치 · 분리된 HEAD

다른 이름: HEAD 메서드 · HTTP HEAD