はじめに
前回のWeb技術の基礎の続きになります。
今回はステートレス、ステートフル、Cookie、セッションについて記載していこうと思います。
もしよければ見てやってください!
学習前の認識
ステートレス
簡単に言ってしまうと、前後のリクエストと関連性のない通信をステートレスと言います。
例えば、Googleの検索など特に他のリクエストと関連性もないし、関連させる必要がない通信はステートレスな通信が行われます。
ステートフル
前後のリクエストと関連性のある通信をステートフルと言います。
例えば、ログイン以降の処理だったりは、常にCookieの情報を送信して、同じサーバにリクエストを送ったり、ユーザ固有の情報を返す必要があるため、ステートフルな通信が行われます。
Cookie
ブラウザ上に保存するユーザー情報です。
初回リクエスト時にサーバ側で生成され、クライアント側のブラウザに保存されます。
以降のリクエストでは、前回リクエストしたサーバにアクセスするために利用されます。
セッション
うーん、思い出せない。昔勉強したはずなんだけどな...
Cookieとセッションの違いってなんだっけ?って感じです。
書いてみた感想
Cookieとセッションが特に勉強不足というか忘れてるって感じですね。
じゃあ勉強してから再度アウトプットしていこうと思います。
※学習前の認識については、自分の頭の中の知識をまとめてみているだけなので、正しいとは限りません。
学習後の認識
ステートレス
ステートレスとは、前後のリクエストに関係なく、同じリクエストを行った場合に同じレスポンスを返すことを言います。
例えば、DNSサーバで名前解決を行う場合、このドメインでリクエストをされると、必ずこのIPアドレスを返すというのが決まっています。
そのため、常に同じレスポンスが返ってくるステートレスであると言えます。
デメリットとして、ログインが必要なWebサイトの場合、ステートレスではユーザー固有のレスポンスを返すことができません。
例えば、ユーザーA固有のToDoリストなどを返すことができないです。
DNSと同様に、HTTPなどもステートレスな通信のため、リクエスト/レスポンス情報に対して、リクエスト間の関連性を定義しません。

ステートフル・セッション
ステートフルとは、ステートレスの対義語であり、前後のリクエストと関連する際に用いる言葉です。
例えば、FTPなどのプロトコルはステートフルで、あるクライアントAとサーバBが通信を開始すると、通信の開始と終了が明確であり、この通信はクライアントAから送られたもので、先ほどの通信の続きだということが判別できるようになっています。
また、この一連の通信のことをセッションと言います。
つまり、セッションとは、ステートフルな通信において、一連の通信が開始してから終了するまでのことを言うのです。
よくあるのは、ユーザーがサイトAにログインして、そのログイン状態が切れた場合にセッションが切れたって言ったりしますよね。
これは、ユーザーがサイトAにログインすることによって通信(セッション)が開始され、そのログインした状態(一連の通信の確立)がタイムアウトなどによって途絶えたので、一連の通信が終わったんだな=セッションが切れたと言っているんですね。

Cookie
先ほど、ステートレスの項目で、「HTTP通信はステートレスだから、ログインが必要なWebサイトの場合、ステートレスではユーザー固有のレスポンスを返すことができません」と言いました。
ですが実際、Webサイトへの通信はHTTPプロトコルを利用していますが、ログイン機能の存在するサイトはありますし、ユーザー固有のレスポンスを返すことができています。
これを可能にしているのがCookieと呼ばれる技術になります。
Cookieは、HTTPクライアントとHTTPサーバの間で状態を管理するために考えられた技術で、この技術があることによって、以前受け取った情報(ログイン情報やカートに入れた商品情報のようなサイト状態保持に必要な情報など)をリクエストと一緒に送信することで、ステートフルな通信を可能にしています。
Cookieの仕組み
Cookieとは以下の流れで通信に利用されることで、ステートフルな通信を可能にします。
①初回のリクエスト
②SessionId(ユーザを識別するための識別子)を発行
③レスポンスのSet-CookieにSessionIdが設定される。
④Set-Cookieの値がクライアントであるWebブラウザに保存されます。(Cookieは通信相手のサーバごとに保存される)
⑤同じドメインのサーバにリクエストを送る際は保存していたCookieを送信します。
⑥Cookieの情報からユーザーを識別します。
それぞれの技術の関連性
ここまで、「ステートレス」、「ステートフル」、「セッション」、「Cookie」についてそれぞれ説明してきました。
それぞれの技術について説明しただけなので、ここでは例として、HTTP通信を行う上での関係性をまとめていこうと思います。
「ステートレス」は、前後のリクエストに関係なく、同じリクエストを行った場合に同じレスポンスを返すことでしたね。
単純にリクエストに対して同じレスポンスを返すという役割としては優れていましたが、一方で、前の状態を保存できないんですよね。なので、例えばAmazonにログインしたユーザーがカートに商品を入れたとしてもその状態を保存できないのは、ステートレスなHTTP通信の問題だな〜ってなったわけです。
「ステートフル」は、ステートレスと逆で前後の通信を引き継ぎながら一連の通信を行うことを言うんでしたよね。(FTP通信なんかがこれに当たります)
また、このひとまとまりとなっている一連の通信のことを「セッション」と言うんですよね。
普段のHTTP通信ではいいんですが、ログインが必要なWebサイトにはログインしたユーザー固有の情報を返すためにステートフルな通信が必要で、このセッション管理が必要になるんですよね。
このセッション管理にはいくつか方法があるのですが、この方法の一つがCookieを用いた方法になります。
CookieとはHTTP通信の仕様として存在し、Webブラウザに格納できるクライアントを識別するための情報のため、これを利用することでセッション管理を可能とし、ステートフルな通信を可能にしたと言うことです。
いかがでしたでしょうか。
少しはそれぞれの単語について、解像度が上がったでしょうか。
今後もこれらの技術については触れていこうと思うのでよろしければまたみてやってください。
また、間違っている内容等あれば、ご指摘いただけると嬉しいです。
