HTTP (HyperText Transfer Protocol)
웹 서비스 통신(서버와 클라이언트 간의 데이터 송수신)에 사용되는 통신 규약, 애플리케이션 계층
HTTP의 역사
HTTP/0.9 : GET 메서드만 지원, HTTP 헤더 X
HTTP/1.0 : 메서드, 헤더, 상태코드 추가
- 요청 헤더 : http 버전이 생김
- 응답 헤더 : 상태코드와 content-type이 생겨 html 파일 외 다른 타입의 파일도 전송
- 단기커넥션 (Short-lived connection) : connection 하나당 1 요청, 1 응답만 처리 가능, 매번 새로운 연결로 성능 저하 (RTT 증가) 및 서버 부하 비용 증가
RTT 개선 방법
- 이미지 스플리팅 : 한 이미지를 background - position 이라는 CSS 설정을 통해 여러 이미지로 표기하는 방법
- 코드 압축 : 개행 문자, 빈칸 없애서 크기 최소화 하는 방법
- 이미지 Base64 인코딩 : 이미지 파일을 64진법의 ASCII 문자열로 인코딩하는 방법
HTTP/1.1 : 대부분의 기능이 추가
우리가 아는 대부분의 HTTP 기능이 1.1에 구현된 것이고, 2와 3에서는 성능 개선에 초점이 맞춰져 있음
- 지속 연결 (Persistent connection) : 지정한 timeout 동안 연속적인 요청 사이에 커넥션을 닫지 않음. 기존 연결에 대해 handshake 생략
- keep-alive : persistent connection을 하기 위해, 헤더에 명시하는 옵션
- PipeLining : 여러개의 요청을 보낼 때 처음 요청이 응답될 때까지 기다리지 않고 요청을 한꺼번에 보내서 대기 시간을 줄이는 기술.
- Head Of Line Blocking과 같은 문제점이 많아 사장됨
- HTTP2에서 멀티플렉싱 알고리즘으로 대체됨
문제점
- Head of line blocking (HOLB) : 이전 패킷을 전송하는데 지연이 발생해 패킷을 전송하지 못하는 상황
- 무거운 헤더 구조, 중복된 헤더값 -> 메모리 자원 낭비
HTTP/2 : HTTP 1.1 성능 개선 및 확장
Text 형식이었던 HTTP 메시지를 더 작은 단위인 바이너리 형태로 쪼개서 캡슐화 하여 ( : Binary Framing) 아래와 같은 기능 구현
- 멀티플렉싱 (multiplexing) : HTTP 헤더 메세지를 바이너리 형태의 프레임으로 나누고, 하나의 커넥션으로 동시에 여러개의 메세지 스트림을 응답 순서에 상관없이 주고 받는 것
- HTTP/1.1의 Connection Keep-Alive, Pipelining, Head Of Line Blocking을 개선
- latency 감소, 네트워크 비용 감소
프레임 단위로 이루어진 요청과 응답 메세지는 하나의 스트림을 통해 이루어지며, 이러한 스트림들이 하나의 커넥션 내에서 병렬적로 처리된다. 하나의 커넥션에서 여러개의 스트림이 동시에 열리니 속도가 빠를수밖에 없다.
- 헤더 압축 : HPACK 압축을 통한 헤더 중복값 개선
- 서버 푸시 : 클라이언트의 요청에 대해 필요한 리소스들을 미리 클라이언트의 캐시로 전송
- 요청의 우선순위 처리 (Stream Prioritization) : 클라이언트가 스트림에 식별자(우선순위)를 설정
문제점
- 여전히 TCP를 사용하기 때문에 handshake의 RTT로 인한 지연 시간 (Latency)이 발생
- TCP는 패킷이 유실되거나 오류가 있을 때 재전송하는데, 이 과정에서 패킷의 지연 시간 발생
- 애플리케이션 계층에서 HTTP HOLB를 해결했다 하더라도, 전송 계층에서 TCP HOLB를 해결한 것은 아님
HTTP/3 : TCP 대신에 UDP를 이용한 QUIC 프로토콜 사용
QUIC (Quick UDP Internet Connections)이라는 계층 위에서 돌아가며, TCP 기반이 아닌 UDP 기반으로 돌아감
기존 TCP의 고질적인 지연시간(RTT)를 해결
- 보안 세션을 설정하기 위해 한 번의 handshake만 필요 (첫 연결 설정에 1-RTT만 소요)
- QUIC 내에 TLS 인증서를 내포하고 있으며, 초기 연결 설정에서 필요한 인증 정보와 데이터를 함께 전송
HTTPS (HyperText Transfer Protocol Secure)
정보를 암호화하는 SSL(Secure Socket Layer)/TLS(Transport Layer Security) 프로토콜을 이용하여 클라이언트와 서버가 데이터를 주고받는 통신 규약
SSL/TLS 동작 방식
- 대칭키 기법과 공개키(비대칭키) 기법을 함께 사용
- 클라이언트와 서버간 데이터를 암호화하기 위한 세션키를 교환하는 과정에서 공개키(비대칭키) 사용
- 세션키 교환 후 데이터를 교환하는 과정에서 대칭키 사용
대칭키
- 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘
- 중간에 누군가 암호 키를 가로채면 암호화된 정보가 유출될 수 있는데, 이 문제를 보완한 방식이 공개키
공개키 (비대칭키)
- 암호화와 복호화에 서로 다른 키를 쓰는 알고리즘
- 개인키(private key)와 공개키(public key)를 쌍으로 이룬 형태
References
- 면접을 위한 CS 전공지식 노트 - 2.5 HTTP
- HTTP 1.1과 HTTP 2.0 비교하기
- HTTP는 무엇일까요? - 기본 핵심 요약 총정리
- [Tech Trend] 구글이 제안한 인터넷통신 표준 ‘QUIC’, TCP 대체할까
- 신입 개발자 기술면접 질문 정리 - 네트워크
- 그림으로 쉽게 보는 HTTPS, SSL, TLS
'Computer Science > Network' 카테고리의 다른 글
[네트워크] 비동기 메시지 전송하기 (0) | 2024.05.22 |
---|---|
[NW] 학부 과정 복습 (0) | 2024.05.09 |