Skip to content

Trust the Browser

「ぼくはまちちゃん」事件をリアルタイムで見ていた。

2005年頃の話だ。mixiで大量のユーザーが意図せず「ぼくはまちちゃん!」という日記を投稿させられた。CSRFだ。別のサイトにアクセスしただけで、ログイン中のブラウザがmixiにPOSTリクエストを送る。ブラウザは律儀にCookieを付けて送ってくれる。サーバーから見れば正規のリクエストにしか見えない。

当時はCSRFトークンすら一般的ではなかった。「ブラウザからのリクエストは信頼できる」という素朴な前提で、みんなWebアプリケーションを作っていた。わたしもそうだった。

あの事件から20年が経った。ブラウザのレスポンスヘッダは増え続けている。

X-Frame-Optionsがクリックジャッキングを防ぎ、それをContent-Security-Policyが引き継いだ。SameSite属性がCookieのクロスサイト送信を制限し、CORSがオリジン間のリソース共有を制御する。Strict-Transport-SecurityがHTTPSを強制し、X-Content-Type-OptionsがMIMEスニッフィングを防ぐ。攻撃が見つかるたびにレスポンスヘッダが増え、ブラウザがそれを解釈する。いたちごっこの歴史がヘッダの数に刻まれている。

どれもサーバーがレスポンスヘッダで「こう振る舞ってくれ」とブラウザに伝える仕組みだ。サーバーが一方的に防御するのではない。ブラウザが協力してくれることを前提にした設計になっている。curlで叩けばCORSもSameSiteも関係ない。Webセキュリティの多くは、ブラウザという善意の仲介者を信頼することで成り立っている。

クライアントを信頼しないのがセキュリティの基本なのに、ブラウザというクライアントの善意に依存している。考えてみれば奇妙な構造だ。でもこの奇妙な信頼関係が、20年間なんとかWebを守ってきた。