ステートレスであるHTTPに無理をさせ過ぎじゃなかろうか

2023/2/8作成

ただいまtinydiaryという日記スクリプトを作っています。これ自体はよくある日記スクリプトで、何番煎じかわからないくらいの車輪の再実装だし、しかも世にある日記スクリプトの劣化実装でしかないのですが、まあそれ自体は本題ではないのでおいといて。

開発にあたってはフレームワークを使わずに、pure PHPで実装しています。フレームワークを使ってないことから、通常ならフレームワークが面倒見てくれることも自分でやらなければいけません。それも自分にとっての勉強だと思ってやってるんですけどね。

で、その一つとしてCSRF対策の実装をしていました。今どき自分で実装する人も滅多にいないので、ぐぐっても10年以上前の技術ブログばっかりヒットするんですけどね。でまあ、実装してて思ったんですが、これって要するにステートレスなHTTPを無理やりステートフルに使ってるから起こってる問題だよなぁと。つまり表題のことを思ったわけです。別に私のオリジナルの考えではなくて、同じことはこれまで数えきれないくらいの人が言ってることだろうとは思いますが。

そもそもHTTPはHTML文書を交換する為に設計されました。目的はファイルをやり取りするだけですから仕様もとてもシンプルです。機能としてはFTPでも出来なくはありませんが、複雑になりすぎたFTPの仕様を簡略化して設計されてもいます。多分。実際、FTPはステートフルなのに対して、HTTPがステートレスになってますしね。

そうして簡略化されたHTTPなんですが、ウェブアプリが使われるようになって、ステートフルが必要になって、Cookieを使って疑似ステートフルが実現されるようになった。でも所詮は疑似なんで、いろいろと穴がある。その穴の一つがCSRFなわけですね。でまあ、世のウェブ系開発者の仕事のいくばくかは、この疑似ステートフルによって発生する問題の対処に取り組んでいるんだなぁと思うと、少々無駄というか、勿体ないなぁという気がしたのがこの記事です。最初からステートフルなプロトコルを使っていれば、この工数は別のことに使えたのにと。

だからと言って、HTTPを責めるわけではありません。先ほど書いた通り、HTTPはHTML文書をやり取りするために設計されたわけですから、本来の用途以外に使ってる世の開発者の方が悪いわけです。まあ、HTTPもどんどん仕様拡張されていってるので、どっかで誰かがこれはおかしいと思わなかったのかなとは思いますが。実際には思ったけど、HTTPが予想以上に世の中に広まってしまったために、もう止められなくなってしまったんでしょうけれどね。余談になりますが、HTTPだけがファイヤーウォールを通過できることからHTTPをトンネリングに使うのが流行りましたよね。なんとかかんとかover HTTPって言って。あれは酷い話だよなぁと思って当時みていたんですが、現実的な解としてはありなのでしょう。

また、ステートフルなプロトコルをウェブアプリに使えるかっていうと、それもまあ疑問ではあったりするんですけどね。今やウェブアプリにアクセスするクライアントは膨大な数になります。その全てがステートフルになると、サーバ側のステート管理が爆発しちゃいますよね。

ということで、なんとかならんかなぁともやもやしながら、開発の日々を送っております。