HTTP는 웹 브라우저와 웹 서버 사이에 HTML 문서를 전송하기 위해 사용되는 프로토콜입니다. 웹 브라우저가 요청하면 웹 서버가 응답하며 통신이 이루어집니다.
HTTP/1.0
한 연결당 하나의 요청을 처리해서 요청을 처리하기 위해서 커넥션을 계속 생성합니다.
💥 RTT 증가
서버에 접근할 때마다 3 way handshake를 합니다.
- RTT(Round Trip Time)란?
syn을 보내고 syn+ack 받는 한 과정
해결 방법
- 이미지 스플리팅: 한번에 다운 받고 위치 조정
- 코드 압축 : 공백제거 등 용량을 줄임
- 이미지 Base64 인코딩: 이미지 자체를 인코딩시켜 서버와의 연결을 줄임
HTTP/1.1
keep-alive 옵션으로 TCP 초기화를 한 번만 해도 커넥션을 재사용할 수 있습니다. 커넥션이 되면 순차적으로 데이터를 요청하고 응답합니다.
💥 HOL(Head Of Line) Blocking
앞서 전송된 요청이 오래 걸리면 그 다음 요청의 응답이 늦어지는 문제가 발생합니다.
HTTP/2.0
⭐️ 멀티플래싱
여러 스트림으로 데이터를 요청하고 응답해서 병렬적으로 동시에 처리 가능합니다.
- HTTP의 HOLB 해결
- TCP 자체의 HOLB 미해결: 패킷이 유실되거나 오류가 있을 때 재전송하는데 이 재전송한 패킷에 지연이 발생하면 HOLB 문제가 발생합니다.
헤더 압축
- 허프만 코딩으로 HPACK 압축 형식
- 빈도가 높은 건 적은 비트 수로 저장
- header를 하나의 프레임으로 전송
서버 푸시
- 클라이언트 요청 없이 서버 측에서 리소스를 보낸다
- 예를 들어 html을 요청했을 때 html에다가 css 파일도 푸시
HTTPS
HTTP에 TLS 혹은 SSL을 사용하여 암호화된 버전입니다.
- 제 3자가 메세지를 도청하거나 변조하지 못하도록 하여 보안성을 높였습니다
- SEO(검색 엔진 최적화) 품질 증가에 도움이 됩니다
⭐️ 동작 방식
SSL 핸드쉐이크를 통해 대칭키를 생성합니다.
- Client - Client Hello
아래의 정보를 서버에게 보낸다.
- 브라우저가 사용하는 SSL 버전 정보
- 브라우저가 지원하는 암호화 방식 모음(cipher suite)
- 브라우저가 생성한 임의의 난수
- Server - Server Hello
- 서버가 선택한 암호화 방식(cipher suite)
- 서버의 공개키가 포함된 SSL 인증서(CA의 비밀키로 암호화되어 발급된다)
- 서버가 생성한 임의의 난수
- Client - 서버의 SSL 인증서 확인
- CA 공개키로 복호화하여 위조되지 않았는지 확인한다
- Client - Premaster Secret 생성
클라이언트와 서버의 난수를 활용해서 Premaster Secret을 만들고 SSL 인증서에 있는 서버의 공개키로 암호화하여 이를 서버로 전송한다
- Server - Premaster Secret 복호화
서버의 개인키(비밀키)를 활용하여 세션 키를 생성한다.
여기서 세션키가 HTTPS에서 사용되는 대칭키이고 이 세션키를 통해서 브라우저와 서버 간 데이터를 암복호화하여 주고 받는다
- SSL Handshake 종료
HTTP/3
QUIC 기반 동작
TCP + TSL + HTTP 기능을 모두 구현한 프로토콜로 높은 성능과 신뢰성을 충족시킵니다.
UDP 위에서 빌드됩니다.
RTT 감소
TCP 연결(1-RTT)에 TLS(2-RTT)를 이용해서 통신을 하면 총 3-RTT가 발생하였습니다. QUIC으로 통신을 시작할 때는 1-RTT만 소요됩니다.
QUIC 내에 TLS 인증서를 내포하고 있기 때문에 최초 연결 과정에서 인증 정보와 데이터를 함께 전송하게 되기 때문입니다.
TCP의 HOLB 해결
스트림 자체를 독립적으로 여러개 나누어 처리하도록 하였습니다.