TIL

[AI와 함께하는 네트워크 공부] 3. HTTP란?

양밀루 2025. 7. 14. 19:39

HTTP (HyperText Transfer Protocol)

웹에서 클라이언트와 서버가 데이터를 주고받기 위한 통신 규약

 

🌐 HTTP의 특징

1. 무상태성 (Stateless)

서버는 클라이언트의 이전 요청을 기억하지 않습니다.

요청 1: "로그인 해주세요" → 서버: "로그인 성공"
요청 2: "내 정보 보여주세요" → 서버: "누구세요? 다시 로그인하세요"

 

  • 서버 부담 감소: 각 요청마다 상태를 저장할 필요가 없어서 메모리 절약
  • 확장성: 여러 서버에 요청을 분산시키기 쉬움
  • 단순성: 각 요청이 독립적이라서 이해하기 쉬움

문제점과 해결책:

문제: 로그인 상태를 유지하려면?
해결: 쿠키(Cookie), 세션(Session), 토큰(Token) 사용

 

2. 비연결성 (Connectionless)

요청과 응답이 끝나면 연결을 끊습니다.

1. 클라이언트 → 서버: 연결 요청
2. 서버 → 클라이언트: 연결 승인
3. 클라이언트 → 서버: HTTP 요청
4. 서버 → 클라이언트: HTTP 응답
5. 연결 종료 🔌

장점:

  • 서버 리소스 절약 (연결 유지 비용 없음)
  • 많은 사용자 동시 처리 가능

단점:

  • 매번 연결 설정/해제 오버헤드
  • 연속된 요청 시 비효율적

개선책: HTTP Keep-Alive

연결 유지 시간 설정으로 여러 요청을 같은 연결에서 처리

 

3. 텍스트 기반 프로토콜

사람이 읽을 수 있는 텍스트 형태로 통신합니다.

GET /api/users HTTP/1.1
Host: example.com
User-Agent: iOS-App/1.0

📝 HTTP 요청(Request) 구조

GET /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer abc123
User-Agent: MyApp/1.0

{"filter": "active"}

구성 요소:

  1. Request Line: 메서드 + 경로 + HTTP 버전
  2. Headers: 요청에 대한 메타데이터
  3. Body: 실제 전송할 데이터 (선택적)

iOS에서 구현:

let url = URL(string: "https://api.example.com/api/users/123")!
var request = URLRequest(url: url)
request.httpMethod = "GET"  // Request Line
request.setValue("application/json", forHTTPHeaderField: "Content-Type")  // Headers
request.setValue("Bearer abc123", forHTTPHeaderField: "Authorization")
request.httpBody = jsonData  // Body

📨 HTTP 응답(Response) 구조

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 156
Server: nginx/1.18.0

{
  "user": {
    "id": 123,
    "name": "김철수",
    "email": "kim@example.com"
  }
}

구성 요소:

  1. Status Line: HTTP 버전 + 상태코드 + 상태메시지
  2. Headers: 응답에 대한 메타데이터
  3. Body: 실제 응답 데이터

iOS에서 처리:

URLSession.shared.dataTask(with: request) { data, response, error in
    if let httpResponse = response as? HTTPURLResponse {
        print("상태코드: \(httpResponse.statusCode)")  // Status Line
        print("헤더: \(httpResponse.allHeaderFields)")  // Headers
    }
    
    if let data = data {
        // Body 데이터 처리
        let user = try? JSONDecoder().decode(User.self, from: data)
    }
}

상태코드랑 메서드는 다음에 이어서..!