ユユユユユ

webエンジニアです

『Real World HTTP 第2版』でHTTPの歴史的文脈と最新動向を俯瞰する

 Goの学習を進めるにあたって、A Tour of Goを終え、簡単なAPIの実装を経て、『改訂2版 みんなのGo言語』を読んだ。書評を記事として残すこともした。

jnsato.hateblo.jp

 読了後は、同書執筆陣の技術ブログの過去記事を乱読していた。それだけ信頼できる書き手と思えたし、彼等の書く記事は内容そのものはもちろん、行間から垣間見える姿勢すらも参考にしようと繰り返し読み進めていた。

 本記事で取り上げる、『Real World HTTP』もまた、そうして過去記事を読む中で教えられた本である。具体的にはこちらの記事。

suzuken.hatenablog.jp

 自分語りをすると、Rubyでプログラミングに初めて触れ、Railsの機能に教えられるようにしてウェブ技術を学んだ修行時代に、HTTPを基礎から学ぶ体力的余裕は持てなかった。その後、プロジェクトに合わせて新しく必要な知識を付け足していく方式で、リバースプロキシであるとか、モダンフロントエンド開発だとか、サーバーレスアーキテクチャだとか、よく言えば広い範囲を、悪く言えば器用貧乏となりかねないやり方で身につけてきた。しかし正直に告白すると、これらもろもろの道具を使いつつも、その根底にあるHTTPという規約について、わかった気になったことは一度もなかった。

 もっとも、てんで何も知らずに、というわけではあくまでない。curlなりfetch APIなりでリクエストをこしらえて送信してみたり、APIサーバーから適切なステータスコードを返したり、カスタムヘッダを定義してレスポンスに加えてみたり、コンテナサービスをロードバランサの後ろにおいてヘルスチェックなんかをしてみたり…。しかしこれらの作業のすべてがHTTPの一側面であるとみてしまうと、あまりに一般的すぎて、かえって捉えどころがないように思えるのも事実である。

 そしてこの、あまりに一般的すぎる、という直感はあながち間違っていないだろう。発展が速く新技術が現れては消えていくウェブ技術の世界において、HTTPは明らかに不動の、ユビキタスな技術で、それはもはや職業を超えて日常生活のあらゆる片隅に潜行している。

どんな本か?

 そこで本書、『Real World HTTP』に話を戻す。

www.oreilly.co.jp

 先ほど掲げた記事の紹介にいわく、HTTPを学びつつGo言語の豊富な実装例に触れられる良書、とのことで手にとったわけであるが、もちろん比重としてはHTTPの仕様と解説に割かれたページの方が多い。そうでなくてはならないのだという納得感は十分にあるから、これは問題にはならない。

 章立ては細かく整理されているが、個人的には次のような三部構成になる書籍であると理解した。

  1. HTTPの誕生からHTTP/1.1の標準化にいたる歴史的進行を語る前半
  2. HTTP/2より以降の先進的な仕組みのルポルタージュとしての中盤
  3. ウェブのエコシステムの様相を改めて描き出す断章群

HTTPの書籍であるということを踏まえると、1および2が主たる部分をなし、3については付録的に捉えてしまっても構わない。本記事ではこの構成に沿う形で書評を試みてみようと思う。

HTTPの誕生からHTTP/1.1まで

 1996年のHTTP/1.0と、その翌年のHTTP/1.1の標準化をゴールとして、プロトコルが生まれ、利用されるようになるまでの前日譚ともいうべきストーリーが、同時代的な状況から描き出される。

 ここではヘッダー、メソッド、ステータスコードといった馴染み深い諸要素の出自が語られるし、インターネット以前の主流ツールであった電子メールとニュースグループにあったこれらの概念が、HTTPの標準化にあたってどのように活かされ、発展的に統合されたか、という技術史は、読み物としてもおもしろい。仕様には取り入れられたが使われなかった技術、などというのも、実用性はないとわかっているのに、どこか悲壮感が感じられて、つい味わいつつ読んでしまう。

 より具体的な内容をみると、クッキーの制約とその本来あるべき使い方、キャッシュの制御における細かいパラメータの解説など、現代のユーザー環境においてますます正しい理解が求められる実用的な領域ももちろんカバーされている。とりわけHTTP/1.1の章で触れられる、TLS通信の概説と実装例については、手を動かして学ぶ機会を初めて持つことができた点で思い入れも深く、そのことは別エントリにまとめた。

jnsato.hateblo.jp

