[네트워크] HTTP/1.x
2019-01-13 | HTTPHTTP
- Hypertext Transfer Protocol
- 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜
- 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다.
HTTP/1.0 요청과 응답
- Header + body 로 구성되어있다.
- 요청과 응답이 plain text로 작성됨
Request
: 클라이언트가 서버에게 요청을 보낸다
GET / HTTP/1.1
HOST: rmcodestar.github.io
Accpet: text/html, text/plain, */*
Accpet-Encoding: gzip, compress
Accpet-Language: ko-KR
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
\r\n
Response
서버가 클라이언트에게 응답한다
HTTP/1.1 200 OK
Server: GitHub.com
Content-Type: text/html; charset=utf-8
Content-Length: 5517
Connection: keep-alive
\r\n
<!DOCTYPE html>
<html lang="ko">....
HTTP methods
메서드는 요청의 종류를 서버에게 알려주기 위해서 사용한다.
GET /index.html HTTP/1.1
요청의 헤더의 첫번째 줄에 적혀있다
- GET : 정보를 요청
- POST : 정보를 밀어넣기 위해서 사용한다.
- PUT : 정보를 업데이트하기 위해서 사용한다.
- DELETE : 정보를 삭제하기 위해서 사용한다.
- HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
- OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청한다.
- TRACE : 클라이언트의 요청을 그대로 반환한다.
HTTP 상태코드
HTTP/1.1 200 OK
응답의 헤더의 첫번째 줄에 적혀있다
- 1xx : 조건부 응답
- 2xx : 성공
- 3xx : 리다이렉션
- 4xx : 클라이언트의 요청 오류
- 5xx : 서버 오류
대표적인 응답코드
코드번호 | 설명 | 비고 |
---|---|---|
200 | 성공 | 서버가 요청을 성공함 |
302 | 임시이동 | 요청한 페이지가 다른 위치로 임시이동 했다. 요청자는 여전히 현재 페이지를 요청해야 한다. |
304 | 수정되지 않음 | 마지막 요청 이후 요청한 페이지가 수정되지 않았다 |
400 | 잘못된 요청 | 주로 헤더 포멧이 HTTP 규약에 맞지 않을 경우 |
401 | 권한 없음 | |
404 | 찾을 수 없음 | 서버가 요청한 페이지(Resource)를 찾을 수 없다. |
500 | 내부 서버 오류 | 서버에 오류가 발생하여 요청을 수행할 수 없다. |
HTTP 버전
HTTP/0.9
-
HTTP 버전 번호 명시 안함
- HTTP
header
가 없음 —> HTML 파일만 전송이 가능했음 - method는
GET
이 유일
HTTP/1.0
-
HTTP 버전 정보 명시, (ex:
HTTP/1.0
) -
header
가 생김Content-type
헤더를 통해 다양한 타입의 문서를 전송할 수 있께 됨.
-
응답시 상태코드를 붙임 —> 브라우저가 요청에 대한 성공과 실패를 알게 됨
-
TCP connection에서 한번에 하나의 요청 만이 가능 (short-lived connection)
HTTP/1.0 한계
Host
헤더가 필수가 아니었다- caching 옵션이 빈약
- 여러 요청 사이에 연결을 유지하는 기능이 없음
HTTP/1.1
Host
헤더가 필수가 됨 —> virtual Hosting이 지원- request pipelining 지원
- 지속적인 연결을 해 주는 persistent connection 지원
Connection
헤더
- multiple request 처리 가능
- 추가적인 캐시 제어 메커니즘이 도입됨
- methods : GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE.
RFC 7231
HTTP 1.1 한계
- 파이프라이닝은
HOL blocking(Head of line blocking)
의 문제가 있음 - 느리다..
- 무거운 헤더.. 덕지덕지 붙어 있는 쿠키들..
- 기본적으로 요청을 보내고 응답을 받아야만 다음 요청을 보낼 수 있기 때문에 요청하는 리소스가 많아질 수록 느릴 수 밖에 없음.
HTTP/1.x의 커넥션 관리
HTTP 1.0
- Short-lived connections
- 요청이 보내져야 할 때마다 커넥션들은 매번 새롭게 생성되었고 응답이 도착한 이후에 연결을 닫는 형태로 단기로만 유지되었습니다.
HTTP 1.1 : 2가지 모델이 추가됨
- Persistent connection
- 영속적인 커넥션 모델은 연속적인 요청 사이에 커넥션을 유지하여 새 커넥션을 여는데 필요한 시간을 줄일 수 있다.
Keep-alive
헤더로 연결 지속 시간을 설정할 수 있음- 단점 : 유휴 상태일때에도 서버 리소스를 소비하며, 과부하 상태에서는 DoS attacks을 당할 수 있음
- Pipelining
- 응답조차도 기다리지 않고 연속적인 요청을 보내서 네트워크 지연을 더욱 줄일 수 있다.
- HOL blocking 문제가 있음
Reference
- MDN - HTTP의 진화
- MDN - HTTP/1.x의 커넥션 관리
- DEV 구루비 - HTTP의 이해
앞으로 공부할 주제
- SPDY
- HTTP/2