Hyper Text Transfer Protocol

Hyper Text Transfer Protocol은 인터넷 상에서 데이터(주로 HTML파일)을 주고 받기 위한 네트워크 전송 규약이다. 버전은 1.0과 1.1그리고 2.0이 있다. 주로 사용되는 서버 포트는 80번이다. 간단하게 인터넷 주소에 http://이 붙은 것은 이것으로 데이터를 받는 것이라고 생각하면 된다.

최근 대부분의 프로그래밍 언어나 게임엔진에서는 HTTP라이브러리가 있어서 실시간 네트워크 게임이 아닌 경우 HTTP를 이용하여 서버와 통신하는 경우가 많다.

전송방식

HTTP는 기본적으로 클라이언트가 서버에게 데이터를 요청한 뒤, 서버에서 데이터를 받으면 서버와의 연결을 끊는 방식이다. 전화로 따지자면, 한 번 전화를 걸어서 계속 이야기를 하는 방식이 아니라, 이야기할 게 있을 때마다 걸고, 이야기가 끝나면 전화을 끊는 방식이다.

URL인코딩

프로토콜로 데이터를 전송할 때 특수문자나 알파벳이 아닌 다른 문자가 들어갈 경우 옛날에 제작된 HTTP서버의 경우 해석에 에러가 생길 수 있다. 이 때문에 URL에 들어가는 특수문자나 알파벳이 아닌 다른 문자의 경우 특수한 처리를 거쳐 보내게 된다. 이 방법은, 알파벳이나, /,?,&가 아닌 다른 문자를 %이 붙은 헥사코드로 변환하여 전송한다.

예시로서 "리브레위키"의 경우 UTF-8로 할 경우

  1. 리->0xEB 0xA6 0xAC
  2. 브->0xEB 0xB8 0x8C
  3. 레->0xEB 0xA0 0x88
  4. 위->0xEC 0x9C 0x84
  5. 키->0xED 0x82 0xA4

라는 바이트로 저장되는데, 이를 텍스트로 하여 https://librewiki.net/wiki/%EB%A6%AC%EB%B8%8C%EB%A0%88%EC%9C%84%ED%82%A4로 전송을 한다.

요청(Request)

클라이언트에서 서버로 "이런이런 데이터를 주세요"라고 요청할 때 양식에 맞춰서 말을 걸어야 한다. 양식은 다음과 같다.

[메소드] 요청할데이터 HTTP/[HTTP버전]\r\n
HEADER1키 : 값\r\n
HEADER2키 : 값\r\n
...
HEADERn키 : 값\r\n
\r\n
  • 메소드(method)
    요청이 어떤 방식으로 해달라는 건지에 대한 것이다. 다음과 같은 것이 있다.
    • GET
      가장 기본적인 요청이다. 서버쪽의 데이터의 변경이 아닌, 그냥 달라고만 하는 것이다.
    • POST
      가장 기본적인 요청이다. 그저 데이터를 달라는 것이 아닌, 서버쪽으로 데이터를 전송하겠다는 의미이다.
    • PUT
    • DELETE
    • OPTION
    • UPDATE
      위 4개의 메소드는 웹브라우저에는 지원하지 않는 요청방식으로 주로 Rest API라는 데서 사용하는 메소드다.
  • HTTP버전
    1.0, 1.1, 2.0이 있으며, HTTP/버전 으로 보낸다.
  • HEADER
    기본적인 요청데이터의 경로 외에, 기타 서버측에 보낼 데이터가 이곳에 들어간다. 대표적으로 다음과 같은 헤더가 있다.
    • host
      1.1이후에서는 꼭 보내야 하는 헤더로 해당 사이트의 도메인이 들어가야 한다.
    • referer
      주로 웹브라우저에서 링크를 눌러 다른 페이지로 이동할 때, 서버에 "이 페이지에서 넘어왔어요"라고 알려 주기 위한 헤더다. 이것으로 다른 사이트에서 이미지를 그냥 복붙한 걸 차단하기도 한다.
    • user-agent
      클라이언트(유저)가 무엇인지를 설명하기 위해 넘겨주는 데이터다. 웹브라우저나 검색봇에 따라서 다른 데이터를 주기 위해서 사용한다.
    • cookie
      쿠키(서버측에서 사용자 별로 따로 저장하는 데이터)를 다시 서버로 보내기 위한 헤버이다.

