로그인하고 있지 않습니다. 편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요. 최신판 당신의 편집 213번째 줄: 213번째 줄: {{각주}}{{각주}} [[분류:인터넷 표준]][[분류:인터넷]] 스팸 방지 검사입니다. 이것을 입력하지 마세요!'''H'''yper '''T'''ext '''T'''ransfer '''P'''rotocol은 인터넷 상에서 데이터(주로 HTML파일)을 주고 받기 위한 네트워크 전송 규약이다. 버전은 1.0과 1.1그리고 2.0이 있다. 주로 사용되는 서버 포트는 80번이다. 간단하게 인터넷 주소에 <nowiki>http://</nowiki>이 붙은 것은 이것으로 데이터를 받는 것이라고 생각하면 된다. 최근 대부분의 [[프로그래밍 언어]]나 게임엔진에서는 HTTP라이브러리가 있어서 실시간 네트워크 게임이 아닌 경우 HTTP를 이용하여 서버와 통신하는 경우가 많다. ==전송방식== HTTP는 기본적으로 클라이언트가 서버에게 데이터를 요청한 뒤, 서버에서 데이터를 받으면 서버와의 연결을 끊는 방식이다. 전화로 따지자면, 한 번 전화를 걸어서 계속 이야기를 하는 방식이 아니라, 이야기할 게 있을 때마다 걸고, 이야기가 끝나면 전화을 끊는 방식이다. ==URL인코딩== 프로토콜로 데이터를 전송할 때 특수문자나 알파벳이 아닌 다른 문자가 들어갈 경우 옛날에 제작된 HTTP서버의 경우 해석에 에러가 생길 수 있다. 이 때문에 URL에 들어가는 특수문자나 알파벳이 아닌 다른 문자의 경우 특수한 처리를 거쳐 보내게 된다. 이 방법은, 알파벳이나, /,?,&가 아닌 다른 문자를 %이 붙은 헥사코드로 변환하여 전송한다. 예시로서 "리브레위키"의 경우 UTF-8로 할 경우 #리->0xEB 0xA6 0xAC #브->0xEB 0xB8 0x8C #레->0xEB 0xA0 0x88 #위->0xEC 0x9C 0x84 #키->0xED 0x82 0xA4 라는 바이트로 저장되는데, 이를 텍스트로 하여 <nowiki>https://librewiki.net/wiki/%EB%A6%AC%EB%B8%8C%EB%A0%88%EC%9C%84%ED%82%A4</nowiki>로 전송을 한다. ==요청(Request)== 클라이언트에서 서버로 "이런이런 데이터를 주세요"라고 요청할 때 양식에 맞춰서 말을 걸어야 한다. 양식은 다음과 같다. <pre> [메소드] 요청할데이터 HTTP/[HTTP버전]\r\n HEADER1키 : 값\r\n HEADER2키 : 값\r\n ... HEADERn키 : 값\r\n \r\n </pre> *메소드(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==== 경로 뒤에 ?를 붙인 뒤에 "키=값"식으로 데이터를 전달한다. <pre> GET /index.php?title=리브레_위키:현관 HTTP/1.1\r\n host: librewiki.net\r\n \r\n </pre> 전달할 데이터가 많으면 &를 이용하여 연결한다. <pre> GET /index.php?title=리브레_위키:현관&action=edit HTTP/1.1\r\n host: librewiki.net\r\n \r\n </pre> ====POST==== POST방식은 url뒤에 붙이는 게 아니라 HTTP헤더가 끝난 후 본문에 데이터를 쓰는 방식이다. 주로 오래된 서버의 경우 1024바이트안에 헤더가 전부 들어가는 것이 권장되므로, GET방식으로는 긴 텍스트나 용량이 큰 이미지나 파일을 넣을 수 없다. 따라서 POST방식으로 이미지나, 기타 파일, 긴 텍스트를 서버로 전송한다. POST방식에는 HTTP헤더에 본문(데이터)의 크기를 알려주는 방식(contents-length)과 각 데이터가 몇바이트인지 데이터 시작 앞에서 알려주는 방식이 있는데, 이를 멀티파트(multi-part)라 한다. 멀티파트는 업로드할 파일이 여러 개일 경우에 주로 사용한다. ==응답(Response)== 클라이언트에게서 요청을 받으면 서버에서는 그 요청에 따른 대응을 하여 응답을 보낸다. <pre> HTTP/[HTTP버전] [응답코드] [응답메시지]\r\n 응답헤더1:값\r\n 응답헤더2:값\r\n ... 응답헤더n:값\r\n \r\n [데이터] </pre> === 응답 코드/응답 메시지 === 이 응답 코드와 메시지는 다음과 같은 게 있다. ==== 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 <sup>[[WebDAV]]</sup> *208 Multi-Status <sup>[[WebDAV]]</sup> *226 IM Used <sup>HTTP 델타 인코딩</sup> ==== 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 <sup>[[WebDAV]]</sup> *:요청에 문법 오류가 있다는 뜻이다. *423 Locked <sup>[[WebDAV]]</sup> *:리소스 접근이 잠겨있다는 뜻이다. *424 Failed Dependency <sup>[[WebDAV]]</sup> *:이전 요청이 실패하여 현재 요청도 처리할 수 없다는 뜻이다. *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 <sup>[[WebDAV]]</sup> *510 Not Extended *511 Network Authentication Required ===요청에 따른 응답 데이터=== 데이터를 클라이언트(웹브라우저나 프로그램)에게 보낼 때 두 가지 방식이 있다. ==== Chunked방식 ==== 응답 헤더 transfer-encoding이 chunked라는 값이 들어있으면 chunked방식으로 데이터를 보낸다는 뜻이다. <pre> [다음에 전송될 데이터의 사이즈] \r\n [데이터] \r\n [다음에 전송될 데이터의 사이즈] \r\n [데이터] \r\n ... 0 \r\n \r\n </pre> 이런 방식으로 데이터를 보내며, 마지막에 데이터를 다 보냈다는 의미로 0\r\n\r\n를 보냅으로서 끝난다. 주로 응답 데이터가 항상 일정하지 않은 데이터를 전송할 때 사용된다. ==== Content-Length ==== 응답 헤더 content-length에 응답 데이터의 크기가 들어있으면 content-length방식으로 데이터를 보낸다. 따로 데이터를 가공하지 않고, content-length로 들어온 데이터 크기만큼을 읽으면 된다. 주로 사진이나 동영상같은 서버에 저장된 파일을 전송할 때 사용된다. == 버전 == * [[HTTP/1.0]] * [[HTTP/1.1]] * [[HTTP/2]] * [[HTTP/3]]: [[UDP]] 기반의 [[QUIC]] 프로토콜을 이용한다. {{각주}} [[분류:인터넷]] 요약: 리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다. 취소 편집 도움말 (새 창에서 열림) | () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |} {{lang|}} · {{llang||}} · {{인용문|}} · {{인용문2|}} · {{유튜브|}} · {{다음팟|}} · {{니코|}} · {{토막글}} {{삭제|}} · {{특정판삭제|}}(이유를 적지 않을 경우 기각될 가능성이 높습니다. 반드시 이유를 적어주세요.) {{#expr:}} · {{#if:}} · {{#ifeq:}} · {{#iferror:}} · {{#ifexist:}} · {{#switch:}} · {{#time:}} · {{#timel:}} · {{#titleparts:}} __NOTOC__ · __FORCETOC__ · __TOC__ · {{PAGENAME}} · {{SITENAME}} · {{localurl:}} · {{fullurl:}} · {{ns:}} –(대시) ‘’(작은따옴표) “”(큰따옴표) ·(가운뎃점) …(말줄임표) ‽(물음느낌표) 〈〉(홑화살괄호) 《》(겹화살괄호) ± − × ÷ ≈ ≠ ∓ ≤ ≥ ∞ ¬ ¹ ² ³ ⁿ ¼ ½ ¾ § € £ ₩ ¥ ¢ † ‡ • ← → ↔ ‰ °C µ(마이크로) Å °(도) ′(분) ″(초) Α α Β β Γ γ Δ δ Ε ε Ζ ζ Η η Θ θ Ι ι Κ κ Λ λ Μ μ(뮤) Ν ν Ξ ξ Ο ο Π π Ρ ρ Σ σ ς Τ τ Υ υ Φ φ Χ χ Ψ ψ Ω ω · Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ · Ϊ ϊ Ϋ ϋ · ΐ ΰ Æ æ Đ(D with stroke) đ Ð(eth) ð ı Ł ł Ø ø Œ œ ß Þ þ · Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź · À à È è Ì ì Ǹ ǹ Ò ò Ù ù · İ Ż ż ·  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û · Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ · ǘ ǜ ǚ ǖ · caron/háček: Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž · breve: Ă ă Ğ ğ Ŏ ŏ Ŭ ŭ · Ā ā Ē ē Ī ī Ō ō Ū ū · à ã Ñ ñ Õ õ · Å å Ů ů · Ą ą Ę ę · Ç ç Ş ş Ţ ţ · Ő ő Ű ű · Ș ș Ț ț 이 문서에서 사용한 틀: 틀:ㅊ (원본 보기) (준보호됨)틀:각주 (원본 보기) (준보호됨)틀:취소선 (원본 보기) (준보호됨)