概要
「HTTPはステートレスなプロトコルである」
Webに触れている人なら一般的な知識で、"HTTP ステートレス"で検索をすると沢山の記事が出てきます。
自分はお恥ずかしながら、最近Webを支える技術を読んで初めて知った知識です。
という話はさておき、この本でステートレスとHTTPについて学んでる内に、実際に書籍に記述してあるHTTPメッセージの例を見て、「このメッセージのどこで自分(クライアント)の情報を伝えてるんだ・・・?」と疑問が湧いてきました。
自分なりにこの疑問を解決できたので、記事にしておきたいと思います。
各用語の簡単なおさらい
調べれば沢山分かりやすい記事が出てくると思いますが、先述の書籍、Webを支える技術からのを一部引用しつつ各用語をおさらいしておきたいと思います。
- ステートレス
- 「サーバがクライアントのアプリケーション状態を保存しない」制約のこと。(p.32)
- アプリケーション状態
- アプリケーションの利用者が持つ状態のこと。たとえばソーシャルブックマークアプリの場合は、「ブックマーク一覧を表示している」「新しいブックマークを追加しようとしている」などの状態が具体例となる。(p.38)
では、実際のHTTPメッセージはどうなっている?
上記の用語や、この記事のハンバーガーの例を見てみると、HTTPメッセージを送るときは、毎回アプリケーション状態を送る必要があると自分は解釈をしています。
そこで、HTTP入門 - とほほのWWW入門のHTTPのリクエストメッセージを例に見てみたいと思います。
GET / HTTP/1.1 Accept: image/gif, image/jpeg, */* Accept-Language: ja Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;) Host: www.xxx.zzz Connection: Keep-Alive
ん・・・?
これのどこに"アプリケーション状態"が書いてあるんだ・・・!?
アプリケーション状態 アプリケーションの利用者が持つ状態のこと。たとえばソーシャルブックマークアプリの場合は、「ブックマーク一覧を表示している」「新しいブックマークを追加しようとしている」などの状態が具体例となる。(p.38)
アプリケーション状態って、「今ぼくはこのページにいるよ~」とか、「ここのリンクを押そうとしているよ~」といった情報なのではないのかい?
なぜだい?そんなのどこにも書いていないじゃないか?なんなんだアプリケーション状態って!!
アプリケーション状態は、"動詞"とは限らない
今回の一番の勘違いポイントです。
Webを支える技術の例だけで、てっきりアプリケーション状態とは、"動詞"を表すものだと思っていました。
どうやらアプリケーション状態は、ユーザーのIDやパスワード、指定する自然言語など、全てをひっくるめたものを指しているようです。
上記のHTTPの例でいうと、ヘッダの部分である
Accept: image/gif, image/jpeg, */* Accept-Language: ja Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;) Host: www.xxx.zzz Connection: Keep-Alive
が丸々アプリケーション状態に当てはまるのではないでしょうか。
ちゃんと必要な情報を送ってくれていますね。ただ毎回毎回送るのも面倒臭そうな気もしますが、このステートレスというアーキテクチャスタイルのおかげで、Webは発展してきました。
Cookieを使ったセッション管理
RESTに反してしまいますが、Cookieを使ったセッション管理は、ステートレスの欠点を補うためにあります。
上の説明では、『ユーザIDやパスワード』もアプリケーション状態にあると記述しました。しかし、ステートレスですと、同じサイトでページを遷移するごとに毎回IDやPWといった情報を送る必要があり、面倒くさいし、通信速度的にもあまり良い気はしません。
そこで、Cookieを用いることで、ユーザ情報、つまりはアプリケーション情報をセッションIDとして、サーバサイドで保存することができます。
気になる方は、下記のQiita記事が分かりやすかったので読んでみてください。
ステートフルなプロトコル、FTP
最後に、またまたWebを支える技術から、ステートフルなプロトコル、FTPの説明が簡単に乗っていたので、書いておきたいと思います。
ステートフルなプロトコルの代表例はFTPです。FTPではクライアントがFTPサーバにログインしてからログアウトするまで、そのクライアントがどのディレクトリにいるかといったアプリケーション状態をサーバが管理します。そのためクライアントは、ディレクトリの移動などで相対パスを指定できます。(p.82)
確かに、HTML内のリンクでは相対パスは使えますが、HTTPメッセージでは相対パスを利用している例は見たことがありません。相対パスの様に見えても、ヘッダでHostを指定しているので、絶対パスと同義になるのかと思います。
("HTTP 相対パス"で検索してもヒットしませんでした。)
他にも、TCPやSSHがステートフルなプロトコルの代表例としてあります。
まとめ
実はまだWebアプリを作るどころか、Webについては書籍を読んだくらいなので、今後勉強を進めていく内により理解が深まってくるかと思います。
RESTやHTTPといった知識は必須なので、これからも頑張ります(KONAMI)