HTTP/3 적용

2020-10-31 16:33:042021-03-25 07:52:17
top
before

HTTP/3 적용

2020-10-31 16:33:042021-03-25 07:52:17

다시 약간 시간적 여유가 생겨서, 만들어 두었던 블로그를 둘러보다보니,
google analytics 에서 보내는 리퀘스트의 프로토콜이 h3-Q050 이라고 표시되었다.

HTTP/3이 아직 브라우져에서 지원하지 않는줄 알고 있었는데, 이를 보니 사용가능한듯 보여서 한번 적용하여 보기로 마음먹었다.

HTTP/3 은 HTTP/2 에서와 같이 HTTP의 기본문법을 유지한체 더 빠른 웹환경을 제공하기 위하기 위한 프로토콜이라고 한다.

기존 HTTP/2가 TCP연결의 멀티플렉싱과, 어플리케이션 레이어에서의 Head-Of-Line Blocking문제를 해결을하였지만,  트렌스포트 레이어 프로토콜은 TCP를 사용하고 이 때문에 TCP레이어 에서는 여전히 Head-Of-Line Blocking 문제가 발생하였다한다.

HTTP/3 에서는 UDP로 구현한 QUIC을 트렌스포트 프로토콜로 사용하여 TCP에서의 HoLB를 해결하고, TCP에서 제공하던 신뢰성 기능을 구현하였으며, TLS사용시 TCP + TLS 2번(3*2)의 핸드쉐이크를 TLS1.3의 핸드쉐이크로 통합하여 초기 지연을 줄이고 header QPACK 압축 등의 개선이 있었다.

기존 http/2 에서 이 블로그는 이와 같고

http/3 에서는 다음과 같다.

이 블로그는 프론트엔드 옵티마이즈로 여러 요청을 보내는 편이 아니어서 큰 의미는 없을듯 보인다.

또 브라우져가 어떤 프로토콜이 가능 할지 알아야 하는데(서버에서 지원할지 안할지), 기존 http/2에서는 ALPN 확장을통하여 TLS 핸드쉐이크 과정에 알수 있었다고 하지만 http/3에서는 quic(tcp 연결이 아닌)을 사용하여야 하므로 alt-svc 헤더를 통해서 다음부터 http/3를 연결할수 있다는 것을 알려 주어야 한다.

때문에 처음접근하는 상태(캐시가 비워진 상태에서)의 접근은 다음과 같이 먼저 http/2로 접근 되고 그때 받은 헤더를 통하여 다음 부터 http/3을 사용한다.

일단은 프로토타입으로 별도의 포트로 열어서 제공하려한다. ( https://bruce.pllip.com:8443 )

아직은 nginx에서 공식적으로 지원하는것이 아니고, cloudflare에서 제공한 nginx patch( https://github.com/cloudflare/quiche/tree/master/extras/nginx , 패치 파일명은 1.16이지만 1.19 에 패치하였는데 되는듯... )를 적용하여 컴파일해서 만들었고 , 지원하는 브라우져도 많지 않은 데다가, 아직 프로토콜도 드레프트이어서 많은 변화가 있을것 같기 때문이다. (h3 뒤에 버전이... 많이 많이 있는듯)

예전 http/2를 적용할때, 2015년에 제안된 프로토콜을 2016년 프로토타입으로 제공하고 2017년 정식으로 적용하였었다.
이번에도 19년에 제안된 프로토콜로 2020년에 프로토타입하고 있으니, 내년쯤에는 일반적이어 지지 않을까? 일반적이어 진다면 브라우져도 위와 같이 헤더로 정보를 받을 필요없이 먼저 http/3을 시도해 볼수도 있지 않을까?

기존 http/2가 바뀌지 않을것 같았던 오래된 프로토콜이 바뀌어서 놀랐다면, 지금 http/3은 이렇게 얼마 안되어서 새로운 프로토콜이 나와서 놀랐다. 얼른 빠르게 정착하여 좋은 웹 환경이 되기를 바란다.