[네트워크] 응용 계층 기초 (HTTP)
cleanUrl: /응용-계층 floatFirstTOC: right
HTTP
HTTP의 특징
- 요청과 응답을 기반으로 동작한다. (요청 응답 기반 프로토콜)
- 미디어 독립적이다. (미디어 독립적 프로토콜)
- 상태를 유지하지 않는다. (스테이트리스 프로토콜)
- 지속 연결을 지원한다. (지속 연결 프로토콜)
1️⃣ 요청 응답 기반 프로토콜
- HTTP는 클라이언트-서버 구조 기반의 요청-응답 프로토콜이다.
- 같은 HTTP 메시지라도 HTTP 요청 메시지와 HTTP 응답 메시지의 형태가 다르다.
2️⃣ 미디어 독립적 프로토콜
- HTTP는 주고받을 미디어 타입에 특별히 제한을 두지 않고 동작하는 미디어 독립적 프로토콜이다.
- 미디어 타입(media type): HTTP에서 메시지로 주고받는 자원의 종류 → 네트워크 세상의 확장자
- 미디어 타입 = MIME 타입(Multipurpose Internet Mail Extensions Type)
타입/서브타입형식으로 구성- 타입(type): 데이터의 유형
- 서브타입(subtype): 주어진 타입에 대한 세부 유형
타입 | 타입 설명 | 서브타입 |
text | 일반 텍스트 형식의 데이터 | text/plain
text/html
text/css
text/javascript |
image | 이미지 형식의 데이터 | image/gif
image/png
image/jpeg
image/webp |
video | 비디오 형식의 데이터 | video/mp4
video/ogg
video/webm |
audio | 오디오 형식의 데이터 | audio/midi
audio/wav |
application | 바이너리 형식의 데이터 | application/octet-stream
application/x-www-form-urlencoded
application/xml
application/pdf
application/json |
multipart | 각기 다른 미디어 타입을 가질 수 있는 여러 요소로 구성된 데이터 | multipart/form-data
multipart/encrypted |
*)가 사용되는 경우도 있다. 별표는 여러 미디어 타입을 통칭하기 위해 사용된다. 예를 들어 text/*는 text 타입의 모든 서브타입을 나타낸다. 또 */*는 모든 미디어 타입을 나타낸다.
또한 미디어 타입에는 부가 설명을 위해 선택적으로 매개변수를 포함할 수도 있다. 매개변수는 타입/서브타입;매개변수=값 형식으로 표현된다. 예를 들어, type/html;charset=UTF-8은 미디어 타입이 HTML 문서 타입이며, HTML 문서 내에서 사용된 문자가 UTF-8로 인코딩되었음을 의미한다.3️⃣ 스테이트리스 프로토콜

- HTTP는 상태를 유지하지 않는 스테이트리스(stateless) 프로토콜이다.
- 즉, 서버는 HTTP 요청을 보낸 클라이언트 관련 상태를 기억하지 않는다.
- 그렇기 때문에 클라이언트의 모든 HTTP 요청은 기본적으로 독립적인 요청으로 간주된다.

- 왜 상태를 유지하지 않는가?
- 서버는 많은 클라이언트와 동시에 상호작용한다.
- 이런 상황에서 모든 클라이언트의 상태 정보를 유지하는 것은 서버에 큰 부담이 된다.
- 또 서버는 여러 대로 구성될 수도 있는데, 클라이언트의 상태를 유지해야 한다면 모든 서버가 이를 공유할 수 있어야 한다.
- 만일 모든 서버가 클라이언트의 상태 정보를 공유하지 못하면 클라이언트는 결국 자신의 상태를 기억하는 특정 서버하고만 상호작용하게 된다.
- 그러다 어느 한 서버에 문제가 발생하면 해당 서버에 종속된 클라이언트는 직전까지의 HTTP 통신 내역을 잃어버리는 상황이 발생할 수도 있다.
- 상태를 유지하지 않으면 어떤 이점이 있는가?
- HTTP 서버가 지켜야 할 가장 중요한 설계 목표에는 확장성(scalability)과 견고성(robustness)이 있다.
- 서버가 클라이언트의 모든 요청을 독립적인 요청으로 처리하면 특정 클라이언트가 특정 서버에 종속되지 않는다.
- 따라서 서버의 추가나 대체가 쉬워진다.
- 즉, 상태를 유지하지 않는 스테이트리스한 특성은 필요한 경우 언제든 쉽게 서버를 추가할 수 있어 확장성을 높이고, 서버 중 하나에 문제가 생기더라도 쉽게 다른 서버로 대체할 수 있어 견고성을 높일 수 있다.
4️⃣ 지속 연결 프로토콜

