TCP/IP 구조의 통신은 전부 통신 경로 상에서 엿볼 수 있다. 패킷을 수집하는 것만으로 도청이 가능하다. 평문으로 통신할 경우 메시지의 의미를 파악할 수 있기 때문에 암호화하여 통신해야 한다.
HTTP에 암호화와 인증, 완전성 보호를 더한 HTTPS
HTTP 1.0과 HTTP 1.1의 가장 큰 차이점은 연결의 지속성이다. HTTP는 기본적으로 TCP를 이용하여 통신한다. 이 때, HTTP 1.0은 TCP 세션을 유지하지 않고, 1.1은 TCP 세션을 유지한다.
HTTP 1.0은 매번 데이터를 요청하고 수신할 때마다 새로운 TCP 세션을 맺어햐 하는 반면, HTTP 1.1은 한 번의 TCP 세션에 여러 개의 요청을 보내고 응답을 수신할 수 있다.
즉, HTTP 1.0은 Non-persistent HTTP, HTTP 1.1은 Persistent HTTP라고 할 수 있다. 따라서 HTTP 1.1은 TCP 세션 처리 부하를 줄이고 응답 속도를 개선할 수 있다. 위 그림에서도 볼 수 있듯이, TCP 세션을 열고 닫는 시간이 줄어들기 때문에 두 개의 요청과 응답을 처리하는 속도가 HTTP 1.1이 더 빠른 것을 확인할 수 있다.
HTTP 1.0은 파이프라이닝을 제공하지 않는 반면, HTTP 1.1은 파이프라이닝 기능을 제공한다.
즉, HTTP 1.0은 1번 요청을 보내고 1번 응답을 받아야지 2번 요청을 보내는 식으로 동작하는 반면, HTTP 1.1은 여러 개의 요청을 동시에 보낼 수 있다.
HTTP 1.0은 하나의 IP 주소에 여러 개의 도메인 운영을 할 수 없어서 도메인별로 IP를 구분해 준비해야 하기 때문에 서버의 개수가 늘어나야 했다.
하지만, HTTP 1.1은 가상 호스팅(Virtual Hosting)이 가능해졌기 때문에 하나의 IP 주소에 여러 개의 도메인을 적용시킬 수 있다.
HTTP 1.1은 다음과 같은 2개의 header가 추가되었다.
위와 같은 header의 추가로 프록시가 사용자의 인증을 요구하는 게 가능해졌고, 이를 통해 인증 절차가 향상되었다.
HTTP/2(HTTP 2.0)은 Hypertext Transfer Protocol Version 2의 약자로서, 2015년 IETF에 의해 공식적으로 발표된 HTTP/1.1(기존 표준)의 차기 버전이다.
SPDY(스피디)라는 구글 비표준 개방형 네트워크 프로토콜에 기반한다. 기존의 HTTP methods, status codes, semantics 개념들이 동일하게 호환된다.
기존에 평문을 사용하고, 개행으로 구별되던 HTTP/1.x 프로토콜과 달리, 2.0에서는 바이너리 포맷으로 인코딩된 Message, Frame으로 구성된다.
HTTP 헤더 데이터 압축 : 이전 Header의 내용과 중복되는 필드를 재전송하지 않도록 하여, 데이터를 절약한다. 또한, 개존에 HTTP Header가 평문이었지만, HTTP/2에서는 Huffman Coding을 사용하는 HPACK이라는 Header 압축방식을 이용하여 데이터 전송 효율을 높였다.
HTTP 1.x의 HOL(Head-of-Line) Blocking 문제 해결 : HTTP/1.1까지는 한 번에 하나의 파일만 전송이 가능했다. 이로 인해 여러 파일을 전송할 경우 선행하는 파일의 전송이 늦어지면, 전체 파일 전송의 시간이 늘어나는 문제가 발생했다. HTTP/2.0에서는 여러 파일을 한 번에 병렬 전송하여 이러한 문제를 해결했다.
HOL(Head-of-Line) Blocking : 컴퓨터 네트워킹에서 패킷 대기열이 존재할 때, 앞선 패킷이 지연될 때 발생하는 성능 저하 현상
Stream 우선순위 : HTTP 메시지가 많은 개별 프레임으로 분할될 수 있고 여러 스트림의 프레임을 다중화(Multiplexing)할 수 있게 되면서, 스트림들의 우선순위를 지정할 필요가 생겼다. 클라이언트는 우선순위 지정을 위해 ‘우선순위 지정 트리'를 사용하여 서버의 스트림처리 우선순위를 지정할 수 있다. 서버는 우선순위가 높은 응답이 클라이언트에 우선적으로 전달될 수 있도록 대역폭을 설정한다.
HTTP 쿠키란?
웹 쿠키, 브라우저 쿠키로도 불리는데, 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각을 의미한다. 루 몬텔루라는 웹 브라우저 개발자가 웹 사이트에 접속한 클라이언트를 확인하기 위해 만들었다. HTTP 통신은 Stateless하기 때문에 클라이언트를 확인하기 위해서는 쿠키라는 개념이 따로 필요했기 때문이다.
쿠키는 주로 세션 관리(서버에서 관리하는 로그인 등의 정보를 의미), 개인 설정 유지, 사용자 트래킹(사용자의 행동을 기록하고 분석하는 것) 용도로 사용된다.
쿠키도 결국 HTTP 통신에서 이루어지는 것이므로 HTTP의 응답과 요청에 따라 작동한다.
요청을 받은 서버에서 쿠키를 클라이언트(웹 브라우저)로 보내고 클라이언트는 쿠키를 받으면 도메인 서버 이름으로 정렬된 쿠키 디렉토리에 쿠키를 저장한다. 이후 클라이언트가 동일한 서버로 HTTP 요청을 보내면 저장된 쿠키도 같이 전송되며, 만약 서버에서 쿠키에 업데이트된 내용이 있으면 응답할 때 다시 업데이트된 쿠키를 보내준다.
HTTP 세션이란?
세션(Session)이란 통신을 하기 위해 서로 연결된 순간부터 통신을 마칠 때까지의 기간을 의미한다.
HTTP 세션이란 클라이언트가 웹 서버에 연결된 순간부터 웹 브라우저를 닫아 서버와의 HTTP 통신을 끝낼 때까지의 기간이다. 하지만, 보통 세션이라고 말할 때에는 서버에 세션에 대한 정보(세션 상태, 클라이언트 상태, 세션 데이터 등)를 저장해 놓고 세션 쿠키(고유한 세션 ID값)를 클라이언트에게 줌으로써 서버가 클라이언트를 식별할 수 있도록 하는 방식 자체를 의미하는 경우가 많다.
세션의 작동방식을 보면 우선 클라이언트가 서버에 요청을 보내면 서버에서 요청 헤더(Cookie)를 확인하고 세션 ID가 있는지 확인한다. 만약 없다면 서버에서 세션 ID를 생성한 뒤 응답을 보낼 때 쿠키에 세션 ID를 담아 보낸다. 이 때 서버에서는 세션 객체를 생성하여 정보를 저장한다. 클라이언트는 응답에서 받은 세션 쿠키(세션 ID값)를 저장해두고, 매번 해당 서버에 요청을 보낼 때마다 세션 쿠키를 함께 보내서 자신이 누구인지 인증한다.