|
| 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 |
0 commit comments