- HTTP에는 버전이 존재하고, 신뢰성 있는 데이터 전송을 위해 TCP 위에서 동작한다.
- 초기의 HTTP 버전(HTTP 1.0 이하)
- TCP 연결 수립한 후, 요청에 대한 응답을 받으면 연결 종료
- 추가적인 요청-응답을 하기 위해서는 다시 TCP 연결 수립부터 반복
- 이를 비지속 연결이라고 한다.
- 오늘날 HTTP 버전(HTTP 1.1 이상)
- 하나의 TCP 연결상에서 여러 개의 요청-응답을 주고받을 수 있는 기술
- 이를 지속 연결(persistent connection) 또는 킵 얼라이브(keep-alive)라고 한다.
HTTP 메시지 구조

- HTTP 메시지는 시작 라인(start-line), 헤더(headers), 메시지 본문(body)으로 구성된다.
- 먼저, 시작 라인과 헤더가 어떤 역할을 하는지 알아보자.
1️⃣ 시작 라인(start-line)
- 시작 라인으로 HTTP 메시지가 요청 메시지인지 응답 메시지인지를 구분할 수 있다.
- 요청 메시지 → 요청 라인(request-line)
- 응답 메시지 → 상태 라인(status-line)
- 요청 라인과 상태 라인은 다음과 같은 형식으로 구성되어 있다.
- 요청 라인(request-line)
메서드 (공백) 요청 대상 (공백) HTTP 버전 (줄바꿈)
필드 이름 | 설명 |
메서드(method) | 클라이언트가 서버의 자원에 대해 수행할 작업의 종류를 나타낸다.
(예) GET |
요청 대상(request-target) | 요청을 보낼 서버의 자원을 명시한다.
일반적으로 쿼리 문자열이 포함된 URL의 path가 명시된다.
(예1) /hello?q=network
(예2) / |
HTTP 버전(HTTP-version) | 사용된 HTTP 버전을 나타낸다.
(예) HTTP/1.1 |
- 상태 라인(status-line)
HTTP 버전 (공백) 상태 코드 (공백) 이유 구문 (줄바꿈)
필드 이름 | 설명 |
HTTP 버전(HTTP-version) | 사용된 HTTP 버전을 나타낸다.
(예) HTTP/1.1 |
상태 코드(status code) | 요청에 대한 결과를 나타내는 3자리 정수를 나타낸다.
(예) 200 |
이유 구문(reason phrase) | 상태 코드에 대한 문자열 형태의 설명이다.
(예) OK |
(예) HTTP/1.1 200 OK (예) HTTP/1.1 404 Not Found
2️⃣ 헤더(headers)
- HTTP 헤더는 HTTP 메시지 전송과 관련한 부가 정보이자 제어 정보이다.
- 일반적으로 하나의 HTTP 메시지에는 여러 헤더가 포함되어 있다.
- HTTP 헤더는 콜론(:)을 기준으로 헤더 이름(header-name)과 그에 대응하는 헤더 값(header-value)으로 구성되어 있다.
HTTP/1.1 200 OK Content-Type: text/html // 헤더 Content-Length: 648 // 헤더 ...
HTTP 메서드
HTTP 메서드 | 설명 |
GET | 자원을 습득하기 위한 메서드 |
POST | 서버로 하여금 특정 작업을 처리하게끔 하는 메서드 |
PUT | 자원을 대체하기 위한 메서드 |
PATCH | 자원에 대한 부분적 수정을 위한 메서드 |
DELETE | 자원을 삭제하기 위한 메서드 |
GET
- 자원을 조회하는 용도의 메서드
- 서버에 전달할 데이터는 query string을 통해 전달한다.
- 요청 메시지 예시
GET /example-page HTTP/1.1 Host: www.example.com Accept: *
POST
- 서버로 하여금 특정 작업을 처리하도록 요청하는 용도의 메서드
- 주로, 클라이언트가 서버에 새로운 자원을 생성하거나 프로세스를 처리할 때 사용
- 예1) 회원 등록 → 자원 생성
- 예2) 배달 시작 → 프로세스 처리
- 메시지 바디를 통해 서버로 요청 데이터를 전달하면 해당 데이터를 처리한다.
- 요청 메시지 예시
POST /posting HTTP/1.1 Host: www.example.com ... (헤더 후략) ... { "Id": 1, "Title": "컴퓨터 네트워크", "Contents": "너무 중요한 과목!!" }
PUT vs PATCH
- PUT 메서드와 PATCH 메서드는 둘의 차이점에 유의하는 것이 좋다.
- PUT 메서드는 ‘덮어쓰기’를 요청하는 메서드
- PATCH 메서드는 ‘부분적 수정’을 요청하는 메서드
- 예를 들어, 서버에 다음과 같은 형태의 자원이 있다고 가정해보자.
{ "Id": 1, "Title": "컴퓨터 네트워크", "Contents": "너무 중요한 과목!!" }
- PUT 메서드를 요청할 경우
PUT /posting HTTP/1.1 Host: www.example.com ... (헤더 후략) ... { "Id": 1, "Title": "수정된 제목입니다.", }
{ "Id": 1, "Title": "수정된 제목입니다.", }
- PATCH 메서드를 요청한 경우
PATCH /posting HTTP/1.1 Host: www.example.com ... (헤더 후략) ... { "Id": 1, "Title": "수정된 제목입니다.", }
{ "Id": 1, "Title": "수정된 제목입니다.", "Contents": "너무 중요한 과목!!" }
DELETE
- 특정 자원의 삭제를 요청할 때 사용되는 메서드
- 요청 메시지 예시
DELETE /texts/a.txt HTTP/1.1 Host: www.example.com
www.example.com이라는 호스트의 /texts/a.txt를 삭제하도록 요청하는 메시지의 예시이다.HTTP 메서드의 속성 정리

