HTTP 헤더(Header)란?
HTTP(Header)는 클라이언트와 서버 간에 교환되는 메타데이터로, 요청(Request)과 응답(Response)에 부가적인 정보를 실어 나르는 역할을 합니다. 헤더를 통해 다음과 같은 정보를 전달할 수 있습니다.
- 메시지 본문(Body)의 형식, 길이, 인코딩 방식
- 클라이언트나 서버의 식별 정보(브라우저 종류, 서버 종류 등)
- 캐싱, 쿠키, 인증, 보안 정책 등 제어 정보
💡 왜 중요한가?
헤더는 HTTP 통신의 “컨트롤러” 역할을 하며, 본문을 전송하기 전후에 반드시 교환되어야 하는 필수 요소입니다. 헤더가 없으면 본문 처리 방식, 권한 검증, 데이터 압축 여부 등을 알 수 없어 제대로 된 통신이 불가능합니다.
헤더의 분류
HTTP 헤더는 크게 4가지 카테고리로 나뉩니다.
분류 | 목적 | 예시 헤더 |
---|---|---|
일반 헤더 | 요청/응답이 모두 공통으로 사용하는 메타데이터 | Cache-Control, Connection, Date |
요청 헤더 | 클라이언트가 서버에 요청을 보낼 때 사용하는 헤더 | Host, User-Agent, Accept, Authorization |
응답 헤더 | 서버가 클라이언트에 응답할 때 사용하는 헤더 | Server, Set-Cookie, Content-Type, Location |
엔티티 헤더 | 메시지 본문(엔티티)에 관한 정보 | Content-Length, Content-Encoding, Last-Modified |
주요 요청(Request) 헤더
1. Host
- 정의: 요청 대상 서버의 도메인 이름과 포트를 지정
- 예시: Host: www.example.com
- 특징: HTTP/1.1부터 필수. 하나의 IP에서 여러 도메인을 운영할 때 가상 호스팅을 가능하게 함.
2. User-Agent
- 정의: 클라이언트(브라우저 또는 애플리케이션)의 식별 정보
- 예시: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 …
- 활용: 서버는 UA를 기반으로 콘텐츠 최적화(모바일/데스크톱)나 통계 분석에 활용.
3. Accept 계열
- Accept: 요청할 미디어 타입(text/html, application/json 등)
- Accept-Encoding: 압축 방식(gzip, br)
- Accept-Language: 언어 선호도(ko-KR, en-US)
- 예시:
Accept: application/json, text/plain;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6
4. Authorization
- 정의: 인증 자격 증명 정보
- 종류:
- Basic: Base64로 인코딩된 username:password
- Bearer: JWT(JSON Web Token) 등 토큰 기반
- 예시: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6…
주요 응답(Response) 헤더
1. Server
- 정의: 서버 소프트웨어 정보
- 예시: Server: Apache/2.4.54 (Ubuntu)
2. Content-Type
- 정의: 응답 본문의 MIME 타입 및 문자 인코딩
- 예시: Content-Type: text/html; charset=UTF-8
3. Set-Cookie
- 정의: 클라이언트에 쿠키를 설정
- 옵션: Path, Expires/Max-Age, Secure, HttpOnly, SameSite
- 예시: Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Strict
4. Cache-Control
- 정의: 응답 캐싱 정책
- 예시: Cache-Control: no-cache, no-store, must-revalidate
5. Location
- 정의: 리다이렉션 대상 URL
- 상태 코드: 301, 302, 307 등과 함께 사용
- 예시:
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/new-path
엔티티(Entity) 헤더
1. Content-Length
- 정의: 본문의 바이트 길이
- 예시: Content-Length: 348
2. Content-Encoding
- 정의: 본문 압축 방식
- 예시: Content-Encoding: gzip
3. Last-Modified / ETag
- 정의: 리소스 최종 수정 시간 또는 엔티티 태그
- 캐싱 활용: If-Modified-Since, If-None-Match 요청 헤더와 함께 사용
- 예시:
Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT
ETag: “5d8c72a5edda8-3c1”
보안(Security) 관련 헤더
1. CORS (Cross-Origin Resource Sharing)
- Access-Control-Allow-Origin, Access-Control-Allow-Methods 등
- 목적: 브라우저의 동일 출처 정책 우회 허용 제어
2. CSP (Content Security Policy)
- Content-Security-Policy: 스크립트, 스타일, 이미지 로딩 출처 제한
- 예시: Content-Security-Policy: default-src ‘self’; script-src ‘self’ https://apis.google.com
3. HSTS (HTTP Strict Transport Security)
- Strict-Transport-Security: HTTPS 강제 적용
- 예시: Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
기타
커스텀(Custom) 헤더
- X- 접두사: 과거에 비표준 헤더 식별 용도로 사용 (X-Request-ID)
- Tracer: 분산 트레이싱용 Trace-Id, Span-Id
- 예시: X-Request-ID: 123e4567-e89b-12d3-a456-426614174000
💡 Tip: 최신 RFC에서는 X- 접두사 대신 벤더 접두사(예: MyCompany-)나 표준화된 헤더 생성 권장.
HTTP/2·HTTP/3에서의 헤더 변화
- HPACK (HTTP/2): 헤더 압축 알고리즘
- QPACK (HTTP/3): 지연 없는 헤더 압축
- 특징: 헤더 블록을 바이너리 스트림으로 전송, 효율성 대폭 향상
베스트 프랙티스
- 필요 최소한의 헤더만 사용
- 표준 준수: 유효하지 않은 값이 전달되지 않도록 검증
- 보안 강화: HttpOnly, Secure, SameSite 옵션 적극 사용
- 캐싱 전략 명확히 설계 (Cache-Control, ETag, Expires)
- 압축 허용(Accept-Encoding, Content-Encoding)으로 대역폭 절약
결론
HTTP 헤더는 서버·클라이언트 통신의 중추로, 메타데이터를 통해 요청 방식, 콘텐츠 형식, 보안 정책, 캐싱 전략 등을 제어합니다. 본 블로그에서 다룬 헤더 분류, 주요 필드, 보안 헤더, HTTP/2·3의 압축 메커니즘, 그리고 베스트 프랙티스를 숙지하면, 보다 안전하고 효율적인 웹 서비스를 설계할 수 있습니다.