Hyper Text Transfer Protocol: 두 판 사이의 차이

(자동 찾아 바꾸기: 「여러가지」(을)를 「여러 가지」(으)로)
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
205번째 줄: 205번째 줄:
==== Content-Length ====
==== Content-Length ====
응답 헤더 content-length에 응답 데이터의 크기가 들어있으면 content-length방식으로 데이터를 보낸다. 따로 데이터를 가공하지 않고, content-length로 들어온 데이터 크기만큼을 읽으면 된다. 주로 사진이나 동영상같은 서버에 저장된 파일을 전송할 때 사용된다.
응답 헤더 content-length에 응답 데이터의 크기가 들어있으면 content-length방식으로 데이터를 보낸다. 따로 데이터를 가공하지 않고, content-length로 들어온 데이터 크기만큼을 읽으면 된다. 주로 사진이나 동영상같은 서버에 저장된 파일을 전송할 때 사용된다.
== 버전 ==
* [[HTTP/1.0]]
* [[HTTP/1.1]]
* [[HTTP/2]]
* [[HTTP/3]]: [[UDP]] 기반의 [[QUIC]] 프로토콜을 이용한다.


{{각주}}
{{각주}}
[[분류:인터넷 표준]]
[[분류:인터넷 표준]]

2023년 3월 12일 (일) 17:08 기준 최신판

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로 들어온 데이터 크기만큼을 읽으면 된다. 주로 사진이나 동영상같은 서버에 저장된 파일을 전송할 때 사용된다.

버전[편집 | 원본 편집]

각주