Skip to content

Commit ad7f073

Browse files
authored
Merge pull request #68 from TRUST-ORG/lanzarote
add: http_requests.md
2 parents c909c67 + 2c3b963 commit ad7f073

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
---
2+
title: HTTP Requests
3+
published: 2025-10-02
4+
author: Lanzarote
5+
description: 'HTTP 요청에 대해서 알아봅시다'
6+
image: './img/HTTP_logo.svg'
7+
tags: ['Web', 'Network']
8+
category: 'Web'
9+
draft: false
10+
---
11+
12+
# What is HTTP?
13+
14+
HTTP는 HTML과 같은 Hypermedia documents를 전송하기 위한 [Application-layer protocol](https://en.wikipedia.org/wiki/OSI_model)이다.
15+
웹 브라우저와 웹 서버 간의 통신과 API 등 다양한 용도로 사용된다.
16+
이 게시글에는 간단하게 HTTP 요청에 대해서 알아본다.
17+
18+
# Structure of an HTTP Request
19+
20+
HTTP 요청은 다음과 같은 구조로 이루어져 있다.
21+
22+
```
23+
POST /users HTTP/1.1
24+
Host: example.com
25+
Content-Type: application/x-www-form-urlencoded
26+
Content-Length: 49
27+
28+
name=FirstName+LastName&email=bsmth%40example.com
29+
```
30+
HTTP의 줄바꿈은 무조건 `CRLF`(`\r\n`)를 사용해야 한다.
31+
이유로는 각 운영체제마다 줄바꿈 문자가 다르기 때문이다.
32+
예를 들어, Unix 계열 운영체제는 `LF`(`\n`)를 사용하고, Windows는 `CRLF`(`\r\n`)를 사용한다.
33+
HTTP 프로토콜은 이러한 차이를 없애기 위해 표준으로 `CRLF`를 채택했다.
34+
35+
가장 위에 있는 줄은 **Request Line**이라고 불리며, 세 부분으로 나뉜다.
36+
```
37+
<method> <request-target> <protocol>
38+
```
39+
- **Method**: 요청의 종류를 나타낸다. 예를 들어, `GET`, `POST`, `PUT`, `DELETE` 등이 있다.
40+
- **Request Target**: 요청하는 리소스의 경로를 나타낸다.
41+
- **Protocol**: 사용되는 프로토콜과 버전을 나타낸다.
42+
43+
그 다음 줄들은 **Headers**라고 불리며, 요청에 대한 추가 정보를 제공한다. 각 헤더는 `Key: Value` 형식으로 작성된다. 한 헤더는 무조건 한 줄에 작성되어야 한다. 헤더는 대소문자 구분을 하지 않는다.
44+
45+
일반적인 헤더는 다음과 같다.
46+
- `Host`: 요청하는 서버의 도메인 이름을 나타낸다.
47+
- `Content-Type`: 요청 본문의 데이터 형식을 나타낸다.
48+
- `Content-Length`: 요청 본문의 길이를 바이트 단위로 나타낸다.
49+
50+
마지막으로, 빈 줄 다음에는 **Body**가 있다. Body는 `PATCH`, `POST`, `PUT`의 Method만 사용할 수 있으며, 요청에 포함될 데이터를 담고 있다.
51+
52+
# Request Line
53+
54+
## Request Methods
55+
Request Methods는 요청의 목적과 요청이 성공했을 때 어떤 값을 예상하는지 나타내기 위해 HTTP에서 정의한 일련의 메서드이다.
56+
57+
- **GET**: 서버에서 리소스를 가져온다. 요청 본문이 없어야 하며, 데이터 조회에 사용된다.
58+
- **HEAD**: GET과 동일하지만, 응답 본문이 없다. 리소스의 메타데이터를 확인하는 데 사용된다.
59+
- **POST**: 서버에 데이터를 제출한다. 요청 본문에 데이터를 포함하며, 리소스 생성이나 데이터 처리에 사용된다.
60+
- **PUT**: 지정된 리소스를 요청 본문의 데이터로 대체한다.
61+
- **DELETE**: 지정된 리소스를 삭제한다.
62+
- **CONNECT**: 대상 리소스에 대한 터널을 설정한다.
63+
- **OPTIONS**: 대상 리소스에 대한 통신 옵션을 설명한다.
64+
- **TRACE**: 대상 리소스까지의 경로를 따라 메시지 루프백 테스트를 수행한다.
65+
- **PATCH**: 리소스에 대한 부분적인 수정을 적용한다.
66+
67+
이 Method를 전부 다 알 필요는 없고, 주로 사용하는 `GET`, `POST`, `PUT`, `DELETE` 정도만 알아도 충분하다.
68+
69+
| Method | Safe | Idempotent | Cacheable | Body |
70+
|----------|------|------------|-------------|------|
71+
| GET | Yes | Yes | Yes | No |
72+
| POST | No | No | Conditional | Yes |
73+
| PUT | No | Yes | No | Yes |
74+
| DELETE | No | Yes | No | No |
75+
76+
- Safe: 서버의 상태를 변경하지 않는 메서드인지 여부
77+
- Idempotent: 같은 요청을 여러 번 수행해도 결과가 동일한지 여부
78+
- Cacheable: 응답이 캐시될 수 있는지 여부
79+
- Body: 요청 본문에 데이터를 포함할 수 있는지 여부
80+
81+
## Request Target
82+
Request Target은 다음과 같은 형태로 나타낼 수 있다.
83+
- **Origin-form**: 가장 일반적인 형태로, 경로와 Query string으로 구성된다. `/path/resource?query=string`
84+
- **Absolute-form**: 전체 URL을 포함한다. 주로 프록시 서버에 요청할 때 사용된다. `http://example.com/path/resource`
85+
- **Authority-form**: 주로 CONNECT 메서드에서 사용되며, 호스트와 포트만 포함한다. `example.com:443`
86+
- **Asterisk-form**: 서버 전체를 대상으로 하는 요청에 사용된다. `*`
87+
88+
# Header
89+
90+
## Content-Type
91+
`Content-Type` 헤더는 request/response 본문의 데이터 형식을 나타낸다.
92+
이 헤더를 통해 서버는 클라이언트가 전송하는 데이터의 형식을 이해하고, 적절한 방식으로 처리할 수 있다.
93+
또한 이 헤더로 클라이언트도 서버가 응답하는 데이터의 형식을 이해할 수 있게 된다.
94+
```
95+
Content-Type: <media-type>
96+
```
97+
media-type은 다음과 같은 형식을 가진다.
98+
```
99+
type/subtype; parameter=value
100+
```
101+
자주 쓰이는 media-type은 다음과 같다.
102+
- `text/plain`: 일반 텍스트 데이터를 나타낸다.
103+
- `text/html`: HTML 형식의 데이터를 나타낸다.
104+
- `text/javascript`: JavaScript 형식의 데이터를 나타낸다.
105+
- `application/json`: JSON 형식의 데이터를 나타낸다.
106+
- `image/png`: PNG 이미지 데이터를 나타낸다.
107+
- `image/jpeg`: JPEG 이미지 데이터를 나타낸다.
108+
- `image/webp`: WebP 이미지 데이터를 나타낸다.
109+
- `multipart/form-data`: 파일 업로드와 같은 복잡한 폼 데이터를 나타낸다.
110+
- `multipart/byteranges`: 여러 부분으로 나뉜 데이터를 나타낸다.
111+
- `application/x-www-form-urlencoded`: HTML 폼 데이터를 URL 인코딩 형식으로 나타낸다.
112+
113+
자세한 내용은 [Media types (MIME types) - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types)에서 확인할 수 있다.
114+
115+
> 출처
116+
>
117+
> https://developer.mozilla.org/en-US/docs/Web/HTTP
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)