http1.1과 http2.0의 비교 및 프로토콜 전환시 발생하는 안티 패턴




http 1.1보다 비교해서 
http 2.0의 어떤 특성들이 속도 향상에 영향을 주는지,
그리고 http/1.1에서 2.0으로 전환시 주의해야 하는 안티 패턴에 대해 공부했다.


이 안티 패턴들은 
웹서버의 애플리케이션 레벨 프로토콜을 무조건 http2.0으로 업그레이드한다고
성능이 좋아지지 않음을 의미한다.



대다수의 프로젝트나 서비스의 경우 
"이 문제를 해결하기 위해서는 http2.0으로 업그레이드 해야돼요"
보다 
시스템 아키텍쳐를 수정하거나
쿼리문을 최적화, 캐싱을 사용하는 등의 안이 더 현실적일 것이다.



소프트웨어 버전을 최신 버전으로 업그레이드 한다고 성능이 좋아진다는 결론은
다소 hacky한 risky한 결론이라고 생각한다.


업그레이드 전에 프로토콜의 업그레이드 해야할 필요성과
업그레이드 시 영향도를 체크해야한다.



HTTP 1.1

1.0과 비교해서 다음이 추가되었음.

- 웹 서버는 응답 후에도 클라이언트와 TCP 연결을 유지할 수있다.
- Range 요청 추가
- OPTIONS 메서드 추가
- Transfer-encoding 추가
- 파이프라이닝 : 클라이언트가 모든 요청을 동시에 서버로 전송하는 기능.
  동시에 보내더라도 서버에서는 응답을 위해 어쩔 수없이 직렬화를 해야한다.
  (러닝 http/2에 따르면 이를 구현한 서버에서는 제대로 동작하지 않는 경우가 많고
   HOL 현상으로 잘 쓰이지 않는다고한다.)


HTTP의 대안 SPDY와 HTTP 2

SPDY
구글의 마이크 벨시, 로베르토 페온이 2009년 HTTP의 대안으로 SPDY를 제시함.
HTTP/2의 기반을 마련했으며
크롬과 파이어폭스 및 서버 제품에서도 이를 지원한다.


http 1.1의 의미체계를 유지하면서 다음과 같은 기능들이 추가되었다.

- 멀티플렉싱으로 HOL 현상 해결
  데이터를 이진 코드 메시지로 분할하고
  클라이언트가 각 이진 메시지가 속한 스트림을 알 수 있도록 
  메시지에 번호를 부여한다.

- 서버 푸시

- 헤더 압축
   작은 파일은 큰 파일보다 빨리 로드된다.
   http/1.1에서도 http 메시지를 압축하여 용량을 줄이지만
   http/2에서는 http 헤더 패킷에서 중복 정보를 제거하는 HPACK이라는 압축 기법을 사용한다.

- 우선순위 지정
  개발자가 보낼 자원에 직접 우선순위를 세부적으로 지정할 수 있다.
  각 데이터 스트림에 서로 다른 가중치 값을 할당 가능하고
   클라이언트는 어떤 데이터 스트림을 먼저 렌더링 할 지 알 수 있다.



안티 패턴

http/2가 적용된 클라이언트-서버 모델에서는
호스트 당 1개의 연결만 열린다.

러닝 http/2 서적에서는 다음과 같은 
http/1.1에서의 모범 시나리오들이
http/2에서는 안티패턴으로 쓰일 수 있는 예를 제시한다.



스프라이팅
연결을 최소한으로 유지한 채 여러 작은 이미지들을 다운받기 위해
작은 이미지들이 합쳐진 큰 이미지
하나를 다운 받은 후, 쪼개서 사용했었다.

h2에서는 요청으로 인한 중단 없이 다수의 요청을 병렬로 처리 가능하기 때문에
스프라이팅을 고려하지 않아도 되지만
기존 스프라이트를 다시 분리할 필요는 없다.


자원(css/js/html과 같은) 통합


h2로 전환할 때 무엇을 고려해야하는가?

- 브라우저 지원 여부
- TLS everywhere(필수적으로 TLS 1.2이상의 암호화를 적용해야한다.)
- 위와 같은 안티패턴들을 피할 수 있는 최적화
- 사이트의 서드파티 개체 파악
- 기존 클라이언트를 위한 지원 





출처
- https://www.cloudflare.com/ko-kr/learning/performance/http2-vs-http1.1/
- 러닝 http/2

댓글

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code TIL 6 : 6장. 객체와 자료구조

백엔드 개발자가 Djnago fullstack 사이드 프로젝트를하며 ( html, css, vanillaJS 그리고 JS프레임워크 )