がみぶろ

#がみぶろ

@jumpei_ikegami

「プロになるためのWeb技術入門」を読んだ

しがないラジオパーソナリティのgamiです.

仕事の関係でCookieの仕様を調べている中で、オーソドックスなCookieの使い方についてそもそもちゃんと学んだことがないなぁと思い、Webアプリケーションの入門書を書って読みました.

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

誰がこの本を読むべきか?

結論を言うと、現代を生きるほとんどのWeb開発者はこの本を読まなくていいです.

10年近く前に書かれた本で、古いJavaのエコシステムを前提にしているからです.

歴史を学びたい人か、レガシーなJavaアプリケーションをメンテしている人には、もしかしたら価値があるかもしれません.

具体的には、以下に当てはまる人は、暇だったら読んでもいいかもです.

  • CGI誕生からWebアプリケーションフレームワークが流行るまでの、Webアプリケーションの歴史をさらっと知りたい
  • Javaのエコシステムの中で生きていて、JSP/サーブレットのWebアプリケーションを作ってみたい

SIerの新卒とかは、読むと業務で役に立つ可能性があります. ちなみに私は前職でCOBOLJavaアプレットを使っていたので、この本の内容にすら追いついていませんでした. 悲しい.

3行で言うと?

新たに知れたこと

この本を読んで、新たに知ることができたことも、少ないながらありました. なお、サーブレットJSPの知識は、前職の研修でやったので知っていました.

CGIとは何か?

Rebuild.fmなどを聞いていると、昔話の中でCGIという単語が出てきて、「古き良きインターネットのアクセスカウンターなどを作るのに使われていた技術」くらいの理解でした.

この本によると、CGI(Gommon Gateway Interface)とは、動的なWebサイトを実現する初期の試みで、「Webサーバとプログラムの間でリクエストとレスポンスをやりとりするための規約」であると書かれています.

APIがHTMLを返します」とか言われると、現代的な感覚では「やばいな」という感じですが、CGIはHTMLを返すケースが圧倒的に多いらしく、「やばいな」という感じです. 現在のフロントエンドのMVVMの考え方などとは全く相容れないですが、JavaScriptの仕様が不安定だった時代だからこそ求められた技術なのでしょう.

Common Gateway Interface - Wikipedia

HTTP通信の詳しい中身

HTTPのリクエスト/レスポンスのヘッダについてざっくり解説があるので、例えば普段あまり意識しないステータス・コードやポート番号などに思いを馳せることができました.

「一般的な」Webアプリケーションは状態をどのように記憶するのか?

FTPと違って、HTTPがステートレスなプロトコルであり、「Webアプリケーション」の実現のためにはどこかに状態(特に、アクセス元ユーザーのID)をCookieなどに保持する必要がある、という説明は納得感がありました.

Cookieの歴史と限界

特に、ステートレスなHTTPを補うためのCookieについて、簡単な歴史と限界を知ることができたのはよかったです.

あるドメインのサーバーは、レスポンス先のブラウザのCookie領域の中に、自ドメイン専用の領域を確保することができます. そしてそのブラウザからのリクエスト全てに、その領域のCookieに保存した文字列が自動で付加されます.

これによって、バラバラでステートレスなHTTPリクエストの中で、同一ブラウザからのアクセスを特定することができるわけです.

さて、この本自体には書いていませんが、社内勉強会で発表するために、Cookieについて少し詳しく調べたので、その内容を書きます.

ブラウザに保存されたCookieは、ブラウザのデベロッパーツールから確認することができます. しかし、その実体はどこに保存されているのでしょうか?

Chrome for Mac (version: 62.0.3202.94)の場合、以下のファイルに格納されています.

/Library/Application Support/Google/Chrome/Default/Cookies

実はこのファイルは、sqlite3のDBになっていて、SQLをかけることができます.

$ cd ~/Library/Application\ Support/Google/Chrome/Default
$ sqlite3 Cookies
$ sqlite> .schema cookies
$ sqlite> select host_key, name from cookies;

実際に確認してみると、ドメイン(正確には、サーバーを特定するキー)毎にkey-valueが保存されていることがわかります.

ブラウザは、レスポンス先のサーバー毎に該当のcookieを検索し、その結果をHTTPリクエスト・ヘッダに入れて送るわけです.

まとめ

10年近く前の本ということで、使われている技術は現在のモダンなそれとは乖離していました. しかし、ステートをどこに持たせるか?、関心をどう分離するか?など、基本的な課題意識については、あまり変わっていないという印象でした.

昔の本を読むにあたっては、どの部分が普遍的で、どの部分が周縁的で変化するのか、意識しながら読むべきだと感じます.