고정된 octet data header(9byte) + payload size
Length
frame header를 제외한 payload 길이 (unsigned 24bit integer)
Type
Flags
Frames Type에 따라 정의된 boolean 형의 flag 영역
R
Reserved 1 bit ( default 0 )
Stream Identifier
Stream id ( 0인 경우 connection control)
TCP connection 위에서 실행되는 application layer protocol
HTTP/1.1과 동일하게 TLS위에서 동작하는 h2와 cleartext TCP위에서 동작하는 h2c로 구분
server의 HTTP/2 지원 여부를 모르는 client의 request 전송
1. HTTP/1.1과 동일한 request를 전송
2. Server가 HTTP/2를 지원한다면 101 response를 통해 protocol 전환
HTTP/2 connection 수립 후, 각 endpoint는 서로 다른 preface를 전송
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
(srting: PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n)
ex)
- Request
:method
:scheme
:authority
:path
- Response
:status
Multiplexed stream 간 간섭을 제한하기 위해 stream들의 flow control 및 priority 제어가 필요
server push 예
- Server는 stream 1로 수신된 request에 대한 응답으로 page.html 응답을 전송
- page.html 을 수신한 client는 script.js, style.css 파일을 추가 요청할 것으로 예상하고 PUSH_PROMISE frame을 전송하여 2, 4 stream을 예약
- Stream 1, 2, 4를 통해 page.html, script.js, style.css DATA frame을 전송
Data Frame은 반드시 stream id와 함께 전송
stream을 열기 위해 사용
Pad Length: 보안을 위한 Padding data length ( padded flag 설정 시 유효 )
E: Stream priority 설정의 exclusive 설정 유무
Stream Dependency: 새로 생성한 stream이 종속되는 상위 stream id
Weight: Priority 가중치 ( PRIORITY flag 설정 시 유효 )
Header Block Fragment: HPACK으로 압축한 header data 영역
Flag
Stream 가중치 설정을 위한 frame
PRIORITY frame은 반드시 stream id와 함께 전송
E: Stream priority 설정의 exclusive 설정 유무
Stream Dependency: 새로 생성한 stream이 종속되는 상위 stream id
Weight: Priority 가중치 (PRIORITY flag 설정 시 유효)
Flag
Stream 즉시 종료를 위한 frame
취소 요청 혹은 오류 발생을 알리기 위해 전송
Error Code ( Stream 종료 reason )
Flag
Connection 설정 parameter 교환을 위한 frame
동일 connectoin에 대해 각 endpoint는 서로 다른 값을 설정할 수 있음
SETTING frame에 대한 응답은 ACK flag 설정 후 응답
( Identifier – Value ) pair 1개 이상으로 구성
DATA frame 전송 시 세가지 check
- Session 전체에 대한 window size가 얼마나 남았는지
- Stream에 대한 window size가 얼마나 남았는지
- Max frame size가 얼마나 남았는지
PUSH data 전송을 위한 Stream reserved로 생성
PUSH data 내용에 대한 header 정보를 전송
Pad Length: 보안을 위한 Padding data length (padded flag 설정 시 유효)
R: Reserved bit
Header Block Fragment: HPACK으로 압축한 header data 영역
Flag
Endpoint간 최소 round-trip 시간 측정을 위한 frame
모든 endpoint가 전송 가능
최우선으로 처리해야 하고 응답 시, ACK flag를 설정하여 수신한 opaque data를 다시 전송
Connection 종료 혹은 오류 발생 전송을 위한 frame
새로운 stream open을 위한 peer와 GOAWAY frame 전송 시 race-condition 발생 가능하여 반드시 peer가 open한 마지막 stream id를 전송
두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황
Last-Stream-ID: Peer가 open한 가장 높은 stream id
Error Code: Connection 종료 reason
Additional Debug Data: 추가적인 debug data 영역
Flag
Flow control을 위한 frame
Frame header의 stream id가
0인 경우: connection의 flow control
0이 아닌 경우: stream의 flow control
Window Size Increment: Window size 증가 값 (1 ~ 2^31-1)
Flag
추가적인 header 정보를 전송하기 위해 사용
HEADERS, PUSH_PROMISE frame 전송시, size 제한으로 한번에 전송 못하는 경우 CONTINUATION으로 나누어 전송
Header Block Fragment: HPACK으로 압축한 header data 영역
Flag
stream은 idle state에서 시작
connection Error는 frame layer의 추가 처리를 방해하거나 연결 상태를 손상시키는 모든 오류
stream 오류는 다른 stream의 처리에 영향을 미치지 않는 특정 stream과 관련된 오류입니다.
stream Error를 감지한 endpoint는 오류가 발생한 RST_STREAM frame을 보낸다
RST_STREAM은 endpoint가 stream에서 보낼 수 있는 마지막 frame입니다.
RST_STREAM frame을 전송하는 peer는 원격 peer가 전송했거나 전송을 위해 대기열에 넣은 모든 frame을 수신할 준비가 되어있어야 합니다.
이러한 frame은 연결 상태(헤더 압축 또는 flow control)를 수정하는 경우를 제외하고는 무시할 수 있습니다.
looping
frame이 네트워크 상에서 무한정으로 목적지에 도달하지 못하고 네트워크를 점유하는 상태
네트워크를 점유하는 frame이 사라질 때까지 네트워크는 통신이 불가능한 상태가 되는 현상
CONNECT Method는 Client와 Server가 SSL handshake를 맺도록 하기위해 Client가 Proxy에게 Server와 TCP Connection을 맺으라 지시할 때 쓰인다.
CONNECT method를 사용하여 생성된 터널을 통해 또는 직접적으로 original 서버에 대한 연결은 여러 다른 URI 권한 구성 요소가 있는 요청에 재사용될 수 있다.
요청이 응답을 생성할 수 없는 서버로 전달되었다
HTTP/2 구현은 TLS 1.2 이상 사용해야 함
TLS 구현은 서버 이름 표시(SNI)를 지원해야 합니다.
renegotiation
기존 보안 세션 내에서 새로운 handshake 협상을 시작하는 것
HTTP/2의 clear text 버전은 교차 프로토콜 공격에 대해 최소한의 보호 기능을 제공
connection preface에는 HTTP/1.1 서버를 혼동하도록 설계된 문자열이 포함되어 있지만 다른 프로토콜에 대해서는 특별한 보호가 제공되지 않는다.
클라이언트 connection preface 외에 업그레이드 헤더 필드가 포함된 HTTP/1.1 요청의 일부를 무시하려는 서버는 교차 프로토콜 공격에 노출될 수 있다.
HTTP/2는 헤더 필드로 어떤 문자열이든 허용하기 때문에 HTTP/2 메시지를 중간의 프록시가 HTTP/1.1로 변환할 때 메시지가 위조될 가능성이 있다.
인코딩할 수 있는 대부분의 값은 헤더 필드 구문 분석을 변경하지 않지만 CR, LF는 공격자가 악용할 수 있다.
PUSH_PROMISE frame으로 푸시된 응답에는 클라이언트의 명시적 요청이 없다.
Cache-Control 헤더 필드의 원본 서버에서 제공하는 지침에 따라 푸시되는 응답을 캐싱할 수 있다.
HTTP/2 연결은 HTTP/1.1 연결보다 작동하기 위해 더 많은 리소스를 요구할 수 있다.
SETTINGS frame
WINDOW_UPDATE 또는 PRIORITY frame
small frames
header compression
이러한 모든 기능( SETTINGS changes, small frames, header compression)은 합법적으로 사용된다.
이러한 기능은 불필요하게 사용하거나 과도하게 사용할 때만 부담이 된다.
이 동작을 모니터링하지 않는 end point는 서비스 거부 공격의 위험에 노출되기 때문에 이 기능의 사용을 추적하고 사용제한을 설정해야한다.
이 설정은 권고사항일뿐 이 제한을 초과하는 header block을 보낼 수 있음 → 요청/응답이 잘못된 형식으로 처리될 위험
중개자는 설정된 제한을 전달하여 문제를 피하려고 시도할 수 있지만 의무는 없음
서버에서 처리할 수 있는 것보다 더 큰 header block을 수신하면 HTTP 431 status code 전송
클라이언트는 처리할 수 없는 응답을 삭제가능
스트림 수는 SETTINGS_MAX_CONCURRENT_STREAMS으로 관리
종료되는 TCP 연결이 TIME_WAIT 상태로 남아있기 때문에 프록시는 CONNECT 요청을 전달하는 스트림을 닫은 후에도 TCP 연결에 대한 일부 리소스를 유지할 수 있다.
따라서 프록시는 CONNECT 요청에 사용되는 리소스를 제한하기 위해 SETTINGS_MAX_CONCURRENT_STREAMS에만 의존할 수 없다.
TLS에서 제공하는 것과 같은 일반 스트림 압축은 HTTP/2와 함께 사용하면 안 된다.
압축을 사용하면 공격자가 제어하는 데이터와 동일한 컨텍스트에서 압축될 때 공격자가 데이터를 복구할 수 있다.
압축, 비활성화 또는 제한에 의존하는 공격을 완화하기 위해 대책으로 패딩보다 압축이 더 나을 수 있다.
HTTP내의 특정 공격, 예를 들어 압축 콘텐츠에 공격자가 제어하는 일반 텍스트와 비밀 데이터가 모두 포함되는 공격을 완화하기 위해 제공
공격자가 관찰해야 하는 프레임 수를 늘려 공격자가 길이 정보를 유추하는 것을 어렵게 만드는 역할만 함
예측 가능한 분포를 가진 무작위 패딩은 거의 보호를 제공하지 않는다.