본문 바로가기
Etc2026년 4월 7일7분 읽기

HTTP 완벽 이해 — 메서드 상태코드 헤더 쿠키 총정리

YS
김영삼
조회 735

HTTP 프로토콜 완벽 가이드

HTTP(HyperText Transfer Protocol)는 웹의 기반이 되는 프로토콜입니다. 모든 웹 개발자가 깊이 이해해야 하는 핵심 개념들을 총정리합니다.

HTTP 메서드

HTTP 메서드와 특성:

GET     /api/users          # 리소스 조회 (안전, 멱등)
POST    /api/users          # 리소스 생성 (비안전, 비멱등)
PUT     /api/users/1        # 리소스 전체 수정 (비안전, 멱등)
PATCH   /api/users/1        # 리소스 부분 수정 (비안전, 비멱등)
DELETE  /api/users/1        # 리소스 삭제 (비안전, 멱등)
HEAD    /api/users          # GET과 동일하나 본문 없음
OPTIONS /api/users          # 지원 메서드 확인 (CORS preflight)

# 안전(Safe): 서버 상태를 변경하지 않음
# 멱등(Idempotent): 여러 번 요청해도 결과 동일

HTTP 상태 코드

코드의미사용 시점
200 OK성공일반적인 성공 응답
201 Created생성 완료POST로 리소스 생성 시
204 No Content본문 없음DELETE 성공
301 Moved Permanently영구 이동URL 영구 변경
304 Not Modified변경 없음캐시 유효
400 Bad Request잘못된 요청요청 형식 오류
401 Unauthorized인증 필요로그인 필요
403 Forbidden권한 없음인증됐지만 접근 불가
404 Not Found없음리소스 없음
409 Conflict충돌중복 등록
429 Too Many Requests요청 초과Rate Limiting
500 Internal Server Error서버 오류서버 내부 에러
502 Bad Gateway게이트웨이 오류업스트림 서버 오류
503 Service Unavailable서비스 불가서버 점검, 과부하

주요 HTTP 헤더

# 요청 헤더
Host: example.com
User-Agent: Mozilla/5.0 ...
Accept: application/json
Accept-Language: ko-KR,ko;q=0.9
Accept-Encoding: gzip, deflate, br
Authorization: Bearer eyJhbGc...
Content-Type: application/json
Origin: https://example.com
Cookie: session=abc123

# 응답 헤더
Content-Type: application/json; charset=utf-8
Content-Length: 1234
Content-Encoding: gzip
Cache-Control: public, max-age=3600
ETag: "abc123"
Last-Modified: Mon, 01 Jan 2026 00:00:00 GMT
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Strict
Access-Control-Allow-Origin: https://example.com
X-Request-Id: uuid-here

쿠키 설정

Set-Cookie: session=abc123;
  Domain=example.com;
  Path=/;
  Expires=Thu, 01 Jan 2027;
  Max-Age=86400;
  HttpOnly;     # JavaScript 접근 차단 (XSS 방어)
  Secure;       # HTTPS에서만 전송
  SameSite=Strict;  # 크로스사이트 전송 차단 (CSRF 방어)

# SameSite 옵션
# Strict: 같은 사이트 요청에서만 전송
# Lax   : GET 네비게이션에서는 허용 (기본값)
# None  : 항상 전송 (Secure 필수)

캐시 제어

Cache-Control: public, max-age=3600
Cache-Control: private, max-age=600
Cache-Control: no-cache           # 항상 검증 후 사용
Cache-Control: no-store           # 캐시 저장 금지
Cache-Control: must-revalidate    # 만료 후 반드시 검증
Cache-Control: immutable          # 변경 불가 (해시된 정적 파일)
Cache-Control: stale-while-revalidate=60

# 조건부 요청 (304 응답)
# ETag 방식
Request:  If-None-Match: "abc123"
Response: 304 Not Modified

# Last-Modified 방식
Request:  If-Modified-Since: Mon, 01 Jan 2026 00:00:00 GMT
Response: 304 Not Modified

CORS (Cross-Origin Resource Sharing)

# Preflight 요청 (OPTIONS)
OPTIONS /api/data HTTP/1.1
Origin: https://frontend.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type, Authorization

# 서버 응답
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://frontend.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
Access-Control-Allow-Credentials: true

HTTP/1.1 vs HTTP/2 vs HTTP/3

  • HTTP/1.1: 텍스트 기반, 한 연결에 한 요청, Keep-Alive로 연결 재사용
  • HTTP/2: 바이너리 프레이밍, 멀티플렉싱, 헤더 압축(HPACK), 서버 푸시
  • HTTP/3: QUIC(UDP) 기반, 연결 설정 시간 단축 (0-RTT), Head-of-Line Blocking 해결
  • 대부분의 CDN과 최신 브라우저는 HTTP/2, HTTP/3를 기본 지원
  • HTTP/2 이상에서는 도메인 샤딩이 불필요하며 오히려 성능 저하 유발

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록