TLS1.3 0-RTTにおけるHTTP/2 SETTINGSを改善する提案仕様

MozillaのMartin Thomson氏から「Optimizations for Using TLS Early Data in HTTP/2」という提案仕様が出ています。

もともとHTTP/2(RFC7540)を標準化した時には、TLS1.3(RFC8446)はまだありませんでした。ですので、TLS1.3で導入された 0-RTTデータ (Early Data)や 0.5-RTTデータは 考慮されていません。

HTTP/2では通信直後にSETTINGSフレームを送り合ってからHTTPメッセージの送受信を行います。相手からのSETTINGSフレームの受信を待つことは必須ではありませんが、受信できるまではINITIAL_WINDOW_SIZEやMAX_FRAME_SIZEといったパラメータに違反しないようにメッセージを送る必要があります。

また、特定のHTTP/2拡張を使う場合、例えばWebSocket over HTTP/2などの機能を使う際は、SETTINGSパラメータの交換が必須になります。

このような制約がある中で、TLS1.3 0-RTTでメッセージを送らなければなりませんでした。これを改善するのが「Optimizations for Using TLS Early Data in HTTP/2」です。

EARLY_DATA_SETTINGS

提案仕様の中では、EARLY_DATA_SETTINGSという新しいSETTINGSパラメータを定義しています。これはTLS1.3のEarly Dataでデータを送る際に、以前やり取りしたときのSETTINGSパラメータを利用できるようにします。

  • クライアントは、EARLY_DATA_SETTINGSが1のパラメータを送信することで、この拡張に対応している事をサーバに通知します
  • サーバも、EARLY_DATA_SETTINGSが1のパラメータを送信することで、この拡張に対応している事をクライアントに通知します。なお、このパラメータを送信したあとに発行されたTLS session tickets は現在のSETTINGSパラメータと関連付けられ、session ticketsチケットを利用する際には発行時のSETTINGSパラメータが尊重されます。

使用中では既存のパラメータごとにsession ticketsとともに記憶するかや、0.5-RTTデータで送られてくるサーバ側のSETTINGSフレームについてなど、サーバ・クライアントの振る舞いについて詳しく書かれています。

もちろん、TLS1.3 Early Dataはリプレイ攻撃される可能性があるため、拡張を利用するにしてもそれを考慮する必要があります。サーバ側は冪等に処理できないものに関しては425 Too Earlyを返す必要があります。

asnokaze.hatenablog.com