Dev / App Tech Update

Sprint Boot 에서 HTTP/3(QUIC) 적용 및 성능 비교

HTTP/3(QUIC)

4 min read
Sprint Boot 에서 HTTP/3(QUIC) 적용 및 성능 비교

안녕하세요, AIPD팀 최주영입니다.
AIPD팀에서 서비스 중인 ADS, SecureBridge의 게이트웨이 성능 최적화 관점에서, HTTP/3 (QUIC)의 실효성과 적용 가능성을 확인하기 위해 이 글을 작성했습니다.

what is QUIC?

QUIC (Quick UDP Internet Connections) 는 Google 에서 처음 제안하고, 현재는 IETF 표준(RFC 9000) 으로 정의된 차세대 전송 프로토콜입니다.

기존 TCP 위에서 동작하는 HTTP/1.1, HTTP/2와는 달리, QUIC 은 UDP 기반으로 설계되었으며, 이를 통해 연결 지연을 최소하고 네트워크 성능을 크게 개선하는 것을 목표로 합니다.

HTTP/3 는 바로 이 QUIC 을 전송 계층으로 사용하는 HTTP 프로토콜입니다.

QUIC의 특징

  1. UDP 기반 전송
    QUIC는 TCP 대신 UDP 위에서 동작합니다.
    이를 통해 커널 수준의 TCP 제약에서 벗어나, 사용자 공간(User Space)에서 빠르게 프로토콜을 진화시킬 수 있습니다.
  1. 연결 설정 지연 최소화(0-RTT/1-RTT)
    TCP + TLS 조합에서는 연결을 위해 여러 번의 핸드셰이크가 필요합니다.
    반면 QUIC는 전송 계층과 암호화를 통합해, 초기 응답 속도가 크게 향상됩니다.
  1. Head - of - Lind Blocking 문제 해결
    HTTP/2는 멀티플렉싱을 지원하지만, TCP 레벨에서 패킷 하나가 유실되면 전체 스트림이 지연되는 문제가 있습니다.
    QUIC는 스트림 단위로 독립적인 전송과 재전송을 처리하므로 하나의 스트림 패킷 손실이 다른 스트림에 영향을 주지 않습니다.
    이로 인해 대용량 데이터 전송이나 불안정한 네트워크 환경에서도 성능에 이점을 보입니다.
  2. TLS 1.3 내장
    QUIC는 모든 통신이 기본적으로 암호화되며, TLS 1.3이 프로토콜에 내장되어 강제 적용됩니다.

기존 HTTP 통신(HTTP/1.1 or HTTP/2)을 HTTP3으로 변경하기
HTTP/1.1이나 HTTP/2 프로토콜로 동작하면 REST API 를 코드 변경 없이 HTTP 프로토콜로 변경할 수 있습니다.

테스트 환경 조건은 아래와 같습니다.

  • Spring Boot3
  • gradle
  • JAVA 17
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
runtimeOnly 'io.netty.incubator:netty-incubator-codec-http3:0.0.28.Final'
package com.ahnlab.fogger.http3;
import org.springframework.boot.ssl.SslBundle;
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
import reactor.netty.http.Http3SslContextSpec;
import reactor.netty.http.HttpProtocol;
import java.time.Duration;
@Component
class Http3NettyWebServerCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {
	@Override
	public void customize(NettyReactiveWebServerFactory factory) {
		factory.addServerCustomizers(server -> {
			SslBundle sslBundle = factory.getSslBundles().getBundle("server-http3");
			Http3SslContextSpec sslContextSpec =
					Http3SslContextSpec.forServer(sslBundle.getManagers().getKeyManagerFactory(), sslBundle.getKey().getPassword());
			return server
					// Configure HTTP/3 protocol
					.protocol(HttpProtocol.HTTP3)
					// Configure HTTP/3 SslContext
					.secure(spec -> spec.sslContext(sslContextSpec))
					// Configure HTTP/3 settings
					.http3Settings(spec -> spec.idleTimeout(Duration.ofSeconds(5))
							.maxData(10_000_000)
							.maxStreamDataBidirectionalRemote(1_000_000)
							.maxStreamsBidirectional(100));
		});
	}
}
spring:
  ssl:
    bundle:
      jks:
        server-http3:
          keystore:
            location: <key file path>
            password: <password>
            type: PKCS12
@GetMapping("/hello")
String hello() {
  return "Hello HTTP/3!";
}

결과

TCP/IP 통신과 HTTP/3(QUIC) 의 속도 비교

데이터의 용량이 클수록 TCP 통신보다 QUIC 통신이 빠른 것을 알 수 있습니다.

REFERENCE
HTTP/3 support in Reactor 2024.0 Release Train

Share This Post

Check out these related posts

개발팀의 애자일 도입 이야기2

개발팀의 애자일 도입 이야기 1

Lambda@Edge 고급 로깅 제어 기능