개요
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