HTTP 요청/응답 이해하기 📡
웹사이트를 방문하거나 앱을 사용할 때, 컴퓨터와 서버가 어떻게 대화할까요? 바로 HTTP라는 규칙을 사용해요! 초보자도 쉽게 이해할 수 있도록 설명해드릴게요.
HTTP를 일상생활로 비유하면?
HTTP를 레스토랑 주문으로 비유해볼까요?
레스토랑 이야기 🍽️
1. 손님: "파스타 주세요!" (요청)
2. 웨이터: 주방에 전달
3. 주방: 파스타 요리
4. 웨이터: "파스타 나왔습니다!" (응답)
5. 손님: 파스타를 받음
HTTP도 똑같아요:
1. 브라우저: "index.html 주세요!" (HTTP 요청)
2. 서버: 파일을 찾음
3. 서버: "여기 있어요!" (HTTP 응답)
4. 브라우저: 페이지를 보여줌
HTTP의 정의
HTTP (HyperText Transfer Protocol)
- 웹 브라우저와 서버가 데이터를 주고받는 규칙
- 프로토콜 = 약속된 규칙
- 웹의 기초가 되는 통신 방법
HTTP 요청/응답 흐름
┌─────────┐ ┌─────────┐
│ │ ── HTTP 요청 (Request) → │ │
│ 브라우저 │ │ 서버 │
│ │ ← HTTP 응답 (Response) ── │ │
└─────────┘ └─────────┘
전체 과정
- 요청 (Request): 브라우저가 서버에게 뭔가를 달라고 부탁
- 처리 (Processing): 서버가 요청을 처리
- 응답 (Response): 서버가 결과를 브라우저에게 보냄
- 렌더링 (Rendering): 브라우저가 화면에 표시
HTTP 메소드 (요청 방법)
서버에게 "어떻게" 할지 알려주는 동사예요.
1. GET 📖
"가져오기" - 데이터를 달라고 요청
GET /products/123
예시:
- 웹페이지 보기
- 검색 결과 가져오기
- 상품 목록 보기
특징:
- 데이터를 가져오기만 함
- 서버의 데이터를 변경하지 않음
- URL에 데이터가 보임
- 북마크 가능
실제 사용:
https://google.com/search?q=javascript
└───────┬──────┘
GET 파라미터
2. POST 📝
"만들기" - 새 데이터를 서버에 보냄
POST /users
{
"name": "홍길동",
"email": "hong@example.com"
}
예시:
- 회원가입
- 게시글 작성
- 주문하기
특징:
- 서버에 데이터 생성
- 본문(Body)에 데이터 포함
- URL에 데이터가 보이지 않음
- 북마크 불가
3. PUT ✏️
"수정하기" - 기존 데이터를 통째로 바꿈
PUT /users/123
{
"name": "김철수",
"email": "kim@example.com"
}
예시:
- 프로필 전체 수정
- 게시글 전체 수정
4. PATCH 🔧
"일부 수정하기" - 기존 데이터의 일부만 바꿈
PATCH /users/123
{
"email": "newemail@example.com"
}
예시:
- 이메일만 변경
- 비밀번호만 변경
5. DELETE 🗑️
"삭제하기" - 데이터를 삭제
DELETE /users/123
예시:
- 계정 삭제
- 게시글 삭제
- 상품 삭제
HTTP 메소드 비교표
| 메소드 | 용도 | 데이터 변경 | 데이터 위치 |
|---|---|---|---|
| GET | 조회 | ❌ | URL |
| POST | 생성 | ✅ | Body |
| PUT | 전체 수정 | ✅ | Body |
| PATCH | 일부 수정 | ✅ | Body |
| DELETE | 삭제 | ✅ | URL |
HTTP 요청 구조
GET /api/users?page=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer token123
{본문 데이터 (POST, PUT, PATCH일 때)}
구성 요소
-
요청 라인:
GET /api/users HTTP/1.1- 메소드: GET
- 경로: /api/users
- HTTP 버전: 1.1
-
헤더 (Headers): 추가 정보
Host: 어느 서버?
User-Agent: 어떤 브라우저?
Accept: 어떤 형식을 받을까?
Authorization: 인증 정보 -
본문 (Body): 실제 데이터 (POST, PUT, PATCH)
HTTP 응답 구조
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1234
{
"id": 1,
"name": "홍길동"
}
구성 요소
-
상태 라인:
HTTP/1.1 200 OK- HTTP 버전: 1.1
- 상태 코드: 200
- 상태 메시지: OK
-
헤더 (Headers): 응답 정보
Content-Type: 어떤 형식?
Content-Length: 데이터 크기 -
본문 (Body): 실제 데이터
HTTP 상태 코드 🚦
서버가 **"어떻게 됐어"**를 알려주는 숫자예요.
2xx - 성공 ✅
| 코드 | 의미 | 설명 |
|---|---|---|
| 200 | OK | 성공! |
| 201 | Created | 새로 만들어졌어요 |
| 204 | No Content | 성공했지만 보낼 내용이 없어요 |
3xx - 리다이렉션 🔄
| 코드 | 의미 | 설명 |
|---|---|---|
| 301 | Moved Permanently | 영구적으로 이동했어요 |
| 302 | Found | 임시로 다른 곳에 있어요 |
| 304 | Not Modified | 변경 안 됐으니 캐시 사용하세요 |
4xx - 클라이언트 오류 ❌
| 코드 | 의미 | 설명 |
|---|---|---|
| 400 | Bad Request | 요청이 잘못됐어요 |
| 401 | Unauthorized | 로그인이 필요해요 |
| 403 | Forbidden | 권한이 없어요 |
| 404 | Not Found | 찾을 수 없어요 |
| 429 | Too Many Requests | 요청을 너무 많이 했어요 |
5xx - 서버 오류 🔥
| 코드 | 의미 | 설명 |
|---|---|---|
| 500 | Internal Server Error | 서버에 문제가 생겼어요 |
| 502 | Bad Gateway | 게이트웨이 오류 |
| 503 | Service Unavailable | 서비스를 사용할 수 없어요 |
팁
HTTP Status Guide에서 모든 상태 코드를 확인할 수 있어요!
실전 예시
예시 1: 검색하기 🔍
요청:
GET https://google.com/search?q=javascript
응답:
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>검색 결과...</body>
</html>
예시 2: 로그인하기 🔐
요청:
POST https://api.example.com/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password123"
}
응답 (성공):
HTTP/1.1 200 OK
Content-Type: application/json
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": 1,
"name": "홍길동"
}
}
응답 (실패):
HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
"error": "Invalid email or password"
}
예시 3: 게시글 작성 ✍️
요청:
POST https://api.example.com/posts
Content-Type: application/json
Authorization: Bearer token123
{
"title": "첫 게시글",
"content": "안녕하세요!"
}
응답:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 42,
"title": "첫 게시글",
"content": "안녕하세요!",
"createdAt": "2025-01-23T10:30:00Z"
}
예시 4: 프로필 수정 ✏️
요청:
PATCH https://api.example.com/users/me
Content-Type: application/json
Authorization: Bearer token123
{
"email": "newemail@example.com"
}
응답:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "홍길동",
"email": "newemail@example.com"
}
예시 5: 게시글 삭제 🗑️
요청:
DELETE https://api.example.com/posts/42
Authorization: Bearer token123
응답:
HTTP/1.1 204 No Content
HTTP 헤더 이해하기
자주 사용하는 요청 헤더
Content-Type: application/json # 보내는 데이터 형식
Accept: application/json # 받고 싶은 데이터 형식
Authorization: Bearer token123 # 인증 토큰
User-Agent: Mozilla/5.0... # 브라우저 정보
Cookie: session=abc123 # 쿠키