インターネットでショッピングサイトにログインしたり、SNSを開いたりしたことありますよね。その時、サイト側はあなたが誰なのかどうやって覚えていると思いますか?実は「セッション」という仕組みを使って、あなたの情報を一時的に保存しているんです。でもこのセッション、なんとなく聞いたことはあるけど、実際に何をやっているのかよくわからないな…という人も多いはず。この記事を読めば、セッションがどういう仕組みで、なぜ必要なのか、きっとスッキリわかるようになるよ。
- セッションとは、ユーザーがサイトにログインしてからログアウトするまでの一連の繋がった時間のことを指す
- サーバーがセッション中のあなたの情報(買い物かごの中身など)を一時的に記憶しておくおかげで、何度もログインし直さなくて済む
- クッキーという小さなファイルにセッションIDという識別番号が保存されることで、サーバーはあなたが誰かを判別できる
もうちょっと詳しく
セッションについてもう少し詳しく説明すると、これはWebアプリケーションが「ユーザーの状態を保つ」ために絶対に必要な技術です。インターネット通信の基本的な仕組みである「HTTP」というプロトコル(つまり情報のやり取りルール)は、実は「ステートレス」という特性を持っています。これは「1回の通信ごとに完結してしまって、前の通信のことを覚えていない」という意味です。だからこそ、サーバー側が別の方法を使ってユーザー情報を保管しておく必要があるわけです。セッションはそのための最も基本的で重要な仕組みなんです。
HTTPは「その場限り」の通信だから、セッションという仕組みで「あなたはあなただ」と確認し続ける必要があるんだ
⚠️ よくある勘違い
→ 実は違います。セッションのデータはサーバー(遠くのコンピュータ)に保存されていて、あなたのパソコンには「セッションID」という番号札だけが保存されているんです。セッションID自体は個人情報ではありませんが、サーバーがそのIDを使ってあなたの情報を引き出します。
→ これが正しい理解です。だからこそ、ハッカーがあなたのセッションIDを盗んだら、そいつがあなたになりすませる危険があるわけです。これを「セッションハイジャック」と言います。
[toc]
セッションとは何か?基本をおさえよう
セッションという言葉の意味
まず「セッション」という言葉の意味から説明しましょう。セッションは英語で「session」と書いて、元々は「会議」とか「時間帯」という意味です。でも、インターネットの世界では、もう少し具体的な意味を持っています。つまり「ユーザーがあるWebサイトにアクセスしてから、そのサイトを離れるまでの一連の時間」ということですね。
わかりやすく例えるなら、学校の授業みたいなもんです。あなたが教室に入ってから、授業が終わって教室を出るまで、それが1つの「セッション」。その間、先生はあなたが何をしたか、どの課題をやったか、成績がいくつになったか…全部覚えていますよね。Webサイトのセッションも同じで、サーバーがあなたのことを「覚えている」その期間を指すわけです。
なぜセッションが必要なのか?
では、なぜわざわざセッションなんて仕組みが必要なんでしょうか。それを理解するには、インターネット通信の基本的な仕組みを知る必要があります。
インターネットでブラウザがサーバーと通信するときに使う「HTTP」という決まり事(つまりプロトコル)があります。このHTTPという仕組みは、実は結構「単純」に設計されているんです。1回の通信が終わったら、それでおしまい。前の通信が何だったか、覚えていないんです。これを「ステートレス」と言います。つまり「状態を保たない」という意味ですね。
だけど考えてみてください。Amazonでショッピングするときを想像してください。あなたが本を買い物かごに入れて、その後、べつのページで靴を探して、また別のページでチェックアウト画面に行きますよね。もしサーバーが「1ページごとに忘れてしまう」なら、どうなると思います?買い物かごに入れた本が消えちゃいます。ログインした情報も消えちゃいます。毎回パスワードを入力しなきゃいけなくなるわけです。大変ですよね。
だからこそ、セッションという仕組みで「あなたのことを一時的に覚えておく」が必要なんです。つまり、HTTPの「忘れっぽい」という弱点をカバーしているのがセッションということですね。
セッションの仕組み:クッキーと一緒に動いている
セッションとクッキーの関係
セッションの話をするときに、必ず出てくるのが「クッキー」という概念です。多くの人は「セッション」と「クッキー」をごっちゃにしちゃってるけど、実は違う仕組みです。ここをちゃんと理解することが大事。
クッキーとは、つまり「ブラウザがサーバーから渡された小さな情報を、あなたのパソコンの中に保存しておく仕組み」のことです。対してセッションは「サーバー側があなたの情報を一時的に保管しておく仕組み」ですね。どこに保管されるのかが違う。クッキーはあなたのパソコン側、セッションはサーバー側です。
では、この2つはどうやって一緒に働くのか。流れを説明しましょう。あなたがAmazonにログインするとします。ステップ1:あなたはメールアドレスとパスワードを入力します。ステップ2:サーバー側が「よし、このメールアドレスはホンモノだ」と認識して、あなた用の「セッションID」という番号札を作成します。ステップ3:そのセッションIDをクッキーという形であなたのパソコンに送ります。ステップ4:あなたのパソコンのブラウザは、そのセッションIDを保存しておきます。ステップ5:その後、あなたが新しいページをリクエストするたびに、ブラウザは自動的に「私のセッションIDは123456789です」とサーバーに送るわけです。ステップ6:サーバーは「あ、123456789の人か。データベースで調べてみると…ああ、山田太郎さんだ。彼の買い物かごには本が3冊入ってる」という具合に、あなたの情報を引き出します。
セッションIDという識別番号
セッションIDは非常に大事な存在です。これは、つまり「あなたであることを証明するための番号札」ですね。パスワードではありません。パスワードはあなたが知っていて、他の人には教えないべき秘密情報ですが、セッションIDはサーバーが勝手に作った、いわば「その時だけ有効なチケット」みたいなものです。
だから、セッションIDが長すぎず短すぎず、ランダムに生成される必要があります。短すぎると、ハッカーが全部試して、間違えて他の人のセッションIDを当てちゃうかもしれません。ランダムじゃないと、パターンを読まれて予測されちゃうかもしれません。だからサーバーは、セキュリティを考えて、難しい計算をして、予測不可能な長い番号を作るわけです。
セッションIDはクッキーの中に入って、あなたのパソコンに保存されます。だから理論的には、あなたが「開発者ツール」とかいう、ブラウザの裏側を見るツールを使えば、自分のセッションIDが何かを確認することもできるんです。ただ、それを他の人に教えちゃったら…その人はあなたになりすまして、あなたのアカウントを使って買い物をしたり、個人情報を見たりできちゃいます。これが「セッションハイジャック」という攻撃ですね。だから、セッションID(つまりセッションが入ったクッキー)は、いわば「財布の中のクレジットカード」くらい大事に扱う必要があるわけです。
セッションの流れ:ステップバイステップで理解する
ログイン:セッションの始まり
セッションの最初のステップは、ログインです。あなたがサイトのログインページに行って、ユーザー名とパスワードを入力しますね。その情報がサーバーに送られます。サーバーはデータベース(つまり、膨大な情報が整理して保存されている、大きなファイル保管庫みたいなもの)を調べて、「このユーザー名とパスワード、ホンモノだ」って確認します。
その時点で、サーバーは2つのことをします。1つ目は、あなたのセッションIDを作成すること。2つ目は、そのセッションIDに紐付けて、あなたの個人情報やログイン時刻などを記録することです。「セッション123456789は、田中花子さんで、ログイン時刻は午前10時30分」みたいな感じで、サーバーのメモリ領域(つまり、サーバーが一時的に情報を保存する場所)にデータを保管します。
そして、そのセッションIDをクッキーの形であなたのブラウザに送ります。あなたのブラウザは「よし、このセッションIDをもらった。保存しておこう」と、パソコンに保存するわけです。
ページ移動:セッションの保持
ログイン後、あなたがサイト内で色々なページを見ていくとします。買い物かごのページを見たり、商品ページを見たり、レビューを書いたり…色々とやりますね。その時、毎回何が起こっているのかを説明します。
あなたが新しいページをクリックすると、ブラウザは新しいリクエストをサーバーに送ります。その時、ブラウザは自動的にクッキーの中身も一緒に送るんです。「ねえサーバー、私のセッションID 123456789のユーザーが、このページを見たいって言ってます」という具合に。
サーバーは「あ、123456789のセッションだ。メモリを見てみると…あ、田中花子さんですね。彼女は今こういう商品をカートに入れてる。彼女向けに、このページを表示してあげよう」という具合に、あなたにカスタマイズされたページを返すわけです。
これが何度も何度も繰り返されます。ページを見るたびに、クッキーが送られて、サーバーが「あ、この人だ」と確認して、その人向けのデータを返す。その流れの中で、買い物かごの中身も保持されるし、ログイン情報も保持されるし、あなたがどのページを見たかという履歴も保持されるわけです。
タイムアウト:セッションの終わり
すべてのセッションには、終わりがあります。その終わりは2つのパターンに分かれます。1つは「あなたが意識的にログアウトした場合」で、もう1つは「一定時間何もしなかった場合」ですね。この2番目のやつを「タイムアウト」と言います。つまり「時間切れ」ということですね。
例えば、あなたがAmazonでログインして、買い物をしていたとします。でも、ちょっと別のことをしていて、30分間、何もしませんでした。その場合、サーバーは「あ、この人は何もしなくなってから30分も経ってる。多分もうこのサイト見てないんだろう」と判断して、セッションを削除するわけです。セッションIDも無効にされます。
だから、もう1回ページを見ようとしたら、「ログインしてください」って出てくるわけですね。セッションが終わったから、また新しいセッションを作る必要がある、というわけです。このタイムアウト時間は、サイトによって違います。銀行のサイトなら5分で切れちゃうかもしれません(セキュリティが大事だから)。でも、YoutubeなんかなSNSなら1時間以上かもしれません。
セッションのメリット:なぜこんな仕組みを使うのか
ユーザー体験が良くなる
まず最大のメリットは、ユーザー体験が良くなることです。セッションがなかったら、どうなるか想像してみてください。ページを見るたびに、パスワードを入力しなきゃいけない。買い物かごの中身は、毎回リセットされちゃう。あなたが見たページの履歴も、毎回消えちゃう。こんなんだったら、誰もサイトを使いたくなくなっちゃいますよね。
セッションがあるおかげで、「ログインしたらログアウトするまで、サイトがあなたのことを覚えてくれている」という感覚で使えるわけです。これってすごく大事。インターネットを楽に使える、というのは実は、こういう「背景で静かに動いている仕組み」の、ちょっとした工夫が積み重なっているんです。
セキュリティが保たれる
次のメリットは、セキュリティです。つまり「安全性」ですね。パスワードをクッキーに直接保存するとしたらどうでしょう。毎回パスワードをサーバーに送ったら、もしもそれが盗まれたら…大変です。でもセッションID方式なら、パスワードはログイン時だけ送られます。あとはセッションIDだけです。セッションIDは時間とともに無効になるし、ページごとに新しい番号が求められるわけでもない(同じセッションIDが使われ続ける)ので、ハッカーが盗むなら、盗んだ直後に使う必要があります。時間差があれば使えなくなっちゃう可能性も高いわけです。
また、パスワードのような「ずっと有効な秘密の番号」じゃなくて、「今この時間だけ有効な番号」だから、もし盗まれても、あなたがログアウトしたら無効になっちゃいます。だから被害を最小限に留められるわけです。
複数ブラウザやデバイスの管理ができる
さらに、複数のブラウザやデバイスで、別々にログインできるというメリットもあります。例えば、あなたがスマートフォンでInstagramにログインしていても、パソコンでも別々にログインできますよね。これは、スマートフォンと パソコンが別々のセッションを持っているからなんです。
もしパスワードだけで認識していたら、「あ、このパスワードでログインした。どれか1つのデバイスだけにしよう」みたいに、複雑な制限が必要になっちゃいます。でもセッションなら、「スマートフォンのセッションID 456789」「パソコンのセッションID 789456」というように、別々に管理できるわけです。
セッションとプライバシー:気をつけるべきこと
セッションIDの盗難リスク
セッションには、当然リスクもあります。最大のリスクは「セッションIDが盗まれる」ことです。もし誰かがあなたのセッションIDを知ったら、その人はあなたになりすましてログインできちゃいます。これが「セッションハイジャック」という攻撃ですね。
どうやってセッションIDが盗まれるのか。パターンはいくつかあります。1つは、ハッカーがあなたのパソコンにマルウェア(つまり「悪意を持ったプログラム」)をインストールして、あなたのクッキーを読み込んじゃう場合。もう1つは、あなたが公衆WiFiを使ってサイトにアクセスしたときに、悪い人が通信を盗み聞きして、セッションIDを読んじゃう場合。さらにもう1つは、サイト側が「HTTPS」という暗号化通信を使わないで、通常の「HTTP」を使っちゃってる場合なんかですね。
HTTPS通信の大切さ
ここで大事なのが「HTTPS」という仕組みです。つまり「HTTP通信を暗号化した、安全な通信方式」ですね。HTTPS通信なら、セッションIDが盗み聞きされにくくなります。だから、ログイン情報を入力するようなサイトは、必ずHTTPSを使うべきなんです。
あなたがブラウザのアドレスバーを見ると、「https://」で始まっているか「http://」で始まっているか、確認できます。銀行やAmazonみたいに個人情報を扱うサイトは、「https://」で始まっていなきゃダメ。もし「http://」だけだったら、そこにパスワードを入力しちゃダメですよ。セッションIDが盗まれるリスクが高いからです。
公衆WiFiでのセッション安全性
もう1つ気をつけるべきは、公衆WiFiです。カフェやショッピングモール、図書館なんかの公衆WiFiでサイトにアクセスするときは要注意です。公衆WiFiは、通信が傍受されやすいんです。だから、できるだけHTTPSなサイトを使うべきだし、ログイン情報を入力したり、買い物をしたりするのは、公衆WiFiじゃなくて、自分の家のWiFiやモバイル回線を使うべきなんです。
Twitterなんかで「カフェで絶対に重要な情報を入力しちゃダメ」って言われるのは、こういうセッションハイジャックのリスクがあるからなんですね。