HTTP/2より以降の先進的な仕組みについて

 HTTP/2の仕様は2015年に定まった。HTTP/1.1の策定から18年後のこととなる。このことはそのまま、HTTP/1.1がそれだけ完成度の高いプロトコルだったという裏付けになる。事実、HTTP/1.1の有効性に疑問が呈されたからHTTP/2が誕生したわけではないし、HTTP/1.1が完全に置き換えられるということはおそらくないだろう。

 ではHTTP/2が策定される動機はなんであったか? それは20年を経て初めての、パフォーマンス面からの改善という性質のもののようである。

 HTTP/1.1の延長線上にHTTP/2があり、HTTP/3がある、というイメージでいると見誤るだろう。HTTPという名前は共有しているが、これらはそれぞれ全く別のプロトコルであり、特に後方互換性の不在については、しかと認識しなければならない。

 こういった事情のため著述の形式も変化する。キャッシュやクッキーといった、教科書的な話題を扱っていた前項にうって変わって、HTTP/2以降のトピックでは、細かい通信最適化など、クライアントには見えない実装の話題や、WebRTCとかHLSとか応用的な規格の話の比重が増える。HTTP/3に至っては、TCPを離れてUDPプロトコルの話題にまでも追随しなければならず、この一冊で学ぶには話題が大きすぎるという印象もあるが、ひとまず概要について知ることができたのは大きい。

 Googleの主導で開発され、採択され、実用化されるのだという。基本的なプロトコルに関わる性質上、ただちにというよりも、10年単位でゆっくりと変化していく話題と思う。本書で十分学び得るとは言わないが、関連する情報をキャッチできるだけの前提知識は与えられたと思う。その先については、おのおの必要に応じて追随すればいいだろう。

ウェブ周辺のモダンエコシステムの諸相

 HTTPの仕組みそのものからは離れて、REST API、Fetch APIクラウドアーキテクチャ、セキュリティなど、広めのトピックを扱うようになる。RFC文書に基づいて話題を展開してきた前項までに比べると、扱われる話題の粒度はだいぶ上がるため、ややぼんやりした印象は免れない。

 しかしHTTPという統一的な観点から語られるという点で蛇足ではないし、内容に不足はないので読み物として目を通せばよく、知識に抜け漏れのあるトピックは別途学び直すのがよい。

 特にセキュリティについては他の事項よりも高い優先度で学ばなければならないだろう。その点、近ごろ目に余るサードパーティクッキー問題だとか、リスト型攻撃についての概説があるのは本書の優れた箇所のひとつである。特に後者に関連して、パスワードの平文保存について「断固拒否しなければなりません(渋川 418)1」と具体的なコミットメントにまで踏み込んで語るところには、啓蒙の熱意が込められていて素敵だった。実際、活字ベースの書籍にこうした注意喚起が含まれていることは、単に読者の学びになるという以上に、いざ議論となったときに権威づけられたソースとして提示可能なのは大きいかもしれないな、などと思った。

終わりに

 最後にかけての数章を除いて、HTTP技術と仕様については、基本的にRFCの仕様に依拠して解説する、というスタンスが一貫していて、安心して読むことができた。とかく技術書には有益な情報と思えても、出典が不明であったり、剽窃が疑われるケースも残念ながらあってしまうが、その心配は本書にはない。

 本書を読まずとも、RFCを辿ればHTTPの歴史を振り返ることができる、というのは間違ってはいない。ただしそれらは公開情報であるとは言っても、公文書に近い性格のもので、個々人がいちいち通読し、検証して追随するというのは考えづらい。本書著者の渋川氏は、増え続けるそれらRFCの原典を渡り歩いて、俯瞰的に分類し整理する歴史家的手続きと、最新動向をピックアップし要点を報道するジャーナリスト的手続きの両輪を駆使して、HTTPの案内人となってくれている。

 冒頭で述べたように、『みんなのGo言語』著者のブログの過去記事に動機付けられて本書を手にとったわけだが、たまたま改訂が行われたこのタイミングで手に入れ、読むことができたのは幸運であった。この一冊をレファレンスとして活用することもしながら、間も無く正式に策定されるというHTTP/3にもゆっくりと追随できるように心得たい。


  1. 渋川よしき. Real World HTTP 第2版――歴史とコードに学ぶインターネットとウェブ技術. O'Reilly Japan. ISBN978-4-87311-903-8. https://www.oreilly.co.jp/books/9784873119038/