Webセキュリティ入門:HTTP・Cookie・脆弱性
HTTPがステートレスとは
この回でやること
HTTPは1回ごとに忘れるステートレスな仕組みです。その上でどうやって「ログイン中」を作っているのかを見ます。
- 読む 約 5 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
HTTP は、ステートレスと呼ばれる決まりの上で動いています。ログインしたあとに画面を移っても「ログイン中」が続く理由を、その決まりの側から確かめます。
読み終えるころには、ログイン中という状態が何によって支えられているかを説明できます。
毎回はじめまして
HTTP は、1回の要求と1回の返答で完結します。次の要求が来たとき、前の要求のことは覚えていません。
同じ人が続けて3ページ見ても、サーバーから見れば独立した3つの要求です。順番も、同じ人かどうかも、それだけでは分かりません。
それでもログイン状態はある
覚えていないのに「ログイン中」が成立するのは、毎回の要求に、自分が誰かを示す値を付けているからです。
やり方は主に2つです。
- Cookie に入れる。ブラウザが自動で付けてくれる
- ヘッダーに入れる。呼び出す側が明示的に付ける
どちらにしても、サーバーは毎回その値を見て「この人は誰か」を引き直しています。前回の記憶を辿っているのではありません。
「さっき確認したから今回はいい」は成り立ちません。要求ごとに、誰であるかと、してよいかを確かめます。 画面の遷移順は根拠になりません。
だから起きる問題
この性質から、いくつかの落とし穴が生まれます。
手順を飛ばせる。 3画面で完了する処理でも、3画面目の要求だけを直接送れます。「1と2を通ってきたはず」は保証されません。途中の状態はサーバー側に持ちます。
値が盗まれると成り代われる。 自分が誰かを示す値だけで判断しているので、その値を持っている人は本人として扱われます。だからその値の守り方が重要になります。
同じ要求が2回届く。 通信の再送や利用者の二度押しで起きます。2回実行されて困る処理には、それを防ぐ仕組みを別に用意します。