Skip to content
Seungwon An edited this page Jun 14, 2024 · 6 revisions

RFC

RFC (Request for Comments)란 인터넷 기술 표준 기관인 IETF (Internet Engineering Task Force)에서 발행하는 문서의 종류다.

많은 RFC 문서들은 정보 제공용이거나 실험용이며 표준이 아니다. 하지만 IETF는 RFC로 게시된 문서 일부를 인터넷 표준으로 채택한다.
webserv 과제는 HTTP/1.1를 준수해야 하므로 2022년에 개정된 HTTP/1.1 표준 문서인 RFC 9112를 참고하였다.

RFC 2119서 RFC 문서의 항목의 필수 정도가 어떤 의미인지 기록되어 있다.

HTTP

HTTP(HyperText Transfer Protocol)WWW(World Wide Web)에서 정보를 주고받기 위한 프로토콜이다.

여기서 말하는 HyperText란 다른 텍스트에 대한 참조가 있는 텍스트를 말한다. html 문서의 <a href="..."></a> 태그가 이에 해당한다.

client-server 모델에서 request-response 프로토콜로 동작한다.
client는 HTTP Request를 server에 보내고, server는 HTTP Response를 client에 보낸다.

<method> <request-URI> <version>
<field-name>: <field-value>
...
<field-name>: <field-value>

<optional message body>

Request-Line

<method> <request-URI> <version>
GET /somedir/page.html HTTP/1.1
  • Method: GET
  • Request-URI: /somedir/page.html
  • Version: HTTP/1.1

다른 Method들은 여기서 볼 수 있다.

Header Fields

<field-name>: <field-value>
Host: www.google.com
Connection: close
User-agent: Mozilla/5.0
Accept-language: en

Host: hostname 을 제외한 모든 헤더 필드는 선택 사항이다.

  • Host: www.google.com, 객체가 존재하는 호스트(파일이 존재하는 서버)
  • Connection: close, 서버에서 지속 연결을 원하지 않음을 알림
  • User-agent: Mozilla/5.0, 클라이언트의 소프트웨어 정보
  • Accept-language: en, 클라이언트가 원하는 언어

다른 HTTP 헤더 필드들은 여기서 볼 수 있다.
HTTP/1.1의 경우 최소 1개 이상의 요청 헤더 필드가 있어야 한다.

Message Body

<optional message body>

optional message body는 사용자가 POST 메소드를 사용했을 때, <form>에 입력한 데이터를 담는다.

꼭 <form>으로 생성한 request가 반드시 POST 메소드를 사용해야 하는 것은 아니다.

<version> <status> <reason-phrase>
<field-name>: <field-value>
...
<field-name>: <field-value>

<optional message body>

Status-Line

<version> <status> <reason-phrase>
HTTP/1.1 200 OK
  • Version: HTTP/1.1
  • Status: 200
  • Reason-Phrase: OK

Status Code

Status Code Classes Description
1xx: informational response client의 request message를 받았으며, 작업을 진행중에 있다.
2xx: successful request message을 성공적으로 수신, 이해 후 수락되었다.
3xx: redirection client는 요청을 완료하기 위해서 추가 동작을 취해야 한다.
4xx: client error request message에 잘못된 구문이 포함되었거나 이행할 수 없다.
5xx: server error request message는 유효한데 서버가 처리를 실패했다.

다른 모든 Status Code들은 여기서 볼 수 있다.

Header Fields

<field-name>: <field-value>
Connection: close
Date: Tue, 11 Jun 2024 22:34:12 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 11 Jun 2024 22:34:12 GMT
Content-Length: 6821
Content-Type: text/html
  • Connection: close, 클라이언트에게 메시지를 보낸 후 TCP 연결을 닫을 것을 알림
  • Date: Tue, 11 Jun 2024 22:34:12 GMT, 메시지가 생성되고 보내진 시간, 객체가 생성되거나 마지막으로 수정된 시간이 아님
  • Server: Apache/2.2.3 (CentOS), 서버의 소프트웨어 정보
  • Last-Modified: Tue, 11 Jun 2024 22:34:12 GMT, 객체가 마지막으로 수정된 시간, 캐싱에 매우 중요
  • Content-Length: 6821, 송신되는 객체의 바이트 수
  • Content-Type: text/html, 객체의 MIME 타입

Request

GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

Response

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close

<html>
  <head>
    <title>An Example Page</title>
  </head>
  <body>
    <p>Hello World, this is a very simple HTML document.</p>
  </body>
</html>

HTTP/1.1 번역본

'웹서버'를 만들기 위해서 텍스트 기반의 통신 프로토콜인, HTTP (HyperText Transfer Protocol) 1.1 프로토콜을 지켜야합니다.

최초의 HTTP 1.1의 RFC문서는 RFC-2068입니다. 하지만, 이를 개선한 HTTP 1.1의 최신 RFC는 RFC 7230 ~ 7235로 6개로 나뉘어서 개정됐습니다. 따라서 RFC 7230 ~ 7235를 레퍼런스로 기준으로 진행하겠습니다.

RFC7230 번역본

Clone this wiki locally