인터넷 파트에서 HTTP의 기본적인 개념은 다루었다.
이번 파트에서는 HTTP 버전 별 차이점에 대해, 그리고 보안 알고리즘에 대한 내용들을 서술 해 보도록 하겠다.
가장 단순한 형태의 HTTP. 한 연결 당 하나의 요청을 처리하도록 설계 되었으나 RTT가 증가하는 문제를 해결해야 했다.
해결 방법은 스플리팅, 코드 압축, Base64 인코딩 등이 있다.
스플리팅은 한 번에 많은 이미지를 다운받는 게 아니라 많은 이미지가 합쳐진 하나의 이미지를 다운받아서 말 그대로 Spliting 하는 것이다.
코드 압축은 코드에 불필요한 개행 문자, 공백을 날려버리는 것, Base64는 이미지 파일을 64비트 문자열로 인코딩하는 방법이다. 이런 방식을 활용했을 때 이미지 데이터파일을 전달 받기 위해 이미지에 대한 HTTP 요청을 할 필욘 없지만 용량이 조금 더 커지는 문제점이 생긴다.
매번 요청에대한 TCP 연결을 하는 게 아닌, 한번 TCP 초기화를 한 이후 Keep alive 옵션을 통해 여러개의 파일을 송수신 할 수 있도록 하는 옵션이 추가되었다.
한번의 3way handshake만으로도 많은 데이터를 전달 받을 수 있지만 많은 리소스를 처리할 때 대기시간이 길어지는 단점이 생긴다.
또한 HOL Blocking 문제가 생기는데 같은 큐에 있는 패킷이 그 첫번째 패킷에 의해 지연될 때 이런 성능 저하 문제가 발생한다.
그리고 기능이 늘어난 만큼 헤더에 많은 메타데이터가 들어갔기에 무겁다는 단점이 생겼다.
지연시간, 응답시간 이슈를 어느정도 해결하고 멀티플랙싱, 헤더 압축, 서버 푸시, 요청의 우선순위 처리를 지원하게 되었다.
여기서 멀티플렉싱이란 여러개의 스트림을 사용하여 송수신한다는 의미인데 특정 스트림의 패킷이 손실 되더라도 해당 스트림에만 영향을 미치키고 다른 스트림에 영향을 끼치지는 않는다.
하나의 TCP Connection 내에 여러개의 스트림이 존재할 수있고 이들은 병렬적으로 작동한다. 그러므로 HTTP/2 부터는 한 번의 연결을 통해 데이터를 병렬적으로 처리할 수 있고 HOL Blocking 문제를 해결 할 수 있다.
또한 헤더를 압축하기 위해 Huffman coding 이란 기술을 활용했다. Huffman coding은 문자열을 문자 단위로 쪼개 빈도수를 세어 빈도가 높은 정보는 적은 비트 수를 사용해 표현하고 빈도가 낮은 정보는 비트 수를 많이 사용하여 전체 데이터의 비트 양을 줄이는 알고리즘이다.
또한 HTTP/2 부터는 클라이언트 요청 없이 서버가 리소스를 푸시할 수 있게 된다. HTML 파일 내에 존재하는 CSS 파일 같은 경우 그 전에는 그 파일 까지 요청해야 했으나 HTTP/2 부터는 그럴 필요가 없어졌다.
Application Layer와 Transport Layer 사이에 SSL/TLS 계층을 넣은 신뢰할 수 있는 HTTP요청을 의미한다.
SSL/TLS는 클라이언트와 서버가 통신을 주고 받을 때 제 3자가 메시지를 도청하거나 변조하지 못하도록 막는 역할을 한다. 이를 통해 인터셉트와 같은 공격을 방지할 수 있다.
SSL/TLS는 보안 세션이 존재하는데 handshake가 진행된 이후 보안 세션이 생성된다. 이러한 보안 세션을 통해 SSL/TLS는 데이터를 암호화 하고 보안 세션이 만들어 질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘 등이 사용된다.
위의 사진과 같이 TLS Handshake가 진행되면 클라이언트와 서버는 서로가 어떤 암호화 알고리즘을 사용할 수 있는 지 확인한다. 지원하는 알고리즘을 사용할 수 있다면 서버에서 클라이언트로 인증서를 보내는 인증 메커니즘이 진행된다. 그 후 암호화 된 데이터의 송수신이 시작된다.
여기서 인증 메커니즘이란 CA(Certificate Authorities) 에서 발급 한 인증서를 통해 이루어지는데, 이 인증서는 안전한 연결을 시작하는 데 필요한 공개키를 클라이언트에 제공하고 사용자가 접속 한 서버가 신뢰할 수 있다는 사실을 보장한다. 서비스 정보, 공개키, 지문, 디지털 서명 등으로 이루어져있다.
암호화 알고리즘은 다양하게 있지만 대표적으로 Diffie Hellman key exchange 알고리즘, 해싱 알고리즘이 있다.
Diffie Hellman key exchange 알고리즘에서 주로 나오는 예시인데 각자가 가지고 있는 비밀 값과 공개 값을 혼합한 값을 공유하여 각자의 비밀 과 다시 혼합했을 때 같은 공통의 암호키가 생성 된다는 원리를 활용한다.
해싱 알고리즘에는 대표적으로 SHA-256, SHA-384가 있다. 뒤에 붙는 문자는 해싱 결과가 256비트냐, 384비트냐 차이.
HTTP3 는 TCP 위에서 돌아가는 게 아닌 QUIC계층 위에서 돌아간다. 또한 UDP 기반으로 작동한다.
멀티플렉싱 기능을 지원하며 초기 연결 설정 시 지연 시간 감소라는 장점을 가지고 있다.
QUIC는 TCP를 사용하지 않는다. 즉 3way handshake가 이뤄지지 않는다. 그러므로 첫 연결 설정에 1-RTT만 소요된다. 서버의 응답이 도착하는 즉시 통신이 시작된다.
또한 QUIC는 FEC(Forword Error Correction) 이 적용되어 있어, 전송한 패킷이 손실되었따면 수신 측에서 에러를 검출하고 수정할 수 있다. 그러므로 TCP가 아닌 UDP를 사용해도 된다.
지금까지 네트워크를 이해하기 위해 반드시 필요한 지식들을 네 파트를 통해 정리 해 보았다.
다음 주제는 VCS 에 대해 포스팅 해 보도록 하겠다.