Cookieとセッションの違いとは?保存する場所と使い分けをわかりやすく解説|確認問題の回答例
Cookieとセッションの違いとは?保存する場所と使い分けをわかりやすく解説の確認問題の回答例です。保存する値・保存先・有効期限を分けて確認しましょう。
問題1:設定値とIDはCookie、利用者情報はセッション
| 値 | 保存先 |
|---|---|
| displayMode=compact | ブラウザ側のCookie |
| JSESSIONID=A1 | ブラウザ側のCookie |
| loginUserId=1001 | サーバー側のセッションA1 |
セッションを使う例では、どのサーバー側の保存先を使うかを識別するために、CookieでセッションIDを送っています。Cookieとセッションはどちらか一方を選ぶ関係ではありません。A1は説明用のセッションID、1001は利用者のIDであり、役割が異なります。
次の画面を開くリクエストにも、ブラウザがJSESSIONID=A1を付けることで、サーバーは同じ有効なセッションA1を見つけられます。セッション内のloginUserId=1001を使うのであり、Cookieから利用者IDを直接受け取るわけではありません。
リンクをクリックして次の画面を開く場合は、新しいリクエストになります。前のリクエストスコープに保存した情報は自動では引き継がれません。リクエストスコープとセッションスコープは、どちらもサーバー側の情報置き場ですが、使える範囲が違います。同じリクエストをforwardする場合は、リクエストスコープの情報をその先でも使えます。
問題2:Cookieの値だけを本人確認の根拠にしない
利用者がCookieのloginUserIdを1002へ変更すると、他の利用者として扱われてしまうおそれがあります。ブラウザから届いたIDやログイン済みという印だけを、そのまま信用してはいけません。サーバーで認証し、その結果をセッションなどで管理します。
表示設定のCookieも変更される可能性があるため、受け取る値を確認します。この記事のコードはcompactの場合だけ採用し、それ以外はstandardを使います。なお、セッションID自体が盗まれるリスクもあるため、セッションを使えば安全対策が不要になるわけではありません。
問題3:表示設定が残っても、セッションは期限切れになる
あります。表示設定のCookieは30日間の期限なので、削除やブラウザの制限がなければ翌日も残り得ます。一方、セッションは10:20を最後にアクセスがないため、そこから30分を過ぎると期限切れになります。翌日は以前の認証済み情報を取り出せず、再ログインが必要です。
Cookieの有効期間を30日にしても、セッションの無操作タイムアウトは30日になりません。また、10:20のアクセスだけで、表示設定Cookieの期限が自動的に30日後へ延長されるわけでもありません。
問題4:Cookieの削除とセッションの無効化は別
Cookie cookie = new Cookie("displayMode", "");
cookie.setPath(request.getContextPath() + "/");
cookie.setMaxAge(0);
response.addCookie(cookie);
setMaxAgeには0を指定します。パスは保存時と同じものを指定します。今回なら、アプリのコンテキストパスに/を付けた値です。Domainも、指定して保存した場合は削除時に対応をそろえます。空文字列を設定するだけでは、削除の指示になりません。
この処理はブラウザ側のdisplayMode Cookieを削除する指示です。session.invalidate()は、サーバー側のセッションを無効にする処理であり、同じものではありません。displayModeを消してもログイン用のセッションは無効にならず、セッションを無効にしてもdisplayModeは自動で削除されません。