HTTP/3와 QUIC
Categories:tech
HTTP/3와 QUIC
발생
최근에 웹 개발 관련 자료를 보다가 HTTP/3에 대한 언급을 봤다. HTTP/1.1, HTTP/2는 알고 있었는데 HTTP/3는 처음 들어봤다.
HTTP/3가 무엇이고 기존 버전들과 어떤 차이가 있는지 궁금해졌다. 특히 QUIC이라는 프로토콜을 기반으로 한다고 하는데, 이게 뭔지도 알아봐야겠다.
HTTP 버전별 특징
HTTP/1.1 (1997년)
- 연결당 하나의 요청/응답: 한 번에 하나의 요청만 처리 가능
- Head-of-Line Blocking: 앞의 요청이 완료되어야 다음 요청 처리 가능
- 텍스트 기반: 사람이 읽을 수 있는 형태
GET /index.html HTTP/1.1
Host: example.com
Connection: keep-alive
HTTP/2 (2015년)
- 멀티플렉싱: 하나의 연결로 여러 요청/응답 동시 처리
- 서버 푸시: 서버가 클라이언트 요청 없이 리소스 전송
- 헤더 압축: HPACK을 통한 헤더 크기 최적화
- 바이너리 프로토콜: 더 효율적인 전송
HTTP/3 (2022년)
- QUIC 기반: UDP를 사용하는 새로운 전송 프로토콜
- TLS 1.3 내장: 암호화가 기본으로 포함
- 연결 마이그레이션: 네트워크 변경 시에도 연결 유지
QUIC이란?
QUIC (Quick UDP Internet Connections)는 Google에서 개발한 새로운 전송 프로토콜이다.
QUIC의 특징
1. UDP 기반
- TCP의 3-way handshake 없이 빠른 연결 설정
- 네트워크 혼잡 제어를 애플리케이션 레벨에서 처리
2. 내장된 암호화
- TLS 1.3이 프로토콜에 내장되어 있음
- 별도의 TLS 핸드셰이크 불필요
3. 연결 마이그레이션
- IP 주소나 네트워크가 바뀌어도 연결 유지
- 모바일 환경에서 특히 유용
4. 멀티플렉싱
- HTTP/2와 유사하게 여러 스트림 동시 처리
- Head-of-Line Blocking 해결
HTTP/3의 장점
1. 빠른 연결 설정
TCP + TLS 연결 설정:
1. TCP 3-way handshake (1 RTT)
2. TLS handshake (1-2 RTT)
총 2-3 RTT
QUIC 연결 설정:
1. QUIC handshake (1 RTT)
총 1 RTT
2. 네트워크 변경에 강함
모바일 환경에서 WiFi에서 셀룰러로 전환되어도 연결이 끊어지지 않는다.
3. Head-of-Line Blocking 해결
TCP에서는 패킷 하나가 손실되면 전체 스트림이 멈추지만, QUIC에서는 각 스트림이 독립적으로 처리된다.
실제 사용 현황
브라우저 지원
- Chrome 87+ (2020년)
- Firefox 88+ (2021년)
- Safari 14+ (2020년)
서버 지원
- Cloudflare, Google, Facebook 등 주요 CDN에서 지원
- Nginx, Apache 등 웹서버에서도 지원
사용률
- 2024년 기준 전체 웹 트래픽의 약 30%가 HTTP/3 사용
- 점진적으로 증가하는 추세
구현 예시
클라이언트에서 HTTP/3 사용 확인
// HTTP/3 지원 여부 확인
fetch('https://http3.is/', {
method: 'HEAD'
}).then(response => {
console.log('Protocol:', response.headers.get('alt-svc'));
});
서버 설정 (Nginx 예시)
server {
listen 443 ssl http2;
listen 443 ssl http3;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# HTTP/3 지원
add_header Alt-Svc 'h3=":443"; ma=86400';
}
결론
HTTP/3는 웹의 미래를 위한 중요한 진화이다. QUIC 프로토콜을 통해 더 빠르고 안정적인 웹 경험을 제공한다.
아직 완전히 보편화되지는 않았지만, 주요 서비스들이 점진적으로 도입하고 있어서 곧 표준이 될 것으로 보인다.
웹 개발자로서 HTTP/3의 특징을 이해하고 적절히 활용할 수 있도록 준비해야겠다.
Day-16