【初学者向け】セッションの概念と仕組みをCookie抜きで説明する

# はじめに

この記事は、
初学者が**「セッションとは何か」**を理解するために、
Cookie抜きでセッションの概念と仕組みについて説明したものです。


## 対象者

以下の質問に対して、うまく説明できない方を対象にしています。
- セッションとはどんな概念のこと？
- セッションは何のための仕組み？
- セッションはどんな仕組み？
- セッションのデータはどこに保存される？


## 前提知識

前提として必要な知識は以下の２つについてです。
- HTTPリクエストとHTTPレスポンス
- クライアント（Webブラウザ）とサーバー（Webサーバー）

これらがまだわからない方は、まずは以下のサイトや書籍をご覧ください。

[HTTPの概要 - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Overview)
[【PHP超入門】HTTP（GET・POST）について - Qiita](https://qiita.com/7968/items/4bf4d6f28284146c288f)

[超絶初心者のためのサーバとクライアントの話 - Qiita](https://qiita.com/shuntaro_tamura/items/ae55b99deb9e2a170754)
[「サーバ」と「クライアント」の違い](https://wa3.i-3-i.info/diff559server.html)
[クライアントサーバ](https://wa3.i-3-i.info/word12356.html)


# セッションって何？

「セッション」という言葉にはいろんな意味があり、その文脈によって意味が変わってきます。

そのせいで検索してもなかなか目当ての記事には辿り着けません...

Webにおけるセッションには、
- **「概念」としてのセッション**
- **「仕組み」としてのセッション**
- **「データ」としてのセッション**

という３つの側面があります。

この章では、

**「概念」** と **「仕組み」**

これらのセッションの違いを理解した上で、
なぜセッションが必要とされるのかを説明していきたいと思います。
※「データ」としてのセッションは後から説明します。

それでははじめに**概念**としてのセッションについてです！


## 概念としてのセッション

概念としてのセッションは、
**「通信の開始から終了までの一連の処理」** を意味します。

例えば、下記のような処理のことです。
- Webアプリにおけるログインからログアウトまでの処理
- ECサイトにおけるカートに商品を入れてから購入するまでの処理


Google検索したときに、「セッション」という用語の定義としてよく出てくるのが概念としてのセッションです。

概念としてのセッションについて、まずは **一連の処理を表す概念** なんだ、ということを覚えておいてもらえれば大丈夫です！

続いて、**仕組み**としてのセッションについて説明します。


## 仕組みとしてのセッション

仕組みとしてのセッションは、
**概念としてのセッション（通信の開始から終了までの一連の処理）をHTTP上で実現させるための仕組み** のことです。

前述の例を活用して言えば、
- Webアプリのログインからログアウトまでの処理を、HTTP上で実現させるための仕組み

ということができます。

技術書などで「セッションを利用して〜」などと書かれているのは、仕組みとしてのセッションを指しています。

それではなぜ、セッションという仕組みが必要になるのでしょうか。

	
## なぜセッションが必要なの？

ここでいったんHTTPの話に入ります。

HTTPはWebサイトを閲覧するために、クライアント（ブラウザ）とサーバーの間で通信を行うためのプロトコルです。

HTTPではリクエストとレスポンスの１往復で通信が完結します。

１往復で通信が完結するということは、のちに同じクライアントからリクエストがきても、サーバーはそれが過去にリクエストしてきた相手なのかどうか判断することができないということを表します。

このことを **ステートレス** と言います。

ステートレスとは状態（state）がない（less）ことを意味しており、
HTTPは過去に起こったことを記憶できない通信なのです。

**ステートレスな状態** がどんなものかというと、
- Amazonで商品をカートに入れた後、別の商品ページに行くとカートが空になっている。
- Twitterでページを移動するたびにログインを求められる

これは穴の空いたカートで買い物させられたり、よく会う人から「お前誰？」と会うたびに言われるような状態です。

しかし実際のところ、毎回カートが空になるECサイトも、ページを移動するたびに毎回ログインが必要になるWebアプリもありません。

それはセッションの仕組みを活用することで、HTTPをステートフルな状態に保つことができているからです。

ステートフルとは過去に起こったことを記憶できる状態のことです。

HTTPでカート機能やログイン機能を実装するために、セッションという仕組みが必要なのです。


# どんな仕組みなの？

ここからはHTTPをステートフルに保つための、具体的なセッションの仕組みについて説明していきます。

とは言ってもセッションの仕組み自体は非常にシンプルです。

この仕組みの説明にあたって出てくるのが、
**「データ」としてのセッション** である **「セッションファイル」** です。


## 目印（セッションID）と記録（セッションファイル）

セッションは、サーバーがクライアントに目印を付与し、やりとりの記録を残すことでステートフルな通信を実現します。

サーバーがクライアントに付与する目印を **「セッションID」**、
やりとりの記録を残すファイルを **「セッションファイル」** と言います。

技術書で「セッションに保存された値を〜」などと書かれているのが、このセッションファイルです。


## 具体的にはどんな処理になるの？

具体的な処理の流れは以下のようになります。

1. クライアントがサーバーにリクエストを送信
2. サーバーはレスポンスの際、クライアントに**セッションID**を付与。同時に**セッションファイル**をサーバー内に作成し、保存する
3. クライアントは２回目以降のリクエスト時、サーバーにセッションIDを提示する
4. サーバーは提示されたセッションIDに紐づくセッションファイルを確認
5. サーバーはセッションファイルを元に、前回の通信内容を反映したレスポンスを返す


この処理は、現実でいえば病院にいった時のイメージです。

1. 患者が病院へ診断をお願いする（初診＝初回リクエスト）
2. 医者は診断後、診察券を発行。同時に患者のカルテを作成して保管する
3. 患者は２回目以降の受診時に、診察券を提示する
4. 医者は診察券に対応するカルテを確認
5. 医者はカルテを元に、前回の内容を踏まえて診断する

上記の例では、
- 患者：クライアント
- 医者：サーバー
- 診察券：セッションID
- カルテ：セッションファイル

というような役割を担っています。

このように、セッションは現実でもよく利用されている仕組みをWeb上で行っているものです。

このセッションの仕組みを用いることで、私たちは元来ステートレスなHTTPにおいてステートフルな通信を行うことができています。

## どこで実行されてるの？

前述した処理の流れを見てもらうと、セッションについて以下のようになっていることがわかります。
- **セッションID**は、サーバーで発行し、クライアントが保持する
- **セッションファイル**は、サーバーが作成・保持する

どちらもサーバーで始まっています。
したがって、セッションを主体的に管理するのは **サーバー側** であり、
その処理はPHPやRubyなどのサーバーサイド言語で記述されます。

このことからセッションは **サーバー** で実行されていることがわかります。


# 終わりに

ここで冒頭の質問を振り返ってみます。

**Q セッションとはどんな概念のこと？**
 A セッションとは通信の開始から終了までの一連の処理を表す概念のこと

**Q セッションは何のための仕組み？**
A セッションは通信を識別することで、ステートレスなHTTP上でステートフルな通信を実現するための仕組み

**Q セッションはどんな仕組み？**
A サーバーからクライアントにセッションIDを付与し、セッションIDに紐づくセッションファイルを作成することで、通信相手と通信内容を記録する仕組み

**Q セッションのデータはどこに保存される？**
A サーバー内

どうでしょうか。
この記事を通して、読んでくれた皆さんの理解が少しでも深まれば嬉しいです。

## 次に読むべき記事

この記事では理解しきれなかったり、Cookieも併せて理解したい！という方は、以下の記事もご覧ください。

[【PHP超入門】Cookieとセッションについて - Qiita](https://qiita.com/7968/items/ce03feb17c8eaa6e4672)
[Cookieとセッションをちゃんと理解する - Qiita](https://qiita.com/hththt/items/07136ad74127999df271)

どちらも非常にわかりやすい記事です！
ぜひご参考までに。


## この記事について

この記事は自分自身が「セッション」を理解するのにかなり苦労した経験から書いたものです。

セッションがわかりにくいのは、
- 色んな意味があるせいで検索しても知りたい情報に辿り着けないこと [^1]
- Cookieとセットで出てくるため、双方の内容が混ざってしまうこと

が原因としてあると感じたので、それを解消すべく、セッション単独で説明する記事にしてみました。

ここまで色々と書いてきましたが、自分も初学者なので、もし誤りがあればコメントいただけると嬉しいです。
最後までお読みいただきありがとうございました！

[^1]: 技術書で「セッション」が出てくる（仕組み・データとしてのセッション）⇨理解できずにGoogleで検索する⇨セッションの定義が出てくる（概念としてのセッション）⇨どうすればいいかわからなくなる