Webアプリケーション開発を行っていく上で避けては通れない、「セッション」と「Cookie」について記述していきます。業務に入り始めた時は「Cookie? なにそれおいしいの?」「セッション? なんかみんなで演奏したりするんか?」みたいな感じで全く理解できていませんでした。以前、社内で開催しているLT会で「セッションとCookieについて完全に理解する」という発表をしたところ、それなりに理解を深めることができたかなと感じられました。
セッション、Cookieとは何者なの?
まず、よくセットで出てくる2つの単語について、それぞれの意味をざっくり整理します。
Cookieとは?
クライアント(ブラウザ)に保存されたデータのことです。
セッションとは?
一連の処理の始まりから終わりまでを表す「概念」のことです。
※ バンドでは、一緒に集まって演奏したりすることを「セッションする」といったりします。なので画像はセッションしている様子をセレクトしました(筆者は元バンドマンです……)
セッションは「概念」というなんだかふわっとした印象ですが、それぞれの言葉が何を意味するものなのかイメージはできるのかなと思います。ただ、そもそもなんでCookieやセッションという仕組みがあるのでしょうか。
Cookieとセッションはなんで必要?
結論から言うとHTTP通信の「ステートレス」という性質を克服して、状態を保持できるようにするためとなります。
ちょっと言い換えてみると、ステートレスなHTTP通信において、セッションという「一連の処理(ログイン等)の始まりから終わりまで」を、Cookieを用いることによって可能としています。
HTTP通信の「ステートレス」という性質
そもそもHTTPとは
Hyper Text Transfer Protocolの略称で、HTMLなどのテキストファイルや、画像などのコンテンツをやりとりするために使われるプロトコルのことをいいます。クライアント(Webブラウザ)とサーバーは普段から「HTTPメッセージ」と呼ばれるデータ形式でやりとりしています。
※プロトコルとは、データを相互にやりとりできるように、あらかじめ決められたルールのことです。
Webブラウザはサーバーに対して、HTTPというプロトコルを用いてリクエストを送ります。リクエストを受け取ったサーバーは、リクエストの内容に従ってDBに問い合わせたりといった処理を行い、結果をレスポンスとしてブラウザ側に返します。このやりとりを繰り返すことによって、Webアプリケーションは動作しています。そして、このHTTPを用いたやりとりは「ステートレス」という特徴を持っています。
ステートレス
「ステート(状態)を持たない」という意味。
HTTPでの通信では、やりとりはリクエストからレスポンスの1往復のみで完結します。
ブラウザからのリクエストに対して、サーバーはリクエストに応じたファイルを返却します。しかし、次にリクエストを送ったときにはサーバーは前回の状態を覚えていません。この逆で、日常的な会話のように「以前話した時の状態」を保持しながらやりとりする通信を「ステートフル」といいます。
1対1のやりとりであれば、状態を保持しておくことはそれほど負担はかかりません。しかし、Webアプリケーションにおいて、サーバーは多数のクライアントからリクエストが送られることが多々あります。そのため、サーバーがステートフルであると通信それぞれの状態を保持しなければならず、負荷が非常に高くなってしまいます。
HTTPはそれぞれのリクエストをスムーズに処理していくため、ステートレスという特徴をとっているという背景があります。
HTTP(ステートレス)の弱点
Webが進化するにつれて、HTTPがステートレスでは困ることが増えてきました。
例えば、ショッピングサイトなどで「買い物かごに入れる」「買い物かごの商品を確認する」といった動作を行いたい場合。ステートレスなままだと前回の状態を保持できないため、リクエストのたびに買い物かごが空になってしまいます。
そのため、HTTP通信の弱点を補完するために、Cookieを使って「以前の状態を保持した上で次の処理を行う(ステートフル)」にする仕組みが導入されるようになりました。
Cookieとセッションでステートフルにする仕組み
HTTPリクエストを受けたサーバーは、リクエストを送信したクライアントを識別するためにIDのようなもの(ただの文字列)を発行します。サーバーはレスポンスを返す際、メッセージヘッダーの「Set-Cookie」にその文字列を紐づけることで、ブラウザはSet-Cookieの値をCookieとして保存します。
これにより、サーバーは次に「ブラウザ村 太郎」からリクエストがあったとしても、Cookieに保存されている情報を識別することにより、同じクライアントからのリクエストであることを認識できるようになります。
リクエストを送信する際のCookieの情報は、レスポンスと同じくメッセージヘッダーの「Cookie」に記述され、送信されます。
これによって、Cookieの情報を通して、Webブラウザとサーバー間で状態を持った一連の処理の流れ(セッション)を実現することができるようになりました。
まとめ
認証などについて調べていると「セッションとCookie」とセットで語られることが多いかと思います。
- Cookie: セッションを実現するために、データをブラウザに保持する仕組み。
- セッション: ユーザーの一連の処理の流れ。ログインからログアウトなどといったように、開始から終了までを表す。
Cookieを用いることによってセッションを管理し、「ステートレス」であるHTTP通信を擬似的に「ステートフル」にし、クライアントとサーバー間でやり取りをすることができるようになる。ということになります!
この記事がこれからWebアプリケーション開発を行なっていく方、プログラミングを学びたてでなんもわからん、という方などの「完全に理解する」きっかけとなれば幸いです!