Hyper Text Transfer Protocol은 인터넷 상에서 데이터(주로 HTML파일)을 주고 받기 위한 네트워크 전송 규약이다. 버전은 1.0과 1.1그리고 2.0이 있다. 주로 사용되는 서버 포트는 80번이다. 간단하게 인터넷 주소에 http://이 붙은 것은 이것으로 데이터를 받는 것이라고 생각하면 된다.
최근 대부분의 프로그래밍 언어나 게임엔진에서는 HTTP라이브러리가 있어서 실시간 네트워크 게임이 아닌 경우 HTTP를 이용하여 서버와 통신하는 경우가 많다.
전송방식[편집 | 원본 편집]
HTTP는 기본적으로 클라이언트가 서버에게 데이터를 요청한 뒤, 서버에서 데이터를 받으면 서버와의 연결을 끊는 방식이다. 전화로 따지자면, 한 번 전화를 걸어서 계속 이야기를 하는 방식이 아니라, 이야기할 게 있을 때마다 걸고, 이야기가 끝나면 전화을 끊는 방식이다.
URL인코딩[편집 | 원본 편집]
프로토콜로 데이터를 전송할 때 특수문자나 알파벳이 아닌 다른 문자가 들어갈 경우 옛날에 제작된 HTTP서버의 경우 해석에 에러가 생길 수 있다. 이 때문에 URL에 들어가는 특수문자나 알파벳이 아닌 다른 문자의 경우 특수한 처리를 거쳐 보내게 된다. 이 방법은, 알파벳이나, /,?,&가 아닌 다른 문자를 %이 붙은 헥사코드로 변환하여 전송한다.
예시로서 "리브레위키"의 경우 UTF-8로 할 경우
- 리->0xEB 0xA6 0xAC
- 브->0xEB 0xB8 0x8C
- 레->0xEB 0xA0 0x88
- 위->0xEC 0x9C 0x84
- 키->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로 들어온 데이터 크기만큼을 읽으면 된다. 주로 사진이나 동영상같은 서버에 저장된 파일을 전송할 때 사용된다.