HTTP 헤더 정리 (표현/협상/전송/인증/쿠키)
HTTP 헤더는 한마디로 “전송에 필요한 부가 정보”다.
바디에 “진짜 데이터”가 들어간다면, 헤더는 그 데이터를 어떻게 해석하고, 어떻게 다룰지를 알려준다.
1. 헤더 기본 형태
field-name ":" OWS field-value OWS
- OWS: 공백 허용
- field-name은 대소문자 구분 없음
Ex.
- 요청: Host: www.google.com
- 응답: Content-Type: text/html; charset=UTF-8
⸻
(과거) Entity → (지금) Representation(표현)
예전 RFC2616에서는 “엔티티”라고 불렀는데, 요즘 RFC723x에서는 표현(Representation) 이라는 말을 쓴다.
- 표현 = 표현 메타데이터(헤더) + 표현 데이터(바디/payload)
즉, 바디로 데이터를 보내고
헤더로 “이 바디는 JSON이고 UTF-8이고 gzip으로 압축했어” 같은 걸 알려주는 구조이다.
Content-Type
“이 바디 데이터가 무슨 형식인지”
- text/html; charset=UTF-8
- application/json
- image/png
Content-Encoding
“이 바디가 어떻게 압축됐는지”
- gzip, deflate, br(brotli) 등
서버가 압축해서 보내면, 클라이언트는 이걸 보고 풀어서 읽는다.
Content-Language
“이 바디 내용이 어떤 자연어인지”
Content-Length
“바디 길이(바이트)”
- 단, Transfer-Encoding(chunked) 쓰면 Content-Length 쓰면 안된다.
(분할 전송이면 길이를 미리 알 수 없기 때문이다.)
3. 콘텐츠 협상 (Content Negotiation)
클라이언트가 선호하는 표현을 요청하는 것을 의미한다.
요청에서만 사용:
- Accept (미디어 타입)
- Accept-Language (언어)
- Accept-Encoding (압축)
- Accept-Charset (문자셋, 요즘은 거의 안쓴다.)
우선순위: q 값(quality)
Ex.
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
→ ko-KR > ko > en-US > en 순으로 선호한다.
“구체적인 게 우선”
- text/* 보다 text/plain이 더 구체적이니까 우선
- 파라미터 붙은 게 더 구체적 (text/plain;format=flowed)
4. 전송 방식 관련 헤더
단순 전송
압축 전송
분할 전송 (chunked)
- Transfer-Encoding: chunked
- 이때 Content-Length 금지
범위 전송 (부분 다운로드)
- 요청: Range: bytes=1001-2000
- 응답: Content-Range: bytes 1001-2000/2000
→ 영상 스트리밍, 다운로드 재개 같은 데서 핵심이다.
5. 일반 정보 헤더
Referer
“어디서 넘어왔는지”
- 유입 분석/보안에서 자주 사용한다.
(스펠링이 원래 Referer인 게 함정)
User-Agent
클라이언트 앱 정보(브라우저/OS 등)
- 통계/디버깅에서 유용
“특정 브라우저에서만 터지는 버그” 잡을 때 도움된다.
Server
응답한 서버 소프트웨어 정보
Date
응답 생성 시간 (GMT)
6. 특별히 중요한 헤더들
Host (필수)
요청 대상 호스트(도메인)
한 IP에서 여러 도메인(VHost)을 처리할 때 구분해준다.
Location
- 201 Created: 새로 생성된 리소스 URI
- 3xx Redirect: 이동할 주소
브라우저는 3xx + Location이면 자동 이동.
Allow
405(Method Not Allowed)에서 “지원하는 메서드가 뭐냐”를 알려준다.
Retry-After
503(Service Unavailable)에서
“언제 다시 시도해도 되는지” 알려준다.
7. 인증 헤더
Authorization
클라이언트 → 서버
- Authorization: Basic ...
- 또는 Bearer (실무는 이쪽이 훨씬 흔하다.)
WWW-Authenticate
서버 → 클라이언트 (보통 401과 함께)
- “이 리소스 접근하려면 어떤 인증이 필요해”를 설명한다.
8. 쿠키
Set-Cookie / Cookie
- 서버 → 클라이언트: Set-Cookie
- 클라이언트 → 서버: Cookie
쿠키는 자동으로 모든 요청에 실려서 서버로 간다.
→ 그래서 최소 정보만 넣는 게 원칙이다. (세션ID, 토큰 정도)
생명주기
- Expires(날짜) / Max-Age(초)
- 만료 생략하면 세션 쿠키(브라우저 종료까지)
- 만료 지정하면 영속 쿠키
도메인
- domain=example.org 지정하면 서브도메인까지 포함
- 생략하면 현재 도메인만
path
해당 path 이하에서만 쿠키 전송/접근
보안 옵션 (실무 핵심)
- Secure: HTTPS에서만 전송
- HttpOnly: JS(document.cookie) 접근 막음 → XSS 방어
- SameSite: 다른 사이트에서 오는 요청에 쿠키 전송 제한 → CSRF 방어
출처
모든 개발자를 위한 HTTP 웹 기본 지식 (김영한, 인프런, 2020)