[HTTP 웹 기본 지식] 5. HTTP 헤더1 - 일반 헤더

건우·2025년 12월 8일

CS / 네트워크

목록 보기
5/6
post-thumbnail

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으로 압축했어” 같은 걸 알려주는 구조이다.


2. 표현 헤더 (Representation Headers)

Content-Type

“이 바디 데이터가 무슨 형식인지”

  • text/html; charset=UTF-8
  • application/json
  • image/png

Content-Encoding

“이 바디가 어떻게 압축됐는지”

  • gzip, deflate, br(brotli) 등
    서버가 압축해서 보내면, 클라이언트는 이걸 보고 풀어서 읽는다.

Content-Language

“이 바디 내용이 어떤 자연어인지”

  • ko, en, en-US

Content-Length

“바디 길이(바이트)”

  • 단, Transfer-Encoding(chunked) 쓰면 Content-Length 쓰면 안된다.
    (분할 전송이면 길이를 미리 알 수 없기 때문이다.)

3. 콘텐츠 협상 (Content Negotiation)

클라이언트가 선호하는 표현을 요청하는 것을 의미한다.

요청에서만 사용:

  • Accept (미디어 타입)
  • Accept-Language (언어)
  • Accept-Encoding (압축)
  • Accept-Charset (문자셋, 요즘은 거의 안쓴다.)

우선순위: q 값(quality)

  • 0~1 (클수록 우선)
  • 생략하면 1

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. 전송 방식 관련 헤더

단순 전송

  • Content-Length

압축 전송

  • Content-Encoding: gzip

분할 전송 (chunked)

  • Transfer-Encoding: chunked
  • 이때 Content-Length 금지

범위 전송 (부분 다운로드)

  • 요청: Range: bytes=1001-2000
  • 응답: Content-Range: bytes 1001-2000/2000

→ 영상 스트리밍, 다운로드 재개 같은 데서 핵심이다.


5. 일반 정보 헤더

Referer

“어디서 넘어왔는지”

  • 유입 분석/보안에서 자주 사용한다.
    (스펠링이 원래 Referer인 게 함정)

User-Agent

클라이언트 앱 정보(브라우저/OS 등)

  • 통계/디버깅에서 유용
    “특정 브라우저에서만 터지는 버그” 잡을 때 도움된다.

Server

응답한 서버 소프트웨어 정보

  • nginx, Apache 등

Date

응답 생성 시간 (GMT)


6. 특별히 중요한 헤더들

Host (필수)

요청 대상 호스트(도메인)
한 IP에서 여러 도메인(VHost)을 처리할 때 구분해준다.

Location

  • 201 Created: 새로 생성된 리소스 URI
  • 3xx Redirect: 이동할 주소

브라우저는 3xx + Location이면 자동 이동.

Allow

405(Method Not Allowed)에서 “지원하는 메서드가 뭐냐”를 알려준다.

  • Allow: GET, POST

Retry-After

503(Service Unavailable)에서
“언제 다시 시도해도 되는지” 알려준다.

  • 초 단위 / 날짜 둘 다 가능

7. 인증 헤더

Authorization

클라이언트 → 서버

  • Authorization: Basic ...
  • 또는 Bearer (실무는 이쪽이 훨씬 흔하다.)

WWW-Authenticate

서버 → 클라이언트 (보통 401과 함께)

  • “이 리소스 접근하려면 어떤 인증이 필요해”를 설명한다.

8. 쿠키

  • 서버 → 클라이언트: Set-Cookie
  • 클라이언트 → 서버: Cookie

쿠키는 자동으로 모든 요청에 실려서 서버로 간다.
→ 그래서 최소 정보만 넣는 게 원칙이다. (세션ID, 토큰 정도)

생명주기

  • Expires(날짜) / Max-Age(초)
  • 만료 생략하면 세션 쿠키(브라우저 종료까지)
  • 만료 지정하면 영속 쿠키

도메인

  • domain=example.org 지정하면 서브도메인까지 포함
  • 생략하면 현재 도메인만

path

해당 path 이하에서만 쿠키 전송/접근

  • 보통 path=/

보안 옵션 (실무 핵심)

  • Secure: HTTPS에서만 전송
  • HttpOnly: JS(document.cookie) 접근 막음 → XSS 방어
  • SameSite: 다른 사이트에서 오는 요청에 쿠키 전송 제한 → CSRF 방어

출처
모든 개발자를 위한 HTTP 웹 기본 지식 (김영한, 인프런, 2020)

0개의 댓글