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