HTTP의 진화
HTTP의 진화
🌘 HTTP/0.9 - The one-line protocol
초기에는 버전 넘버가 없었고, 이후에 다른 버전들과 구분하기 위해 0.9 버전 넘버가 붙여졌다.
특징
HTTP 헤더가 없었다.
HTML 파일만 전송이 되었고, 다른 타입의 문서는 전송되지 않았다.
status, error code가 없었다.
문제가 발생하면, 문제에 대한 설명이 HTML에 붙여져서 되돌아갔다.
요청
GET 메소드만 가능했다.
GET {path to the resource}
의 형태였다.
응답
파일 내용으로만 구성되었다.
🌗 HTTP/1.0 - 확장성 만들기
1.0 버전에서는 브라우저와 서버 모두 융통성을 갖도록 확장되었다.
특징
버전 정보 추가
버전 정보가 각 요청 안에 전송되었다.(e.g.
HTTP/1.0
)
status code 추가
응답의 첫 번째 줄에 status code가 전송되었다.
브라우저가 요청의 성공과 실패 여부를 이해할 수 있게 되었고, 그에 따른 행동을 취할 수 있게 했다.
HTTP 헤더 도입
요청과 응답에 HTTP 헤더라는 개념이 도입되었다.
metadata를 전송할 수 있게 되었다.
프로토콜을 유연하고, 확장성있게 되었다.
다른 타입의 문서 전송
Content-Type
헤더로 인하여, plain HTML외에 다른 문서가 전송될 수 있게 되었다.
요청과 응답의 형태
첫 번째 요청/응답
```
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK Date: Tue, 15 Nov 1994 08:12:31 GMT Server: CERN/3.0 libwww/2.17 Content-Type: text/html
GET /myimage.gif HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK Date: Tue, 15 Nov 1994 08:12:32 GMT Server: CERN/3.0 libwww/2.17 Content-Type: text/gif (image content)
GET /en-US/docs/Glossary/Simple_header HTTP/1.1 Host: developer.mozilla.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Wed, 20 Jul 2016 10:55:30 GMT Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a" Keep-Alive: timeout=5, max=1000 Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT Server: Apache Transfer-Encoding: chunked Vary: Cookie, Accept-Encoding
(content)
GET /static/img/header-background.png HTTP/1.1 Host: developer.mozilla.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: / Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
200 OK Age: 9578461 Cache-Control: public, max-age=315360000 Connection: keep-alive Content-Length: 3077 Content-Type: image/png Date: Thu, 31 Mar 2016 13:34:46 GMT Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT Server: Apache
(image content of 3077 bytes)
```
🌖 15년 간의 확장
보안 전송을 위한 HTTP : TLS, SSL
TCP/IP 위에서 HTTP를 전송하는 것을 넘어서서, SSL
(secure socket layer)이라는 암호화된 전송 계층을 추가하였다. SSL은 e-commerce 웹 사이트가 생기게 해주었는데, 이는 SSL이 클라이언트와 서버 사이에 암호화되고, 보장되는 인증 메시지 교환을 해주었기 때문이다.
SSL은 표준이 되어, TLS
(Transport Layer Security)가 되었다. TLS는 암호화된 TCP 연결을 할 수 있게 해준다.
복잡한 애플리케이션을 위한 HTTP
2000년에 새로운 HTTP 패턴이 디자인되었다 : REST
(representational state transfer)
REST : The basic idea of REST is that a resource, e.g. a document, is transferred via well-recognized, language-agnostic, and reliably standardized client/server interactions. Services are deemed RESTful when they adhere to these constraints.
2005년 부터는 새로운 API들이 생겼다.
Server-sent events : 서버가 브라우저에 메시지를 먼저 푸쉬(전송) 수 있다.
WebSocket : 브라우저와 서버 사이에 interactive 통신 세션을 설정할 수 있게 한다. 브라우저는 서버에 polling하지 않고, event-driven 응답을 받을 수 있다.
웹의 보안 모델 완화
HTTP는 웹의 보안 모델인 same-origin 정책과는 독립되어있다.
CORS : Cross-Origin 리소스 공유
CSP : 컨텐츠 보안 정책
많은 헤더들이 추가되었다.
DNT(Do Not Track) : deprecated되었다.
X-Frame-Options : 이 응답 헤더는
<frame>, <iframe>, <embed>, <object>
를 브라우저가 렌더링할 것을 허락하는지에 대한 여부를 나타낸다.Upgrade-Insecure-Requests : 이 요청 헤더는 서버에게 클라이언트가 암호화되고, authenticated 응답을 원한다는 신호를 보낸다.
🌕 HTTP/2 더 나은 성능을 위한 프로토콜
HTTP/1.1에서는 요청이 순차적으로 이루어져야 했다.
HTTP/2 프로토콜의 기초는 구글의 SPDY 프로토콜이다. 이 프로토콜은 responsiveness를 개선시켰고, 중복된 데이터 전송의 문제를 해결하였다.
HTTP/2가 HTTP/1.1과는 달라진 점
Binary 프로토콜이다.
1.1 이하 버전에서는 텍스트 기반으로 헤더와 데이터가 연결되었다면, 2버전에서는 메시지들을 binary 단위로 구성하여, 더 작은 프레임으로 쪼개서 관리한다.
성능 최적화 알고리즘이 적용된다.
Multiplexed 프로토콜이다.
병렬 요청이 같은 커넥션에서 처리될 수 있다.
HTTP/1.1에서의 순서와, 블락킹 제약 사항을 없앴다.
헤더를 압축한다.
HTTP/2의 헤더는 허프만 코드로 인코딩되어 압축된다.
헤더는 set of request들 사이에서 비슷비슷하다. 따라서, 헤더를 압축함으로써, 데이터 전송의 중복과 오버헤드를 없애준다.
서버푸쉬
서버가 클라이언트 캐시에 데이터를 전송
server push
라는 메커니즘으로 인해, 클라이언트의 요청이 없어도 서버가 클라이언트에 데이터를 전송할 수 있다.
참고
Last updated