데이터 전달

헤더는 주로 웹브라우저나 프로그램 자체적으로 서버로 보내기 위해 사용하는 것으로, 서버측의 프로그램에서 필요한 데이터를 정할 수 없다. 그럴 때, 필요한 것이 Get과 Post를 통해 데이터를 전달한다.

GET

경로 뒤에 ?를 붙인 뒤에 "키=값"식으로 데이터를 전달한다.

GET /index.php?title=리브레_위키:현관 HTTP/1.1\r\n
host: librewiki.net\r\n
\r\n

전달할 데이터가 많으면 &를 이용하여 연결한다.

GET /index.php?title=리브레_위키:현관&action=edit HTTP/1.1\r\n
host: librewiki.net\r\n
\r\n

POST

POST방식은 url뒤에 붙이는 게 아니라 HTTP헤더가 끝난 후 본문에 데이터를 쓰는 방식이다. 주로 오래된 서버의 경우 1024바이트안에 헤더가 전부 들어가는 것이 권장되므로, GET방식으로는 긴 텍스트나 용량이 큰 이미지나 파일을 넣을 수 없다. 따라서 POST방식으로 이미지나, 기타 파일, 긴 텍스트를 서버로 전송한다.

POST방식에는 HTTP헤더에 본문(데이터)의 크기를 알려주는 방식(contents-length)과 각 데이터가 몇바이트인지 데이터 시작 앞에서 알려주는 방식이 있는데, 이를 멀티파트(multi-part)라 한다. 멀티파트는 업로드할 파일이 여러 개일 경우에 주로 사용한다.

응답(Response)

클라이언트에게서 요청을 받으면 서버에서는 그 요청에 따른 대응을 하여 응답을 보낸다.

HTTP/[HTTP버전] [응답코드] [응답메시지]\r\n
응답헤더1:값\r\n
응답헤더2:값\r\n
...
응답헤더n:값\r\n
\r\n
[데이터]

응답 코드/응답 메시지

이 응답 코드와 메시지는 다음과 같은 게 있다.

1XX 정보

  • 100 Continue
  • 101 Switching Protocol
  • 102 Processing
  • 103 Early Hints

2XX 성공

  • 200 OK
    정상적으로 요청을 받았다는 의미다.
  • 201 Created
    201과 동일하지만 요청의 결과로 새 리소스가 생성되었음을 알린다.
  • 202 Accepted
    요청을 수신했으나 응답할 수 없는 경우.
  • 203 Non-Authoritative Information
  • 204 No Content
  • 205 Reset Content
  • 206 Partial Content
  • 207 Multi-Status WebDAV
  • 208 Multi-Status WebDAV
  • 226 IM Used HTTP 델타 인코딩

3XX 리다이렉션

  • 300 Multiple Choice
    요청에 대해 여러가지 응답이 가능한 경우. 클라이언트가 이중 하나를 선택해야 된다.
  • 301 Moved Permanently
    요청한 자료의 주소가 바뀌었다는 뜻이다.
  • 302 Found
  • 303 See Other
  • 304 Not Modified
    클라이언트가 캐싱한 데이터가 변경되지 않았음을 확인해줄 때 사용한다.
  • 305 Use Proxy
    프록시를 사용해서 접속해야 함을 알려준다. 현재는 보안상의 이유로 사용하지 않는다.
  • 306 unused
    추후 사용을 위해 예약
  • 307 Temporary Redirect
  • 308 Permanent Redirect

