HTTP 일반 헤더
HTTP 헤더 정리
이번 글에서는 HTTP 헤더에 대한 전반적인 개요와, 표현(Representation), 콘텐츠 협상(Content Negotiation), 전송 방식, 일반 정보 헤더, 특별한 정보 헤더, 인증 헤더, 그리고 쿠키에 대해 정리하였습니다.
최신 스펙을 중심으로, 과거 용어와 개념에서 어떻게 변화했는지까지 포함해 설명합니다.
HTTP 헤더 개요
HTTP 메시지는 크게 스타트 라인(요청라인/응답라인), 헤더(header), 바디(body)로 구성되며, HTTP 헤더는 HTTP 전송에 필요한 모든 부가 정보를 제공하는 필드입니다.
헤더 필드는 대소문자 구분이 없으며, 필드이름: 값
형태로 구성됩니다.
과거에는 General, Request, Response, Entity 헤더 등으로 분류했었으나, 최신 스펙(RFC 7230 이후)에서는 Entity 개념이 사라지고 표현(Representation)이라는 개념으로 대체되었습니다.
즉, 최신 HTTP 스펙에서는 메시지 본문을 통해 표현 데이터를 전달하고, 이 표현에 대한 메타 데이터(예: Content-Type, Content-Length 등)를 표현 헤더로 관리합니다.
표현 (Representation)
리소스는 추상적 개념이며, 이를 클라이언트나 서버가 이해할 수 있는 형태(HTML, JSON, XML 등)로 변환한 것이 표현(Representation)입니다.
표현 헤더는 표현 데이터를 해석하기 위한 정보를 담습니다.
주요 표현 관련 헤더
- Content-Type: 바디에 담긴 표현 데이터의 MIME 타입(예:
text/html
,application/json
) 지정 - Content-Encoding: 표현 데이터를 압축하거나 인코딩한 방식(
gzip
등)을 명시 - Content-Language: 표현 데이터의 자연 언어(
ko
,en
등)를 명시 - Content-Length: 표현 데이터의 길이를 바이트 단위로 명시
이러한 표현 헤더들은 요청과 응답에서 모두 사용될 수 있으며, 표현 데이터를 이해하고 처리하는 기반이 됩니다.
콘텐츠 협상 (Content Negotiation)
클라이언트는 서버에 자신이 원하는 표현 형식, 언어, 인코딩을 우선순위까지 포함해 알려줄 수 있습니다.
이를 통해 서버는 클라이언트가 선호하는 형식으로 응답을 제공할 수 있습니다.
주요 협상 관련 헤더
- Accept: 클라이언트가 선호하는 미디어 타입(MIME 타입)
- Accept-Charset: 선호하는 문자 인코딩
- Accept-Encoding: 선호하는 압축 인코딩 방법(gzip 등)
- Accept-Language: 선호하는 자연 언어
클라이언트는
q=값
형태의 품질값(quality value)을 사용하여 우선순위를 지정할 수 있으며, 서버는 이를 참고해 가능한 최적의 표현을 선택하게 됩니다.
전송 방식 (Transfer Methods)
HTTP 응답의 전송 방식은 다음과 같이 구분할 수 있습니다.
- 단순 전송(Simple Transfer): Content-Length로 전체 크기를 알려주고 한 번에 전송
- 압축 전송(Compressed Transfer): Content-Encoding(gzip 등)을 사용해 압축 후 전송
- 분할 전송(Chunked Transfer): Transfer-Encoding: chunked를 사용, 데이터를 일정 블록 단위로 나누어 전송
- 범위 전송(Range Request): Range 헤더를 통해 특정 범위의 데이터만 요청/전송
이로써 대용량 파일을 끊김 없이 전송하거나, 이미 받은 부분은 재전송하지 않는 등 효율적인 전송 전략을 구현할 수 있습니다.
일반 정보 헤더 (Informational Headers)
일부 헤더는 단순한 정보 제공용으로 사용됩니다.
- From: 클라이언트 사용자나 에이전트의 이메일 주소(거의 사용하지 않음)
- Referer: 현재 요청 페이지로 들어오기 직전의 페이지 URL
- User-Agent: 클라이언트 애플리케이션(브라우저 등)의 정보
- Server: 응답을 처리한 오리진 서버의 소프트웨어 정보
- Date: 메시지 발생(응답 생성) 시각
이들 헤더는 주로 로깅, 분석, 디버깅 및 통계 수집 목적으로 사용됩니다.
특별한 정보 헤더 (Special Headers)
특정한 상황에서 사용되는 특수한 헤더도 있습니다.
- Host: 요청 대상 호스트명(필수 헤더). 하나의 IP가 여러 도메인을 처리하는 가상 호스팅 환경에서 필수적
- Location: 3xx 리다이렉션 응답 시 이동할 리소스의 위치 지정. 201 응답 시 생성된 리소스의 URI 제공
- Allow: 특정 리소스에 대해 지원하는 HTTP 메서드 나열(405 응답과 함께 사용)
- Retry-After: 503 서비스 불가 시 언제 다시 요청 가능한지 알려주는 정보(날짜나 초 단위)
인증 (Authentication)
클라이언트가 서버 자원에 접근하기 위해 인증이 필요한 경우 사용합니다.
- Authorization: 클라이언트 인증 정보를 담아 서버에 전달
- WWW-Authenticate: 401 응답 시, 클라이언트에게 필요한 인증 스킴 정보 제공
여러 인증 방식(Basic, Bearer, OAuth 등)에 따라 Authorization 헤더 값은 달라지며, 서버는 이에 따라 접근 권한을 부여합니다.
쿠키 (Cookie)
쿠키는 HTTP의 무상태성(Stateless)을 보완하는 핵심 메커니즘입니다.
서버는 Set-Cookie
헤더로 클라이언트에게 쿠키를 내려주며, 클라이언트는 이후 해당 쿠키를 Cookie
헤더를 통해 자동 전송함으로써 상태 유지를 실현합니다.
이를 통해 로그인 세션 관리, 사용자 맞춤 정보 제공 등이 가능합니다.
쿠키 설정 시 주요 속성
- Expires / Max-Age: 쿠키 유효기간 설정
- Domain: 쿠키를 적용할 도메인 지정(서브도메인 포함 가능)
- Path: 쿠키를 적용할 URI 경로 범위 지정
- Secure: HTTPS일 때만 쿠키 전송
- HttpOnly: 자바스크립트에서 쿠키 접근 불가(XSS 공격 방지)
- SameSite: Cross-Site 요청 시 쿠키 전송 제약(XSRF 공격 방지)
쿠키는 가능한 최소한의 정보만 담는 것이 권장되며, 민감한 정보는 저장해서는 안 됩니다.
이로써 HTTP 헤더 전반에 대한 정리를 마칩니다.
다음으로는 캐시 및 조건부 요청에 관한 헤더들을 다루면서 HTTP 성능 최적화와 효율성 향상 방식을 알아볼 수 있을 것입니다.