HTTP (HyperText Transfer Protocol)
- 클라이언트와 서버가 자원을 주고 받을 때 쓰는 통신 규약
- 텍스트 교환이므로 누군가 네트워크에서 신호를 가로채면 내용이 노출됨
- HTTPS 프로토콜로 보안 문제 해결
- 애플리케이션 계층
HTTP/1.0
한 연결당 하나의 요청을 처리하도록 설계 → 서버로부터 파일을 가져올 때마다 TCP 3-way handshake로 인해 RTT
증가
RTT Rount-Trip Time
- 패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간, 패킷 왕복 시간
RTT의 증가를 해결하기 위한 방법
- 이미지 스플리팅 - 많은 이미지가 합쳐 있는 하나의 이미지 다운, 이를 기반으로 background-image의 position을 이용하여 이미지 표기
- 코드 압축 - 개행 문자, 빈칸을 없애서 코드 크기 최소화
- 이미지 Base64 인코딩 - 이미지 파일을 64진법으로 이루어진 문자열로 인코딩 → 이미지에 대해 서버에 HTTP 요청 필요 x, 크기 37%정도 커지는 단점
HTTP/1.1
- 한 번 TCP 초기화를 한 이후에
keep-alive
옵션으로 여러 개의 파일 송수신 가능
- HTTP/1.0에도
keep-alive
가 있었지만 표준화 X, HTTP/1.1부터 표준화됨
- 문서 안에 포함된 다수의 리소스 (이미지, css, script)를 처리하려면 리소스 개수에 비례해 대기 시간이 길어지는 단점
HOL (Head Of Line) Blocking
- 네트워크에서 같은 큐에 있는 패킷이 그 첫 번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상
무거운 헤더 구조
- HTTP/1.1 헤더에는 쿠키 등 많은 메타데이터가 들어 있고 압축이 되지 않아 무거웠음
HTTP/2
- SPDY 프로토콜에서 파생, HTTP/1.x보다 지연 시간 줄이고 응답 시간 빨라짐
- 멀티플렉싱, 헤더 압축, 서버 푸시, 요청의 우선순위 처리 지원
멀티플렉싱
- 하나의 TCP 커넥션에 여러 요청을 동시에 보내 latency 줄임
서버 푸시
- 클라이언트가 요청 보내지 않아도 서버가 능동적으로 리소스 푸시
멀티플렉싱
- 여러 개의 스트림을 사용하여 송수신
- 특정 스트림의 패킷이 손실되었다고 하더라도 해당 스트림에만 영향을 미치고 나머지 스트림은 정상 작동
- 애플리케이션에서 받아온 메시지를 독립된 프레임으로 조각내어 서로 송수신하고 다시 조립하며 데이터를 주고받음
- 단일 연결을 사용하여 병렬로 여러 요청/응답 가능 → HOL Blocking 해결
스트림
- 시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소를 가리키는 데이터 흐름
헤더 압축
- HTTP/1.x의 큰 헤더 문제를 압축을 통해 해결 (허프만 코딩 압축 알고리즘을 사용하는 HPACK 압축 형식)
허프만 코딩
- 문자열을 문자 단위로 쪼개 빈도가 높은 정보는 적은 비트 수를 사용하여 표현해 전체 데이터 표현에 필요한 비트양 줄임
서버 푸시
- HTTP/1.1에서는 클라이언트가 서버에 요청을 해야 파일 다운 가능
- HTTP/2는 클라이언트 요청 없이 서버가 리소스 바로 푸시 가능
- 서버가 클라이언트에서 어떤 리소스를 요구할 것인지 미리 알 수 있는 상황에서 유용함
e.g. HTML 문서를 요청 받은 서버는 그 HTML 문서가 링크하고 있는 이미지, CSS, JS 등 리소스 푸시 가능
HTTPS (HTTP Secure)
- HTTP/2는 HTTPS 위에서 동작
- 애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS 계층을 넣은 신뢰할 수 있는 HTTP 요청 → 통신 암호화
SSL/TLS (Secure Socket Layer/Transport Layer Security Protocol)
- SSL 1.0 → 2.0 → 3.0 → TLS 1.0 → 1.3
- 전송 계층에서 보안을 제공하는 프로토콜
- 클라이언트와 서버가 통신할 때 제3자가 메시지를 도청/변조 못하게 함
- 보안 세션을 기반으로 데이터 암호화
- 보안 세션이 만들어질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘 사용