4XX 클라이언트 에러

  • 400 Bad Request
    올바르지 않은 요청이라는 뜻이다.
  • 401 Unauthorized
    인증이 필요한데 인증을 하지 않았다는 뜻이다.
  • 402 Payment Required
    디지털 결제 시스템에 사용될 목적으로 미리 만들어놓은 코드이나 아직 사용하지 않는다.
  • 403 Forbidden
    클라이언트가 이 자료에 접근할 권한이 없다는 뜻이다. 401과 다른 점은 클라이언트가 인증을 받았다는 점.
  • 404 Not Found
    HTTP판 그런 거 없다. 항목 참조.
  • 405 Method Not Allowed
    요청한 방식이 서버에서 사용이 금지된 경우를 뜻한다.
  • 406 Not Acceptable
    서버 주도 컨텐츠 협상에서 서버가 클라이언트의 요청을 만족하는 자료를 찾을 수 없을 때 보낸다.
  • 407 Proxy Authentication Required
    401과 유사하지만 이 경우 프록시를 통한 인증이 필요하다.
  • 408 Request Timeout
  • 409 Conflict
  • 410 Gone
    요청한 자료가 서버에서 완전히 사라졌으며, 대체할 링크도 없을 때 보내게 된다. 클라이언트가 이 응답코드를 받으면 관련된 캐시와 리소스를 지우게 된다.
  • 411 Length Required
  • 412 Precondition Failed
    클라이언트가 잘못된 전제조건으로 요청했다는 뜻이다.
  • 413 Payload Too Large
    요청한 자료의 크기가 서버의 한계를 초과한다는 뜻이다.
  • 414 URI Too Long
    클라이언트가 요청한 URI가 서버 처리 기준보다 길다는 뜻이다.
  • 415 Unsupported Media Type
    요청한 미디어 포맷을 서버가 지원하지 않는다는 뜻이다.
  • 416 Requested Range Not Satisfiable
  • 417 Expectation Failed
    클라이언트의 `Expect`헤더 필드로 요청한 예상이 맞지 않는 경우를 말한다.
  • 418 I'm a teapot
    서버가 찻주전자이기 때문에 커피를 내릴 수 없다는 뜻이다. 1998년하이퍼텍스트 커피 포트 제어 규약(Hyper-Text Coffee Pot Control Protocol)에 추가된 응답 코드이다.
  • ᅟ421 Misdirected Request
  • 422 Unprocessable Entity WebDAV
    요청에 문법 오류가 있다는 뜻이다.
  • 423 Locked WebDAV
    리소스 접근이 잠겨있다는 뜻이다.
  • 424 Failed Dependency WebDAV
    이전 요청이 실패하여 현재 요청도 처리할 수 없다는 뜻이다.
  • 426 Upgrade Required
    클라이언트가 프로토콜을 업그레이드해야 한다는 뜻이다.
  • 428 Precondition Required
  • 429 Too Many Requests
    사용자가 한번에 너무 많은 요청을 보냈다는 뜻이다.
  • 431 Request Header Fields Too Large
  • 451 Unavailable For Legal Reasons
    요청한 정보를 법적인 사유로 제공할 수 없다는 뜻이다.

5XX 서버 에러

  • 500 Internal Server Error
  • 501 Not Implemented
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout
  • 505 HTTP Version Not Supported
  • 506 Variant Also Negotiates
  • 507 Insufficient Storage
  • 508 Loop Detected WebDAV
  • 510 Not Extended
  • 511 Network Authentication Required

요청에 따른 응답 데이터

데이터를 클라이언트(웹브라우저나 프로그램)에게 보낼 때 두 가지 방식이 있다.

Chunked방식

응답 헤더 transfer-encoding이 chunked라는 값이 들어있으면 chunked방식으로 데이터를 보낸다는 뜻이다.

[다음에 전송될 데이터의 사이즈]
\r\n
[데이터]
\r\n
[다음에 전송될 데이터의 사이즈]
\r\n
[데이터]
\r\n
...
0
\r\n
\r\n

이런 방식으로 데이터를 보내며, 마지막에 데이터를 다 보냈다는 의미로 0\r\n\r\n를 보냅으로서 끝난다. 주로 응답 데이터가 항상 일정하지 않은 데이터를 전송할 때 사용된다.

Content-Length

응답 헤더 content-length에 응답 데이터의 크기가 들어있으면 content-length방식으로 데이터를 보낸다. 따로 데이터를 가공하지 않고, content-length로 들어온 데이터 크기만큼을 읽으면 된다. 주로 사진이나 동영상같은 서버에 저장된 파일을 전송할 때 사용된다.

각주