개요

HTTP 프로토콜2의 특징을 정리해둔다.

바이너리 프로토콜

  • HTTP/1은 텍스트베이스의 프로토콜이지만 HTTP/2는 바이너리베이스의 프로토콜이다.
  • 이는 HTTP헤더의 바운더리가 HTTP/1에서는 델리미터(\r\n)를 기반으로 판단되지만, HTTP/2에서는 미리정해진 오프셋에 의해 정해진다는 것을 의미한다. (HTTP/2에서는 \r\n이 특별한 의미를 가지지 않는다.)

ALPN 기능

  • ALPN은 Application-Layer Protocol Negotiation의 약자이다.
  • TLS(Transport Layer Security)의 확장이다.
  • TLS 연결을 수립할 때 송신측, 수신측에서 발생하는 추가적인 라운드 트립(왕복)을 없애준다고 한다.
  • 주로 HTTP/2에서 추가적인 라운드 트립을 없애고자 하는 목적으로 사용한다고 한다.

웹 서버에서 HTTP2를 사용하려면

  • 웹 서버에서는 HTTP/2를 사용가능하다고 설정을 해주어야 한다.

예를들어 nginx 에서는 다음과 같이 설정해주어야 http2로 통신할 수 있다.

listen 443 ssl http2;

한편, 설정 미스(아마 ALPN관련인 것 같다)로 http2를 실제로는 사용가능한데, 사용가능하다고 클라이언트에게 말하지 못하는 서버도 있는 것 같다. 이 경우에는 http/2로 강제로 통신함으로써 HTTP Request Smuggling공격(H2.CL이나 H2.TE같은 패턴)을 실행하는 테크닉도 있다.

참고

  • ALPN: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation
  • Hidden HTTP/2 supoort: https://portswigger.net/web-security/request-smuggling/advanced