- 안전(Safe Methods)
- 호출해도 리소스가 변경되지 않는다.
- GET, OPTIONS, TRACE등은 조회의 성격을 가지고 있기에 리소스를 변경하지 않고, 그렇기에 안전하다.
- 이 때, 안전의 범위는 해당 리소스에만 해당되며 그 외적인 요소는 고려하지 않는다.
- 리소스 호출시마다 로그가 남는다 하여도 이는 리소스에 대한 영향은 아니기 때문에 고려하지 않는다.
- 멱등(Idempotent Methods)
- 메서드를 반복해서 호출하더라도 결과가 동일해야 한다.
- GET, PUT, DELETE같은경우 여러번 호출하더라도 GET은 같은 데이터를 조회, PUT은 대치된 값을 반환하기에 동일, DELETE도 결과를 삭제하기에 같은 요청을 하더라도 삭제된 내용이 복구되지는 않기에 멱등성을 성립한다.
- POST의 경우 회원 등록을 두 번하거나 주문을 두 번할 경우 에러가 발생하거나 주문 중복이 생길 수 있기에 멱등성이 성립하지 않는다.
- 캐시 가능(Cacheable Methods)
- 표에서는 GET, HEAD, POST, PATCH가 캐시가능이라 되있지만, 실제로는 GET, HEAD정도만 캐시로 사용된다.
- POST, PATCH는 본문 내용(Message Body)까지 캐시 키로 고려해야하는데 구현이 쉽지 않다.
HTTP 상태 코드
상태 코드 | 설명 |
100번대(1xx) | 정보성 상태 코드 |
200번대(2xx) | 성공 상태 코드 |
300번대(3xx) | 리다이렉션 상태 코드 |
400번대(4xx) | 클라이언트 에러 상태 코드 |
500번대(5xx) | 서버 에러 상태 코드 |
100번대(Informational)
- 요청이 수신되어 처리중이다.
- 이제 거의 사용되지 않는다.
200번대(Successful)
- 요청이 정상적으로 처리되었다.
상태 코드 | 이유 구문 | 설명 |
200 | OK | - 조회 요청에 성공적으로 응답하는 경우 |
201 | Created | - POST와 같은 생성요청으로 리소스가 정상적으로 생성된 경우
- 응답 메시지(헤더)에는 생성된 리소스 식별자가 Location 필드에 추가되어 응답된다. |
202 | Accepted | - 요청을 서버에서 받았으나 아직 처리가 되지 않은 경우
- (예) 배치 프로세스 |
204 | No Content | - 서버에서 요청은 성공적으로 수행했지만, 응답시 메시지 바디에 담을 데이터가 없는 경우 |
300번대(Redirection)
- 요청을 완료하기 위해 추가 행동이 필요하다. (리다이렉션)
- 영구 리다이렉션: 특정 리소스의 URL가 영구적으로 이동한다.
상태 코드 | 이유 구문 | 설명 |
301 | Moved Permanently | - 리다이렉트시 요청 메서드가 GET으로 변한다.
- 본문이 변경될 수 있다. |
308 | Permanet Redirect | - 301 상태코드와 기능은 동일하다.
- 응답 메시지의 본문과 요청 메서드가 유지된다. |
- 일시 리다이렉션: 리소스의 URL가 일시적으로 변경된다.
상태 코드 | 이유 구문 | 설명 |
302 | Found | - 리다이렉트시 요청 메서드가 GET을 변한다. |
303 | See Other | - 302와 기능은 같다.
- 리다이렉트시 요청 메서드가 GET으로 변한다. |
307 | Temporary Redirect | - 302와 기능은 같다.
- 응답 메시지의 본문과 요청 메서드가 유지된다. |
304 | Not Modified | - 캐시를 목적으로 사용한다.
- 클라이언트에 리소스가 수정되지 않았음을 알린다.
- 304 응답은 응답에 메시지 바디를 사용하면 안된다.
- 조건부 GET, HEAD 요청시 사용한다. |
400번대(Client Error)
- 클라이언트에서 잘못된 스펙으로 데이터를 보냈거나 인증, 인가가 만족되지 않아 서버에서 요청을 수행할 수 없다.
상태 코드 | 이유 구문 | 설명 |
400 | Bad Request | - 클라이언트가 보내는 포맷이나 데이터에 문제가 있을 경우 발생 |
401 | Unauthorized | - 인증(Authentication)이 되지 않은 클라이언트에서 접근하는 경우 |
403 | Forbidden | - 인증자격은 있지만, 권한(Authorization)이 없는 경우 응답
- (예) 일반 회원이 관리자 페이지에 접근하려는 경우 |
404 | Not Found | - 요청 리소스를 찾을 수 없을 경우 |
405 | Method Not Allowed | - 요청 메서드가 지원하지 않을 경우 |
500번대(Server Error)
- 서버에서 에러가 발생해서 요청을 정상적으로 처리할 수 없다.
상태 코드 | 이유 구문 | 설명 |
500 | Internal Server Error | - 서버 내부 문제로 오류가 발생하는 경우
- 서버측의 로직에서 발생하는 대다수의 예외나 에러
- 정말 서버에 오류가 있을때만 발생해야 한다. 비즈니스 로직과 같이 시스템이 아닌 로직상의 문제가 발생할 때 500 응답코드를 반환해서는 안된다. |
503 | Service Unavailable | - 서버에 트래픽문제 혹은 점검으로 잠시 요청을 처리할 수 없는 경우
- Retry-After 헤더 필드로 얼마 뒤 복구되는지 보낼 순 있지만, 예측 불가능한 경우가 대부분이기에 잘 사용되지 않는다. |
HTTP 주요 헤더
요청 메시지에서 주로 활용되는 HTTP 헤더
1️⃣ Host
GET /hypertext/WWW/TheProject.html HTTP/1.1 Host: info.cern.ch
2️⃣ User-Agent
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
구성 요소 | 설명 |
Mozilla/5.0 | 호환성을 위한 문자열로, 거의 모든 브라우저에서 포함됩니다.
역사적 이유로 남아 있음. |
(Windows NT 10.0; Win64; x64) | 운영 체제 정보: Windows 10, 64비트 |
AppleWebKit/537.36 | 렌더링 엔진 정보: 크롬 및 사파리에서 사용하는 WebKit 기반 |
(KHTML, like Gecko) | 과거 Gecko 엔진과의 호환성 명시 |
Chrome/114.0.0.0 | 브라우저 종류 및 버전 |
Safari/537.36 | 사파리 호환성 표시 |
3️⃣ Referer
Referer는 클라이언트(주로 브라우저)가 현재 요청을 보내기 직전에 머물렀던 웹 페이지의 URL을 나타내는 HTTP 요청 헤더이다. 이 헤더는 사용자가 어떤 링크를 클릭해서 현재 요청이 발생했는지를 서버에 알려주는 역할을 한다.https://example.com/page1 페이지에 있다가, 그 페이지의 링크를 클릭하여 현재 요청이 발생했음을 의미한다.Referer: https://example.com/page1
응답 메시지에서 주로 활용되는 HTTP 헤더
1️⃣ Server
Server 헤더는 클라이언트에게 응답을 보낸 서버 소프트웨어의 정보를 전달하는 HTTP 응답 헤더이다.Server 정보를 통해 해커가 특정 취약점을 노리는 공격을 할 수 있어, 보안상 최소화하거나 제거하기도 한다.Server: Apache/2.4.41 (Ubuntu)
2️⃣ Allow
Allow 헤더는 클라이언트에게 해당 리소스에 대해 어떤 HTTP 메서드들이 허용되는지를 알려주는 응답 헤더이다.Allow 헤더는 주로 405 Method Not Allowed 응답과 함께 사용되며, 허용되지 않는 메서드 요청에 대해 안내한다.HTTP/1.1 405 Method Not Allowed Allow: GET, POST
3️⃣ Location
Location 헤더는 클라이언트에게 다른 URL로 리디렉션할 위치를 명시하는 헤더이다. 보통 3xx 상태 코드와 함께 사용된다.HTTP/1.1 201 Created Location: /users/123
요청과 응답 메시지 모두에서 활용되는 HTTP 헤더
1️⃣ Date
Date: Tue, 28 May 2025 12:34:56 GMT
- HTTP/1.1 표준에 따라 GMT(그리니치 평균시) 기준으로 표기된다.
- 형식은
RFC 1123날짜 형식을 따른다.
2️⃣ Content-Length
Content-Length 헤더는 HTTP 메시지의 본문(body)의 크기(길이)를 바이트 단위로 나타낸다.Content-Length: 348
3️⃣ Content-Type, Content-Language, Content-Encoding
Content-Type 헤더는 메시지 본문에서 사용된 미디어 타입을 의미한다.Content-Type: application/json Content-Type: text/html; charset=UTF-8
Content-Language 헤더는 본문이 사용하고 있는 자연어의 언어 및 지역(locale) 정보를 명시한다.Content-Language: ko-KR Content-Language: en-US
Content-Encoding 헤더는 본문이 어떤 압축 방식으로 인코딩되었는지를 나타낸다.Content-Encoding: gzip Content-Encoding: b44
4️⃣ Connection
Connection 헤더는 클라이언트와 서버 간 TCP 연결을 어떻게 관리할지에 대한 설정을 나타낸다.Connection: keep-alive Connection: close
참고 자료
[HTTP] 미디어 타입 (MIME Type)
MIME 타입 개념 및 탄생이유 MIME은 Multipurpose Internet Mail Extensions (다목적 인터넷 메일 확장) 이 풀네임인데 이름에서 알 수 있듯이 원래는 전자메일(이메일) 시스템을 위해서 만들어진 개념이다. 전자우편은 7비트 ASCII 코드를 사용하여 전송되기 때문에 문자 데이터 이외의 바이너리 데이터(이미지, 동영상, 엑셀 등)를 주고 받을 수 없었다. 이 때문에 주고 받을 때 규칙을 정해서 이미지를 규칙에 맞게 ASCII 코드로 변환하여 보내고 받는 쪽에서는 규칙에 맞게 다시 ASCII 코드에서 바이너리 데이터로 변환하도록 해서 주고받았다. 이 때 사용된 규칙이 바로 MIME type이다. MIME type을 통해 ASCII 코드만 전송할 수 있었던 전자우편의 한계를 넘..
![[네트워크 기초 강의] 36강. HTTP](https://i.ytimg.com/vi/N_qURj2Wtn8/maxresdefault.jpg)
[네트워크 기초 강의] 36강. HTTP
본 강의는 『혼자 공부하는 네트워크』를 바탕으로 제작하였습니다. 👨🏫주요 강의 내용 Ch 05. 응용 계층 05-2 HTTP 00:18 HTTP 01:34 HTTP의 네 가지 특성 18:46 HTTP 메시지 구조 28:04 HTTP 메서드 38:48 개발자 입장에서 생각해보는 HTTP 메서드 40:20 HTTP 상태 코드 ----- ✅어떤 내용을 다루고 있나요? • 거시적/미시적 관점에서 네트워크 살펴보기 • 각 계층에서 통신이 이루어지는 과정 알아보기 • 와이어샤크 실습으로 배운 내용 복습하기 • 안정성, 안전성, 무선 네트워크 관련 심화 주제 알아보기 ⠀ ✅누구를 위한 책인가요? • 웹 개발자가 되고 싶지만 네트워크 지식을 전혀 모르는 비전공자 • 네트워크 전공 수업을 따라가기 어려운 분 • 네트워크 용어가 아리송한 프로그래밍 입문자 • 네트워크 기본 지식이 부족한 주니어 웹 개발자 🔗도서 자세히보기: https://bit.ly/4eIV64B 🔗저자님께 질문하기: https://github.com/kangtegong/self-learning-cs2/issues #네트워크 #HTTP #메시지구조 #메서드 #상태코드
[요약] 모든 개발자를 위한 HTTP 웹 기본 지식[요약] 모든 개발자를 위한 HTTP 웹 기본 지식[요약] 모든 개발자를 위한 HTTP 웹 기본 지식
챕터 1 인터넷 네트워크 정리
