Cookieクラスの使い方(値を保存・取得する基本)を初心者向けに解説
新人
「Spring MVCで画面をまたいでデータを保持したいんですが、セッション以外の方法ってありますか?」
先輩
「あるよ。その一つがCookieを使う方法だ。Cookieクラスを使えば、ブラウザ側にデータを保存しておいて、次回アクセス時に同じ情報を使えるんだ。」
新人
「Cookieって名前は聞いたことがありますが、具体的にどうやって使うんですか?」
先輩
「じゃあまずはCookieの基本から説明しよう。そのあと、Spring MVCでのCookieクラスの使い方と、Gradle+Pleiades環境での準備方法まで解説するよ。」
1. Cookieとは何か(役割と基本的な仕組み)
Cookieとは、Webブラウザにデータを一時的または一定期間保存しておくための仕組みです。サーバーからレスポンスとして送られたCookieは、ブラウザ側に保存され、次回同じサイトにアクセスする際に自動的にサーバーへ送信されます。
例えば、ショッピングサイトのカート情報やログイン状態を保持するためにCookieが使われます。セッションと異なり、データはクライアント側(ブラウザ)に保存されるため、サーバーのメモリ消費を抑えることができます。
Cookieには以下の特徴があります。
- 有効期限を設定できる(ブラウザを閉じても残せる)
- 保存できるデータは文字列のみ
- 1つのCookieサイズはおよそ4KBまで
- セキュリティ設定(HttpOnlyやSecure)が可能
2. Cookieクラスの基本構造とSpring MVCでの利用場面
Javaのjavax.servlet.http.Cookieクラスは、Cookieを操作するための標準的なクラスです。Spring MVCではこのクラスを使って、値を保存・取得します。利用の流れは次の通りです。
- サーバー側で
Cookieインスタンスを作成し、レスポンスに追加してブラウザへ送信 - ブラウザがCookieを保持し、次回アクセス時に自動的にサーバーへ送信
- サーバー側でCookieを受け取り、必要な値を取得
Cookieは以下のような場面で利用されます。
- ログイン状態の保持(Remember Me機能)
- ユーザー設定(言語やテーマ)の保存
- トラッキングやアクセス解析
Spring MVCではHttpServletResponseを使ってCookieを追加し、HttpServletRequestを使ってCookieを取得します。
3. Gradle + Pleiades環境でCookieを扱う準備
今回の例は、Pleiades + Gradle環境でSpring MVCプロジェクトを作成し、Cookieを使った値の保存・取得を試せるようにします。MavenではなくGradleを使い、@Controllerで記述します。
手順は以下の通りです。
- Pleiadesをインストールして起動
- 「新規プロジェクト」から「Gradleプロジェクト」を選択
- 依存関係の追加画面で「Spring Web MVC」にチェックを入れる
@Controllerクラスを作成し、Cookieを扱うコードを記述src/main/resources/templatesにThymeleafテンプレートを作成
例えば、Cookieを追加する基本コードは以下のようになります。
@Controller
public class CookieController {
@GetMapping("/setCookie")
public String setCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("userName", "山田太郎");
cookie.setMaxAge(60 * 60); // 1時間
response.addCookie(cookie);
return "cookieSetView";
}
}
このコードは、/setCookieにアクセスするとuserNameというCookieを1時間有効で保存します。ブラウザを開いたままや再アクセス時に、値を取得して表示できます。
4. Cookieに値を保存する方法(Javaコード例)
Spring MVCでCookieに値を保存するには、Cookieクラスを使い、HttpServletResponseに追加します。これにより、ブラウザがCookieを保持し、以降のアクセスで自動的に送信してくれます。
例えば、ユーザー名をCookieに保存するコードは以下のようになります。
@Controller
public class CookieController {
@PostMapping("/saveCookie")
public String saveCookie(@RequestParam String userName, HttpServletResponse response) {
Cookie cookie = new Cookie("userName", userName);
cookie.setMaxAge(60 * 60 * 24); // 1日間有効
cookie.setPath("/"); // 全パスで有効
response.addCookie(cookie);
return "redirect:/showCookie";
}
}
ここでは、フォームから送信されたuserNameを1日間有効なCookieとして保存しています。setPath("/")を設定することで、同一ドメイン配下の全てのURLで利用できます。
Thymeleafを使った入力フォームは次のようになります。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Cookie保存フォーム</title>
</head>
<body>
<h1>Cookieにユーザー名を保存</h1>
<form action="/saveCookie" method="post">
<label>ユーザー名: <input type="text" name="userName"></label>
<button type="submit">保存</button>
</form>
</body>
</html>
このフォームから送信されたデータは、コントローラでCookieとして保存されます。
5. Cookieの値を取得する方法(Javaコード例)
保存したCookieを取得するには、HttpServletRequestを使います。getCookies()メソッドで全てのCookieを取得し、目的の名前のCookieを探して値を取得します。
@GetMapping("/showCookie")
public String showCookie(HttpServletRequest request, Model model) {
String userName = "未設定";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("userName".equals(cookie.getName())) {
userName = cookie.getValue();
break;
}
}
}
model.addAttribute("name", userName);
return "showCookieView";
}
このコードでは、Cookie配列をループしてuserNameという名前のCookieを探し、その値を取得しています。見つからなかった場合は「未設定」として扱います。
取得した値をThymeleafで表示するHTMLは以下の通りです。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Cookie表示</title>
</head>
<body>
<h1>保存されているユーザー名</h1>
<p th:text="'ユーザー名: ' + ${name}">ユーザー名: 未設定</p>
</body>
</html>
こうすることで、Cookieに保存された値を画面上で簡単に表示できます。
6. Cookieを使う際の注意点(有効期限、セキュリティ設定など)
Cookieを利用する場合、いくつかの注意点があります。
- 有効期限の設定:
setMaxAge()で秒単位で指定します。0を指定すると削除され、負の値はブラウザ終了時に削除されます。 - パスの設定:
setPath()で有効なURLパスを指定します。適切に設定しないと不要なリクエストにもCookieが送信される可能性があります。 - セキュリティ設定:
setHttpOnly(true)でJavaScriptからのアクセスを禁止(XSS対策)setSecure(true)でHTTPS通信時のみ送信(盗聴防止)
- サイズ制限:1つのCookieは約4KBまで。大きなデータを保存しないこと。
以下はセキュリティ設定を付けた例です。
@PostMapping("/secureCookie")
public String secureCookie(@RequestParam String value, HttpServletResponse response) {
Cookie cookie = new Cookie("secureData", value);
cookie.setMaxAge(3600);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
response.addCookie(cookie);
return "redirect:/showCookie";
}
このように設定することで、セキュリティリスクを低減できます。特にログイン情報や個人情報を扱う場合には必須です。
Cookieは便利な仕組みですが、ブラウザに保存されるため改ざんや盗み見のリスクもあります。保存する値は必要最低限にし、暗号化や署名を検討することが推奨されます。
7. Cookieの値を更新する方法
Spring MVCでCookieクラスの値を更新するには、新しい値で同じ名前のCookieを作成し、再度HttpServletResponseに追加します。ブラウザは同じ名前・パス・ドメインのCookieを上書きします。
例えば、ユーザー名を変更するケースでは以下のように実装できます。
@PostMapping("/updateCookie")
public String updateCookie(@RequestParam String newName, HttpServletResponse response) {
Cookie cookie = new Cookie("userName", newName);
cookie.setMaxAge(60 * 60 * 24); // 有効期限は1日
cookie.setPath("/");
response.addCookie(cookie); // 新しい値で上書き
return "redirect:/showCookie";
}
この方法では古いCookieが置き換えられ、次回アクセス時から新しい値が利用されます。更新時もsetPath()や有効期限を忘れず設定することで、期待通りに動作します。
Thymeleafでの入力フォーム例は次の通りです。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Cookie更新フォーム</title>
</head>
<body>
<h1>Cookieのユーザー名を更新</h1>
<form action="/updateCookie" method="post">
<label>新しいユーザー名: <input type="text" name="newName"></label>
<button type="submit">更新</button>
</form>
</body>
</html>
更新後、ブラウザの開発者ツールでCookieの値を確認すると、すぐに新しい値に置き換わっていることがわかります。
8. Cookieの値を削除する方法
Cookieを削除するには、同じ名前・パス・ドメインのCookieを作成し、有効期限を0に設定してHttpServletResponseに追加します。これによりブラウザはそのCookieを即時削除します。
@GetMapping("/deleteCookie")
public String deleteCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("userName", "");
cookie.setMaxAge(0); // 即時削除
cookie.setPath("/");
response.addCookie(cookie);
return "redirect:/showCookie";
}
この例では、/deleteCookieにアクセスすると、userNameというCookieがブラウザから削除されます。削除後、/showCookieを開くと「未設定」と表示されます。
削除用のリンクをThymeleafで作成すると、ユーザーがワンクリックでCookieを消せます。
<a href="/deleteCookie">Cookieを削除する</a>
削除処理では、名前だけでなくsetPath()の設定も一致させることが重要です。異なるパスで設定されたCookieは削除されません。
9. Cookieを安全に扱うためのベストプラクティス
Cookieはクライアント側に保存されるため、改ざんや盗み見のリスクがあります。特にSpring MVCでログイン状態や個人情報をCookieに保存する場合は、次のベストプラクティスを守ることが重要です。
- 最小限のデータのみ保存する:不要な情報や機密情報は保存しない。
- セキュリティ属性の設定:
setHttpOnly(true)でJavaScriptからのアクセスを防止(XSS対策)setSecure(true)でHTTPS接続時のみ送信(盗聴防止)
- 値の暗号化や署名:重要なデータは暗号化してから保存し、改ざん検出のために署名を追加する。
- 有効期限を短く設定:長期間保持が不要な場合は短く設定し、定期的に更新する。
- パスとドメインの適切な設定:必要な範囲だけでCookieが送信されるように設定する。
以下はセキュアなCookie設定の例です。
@PostMapping("/secureUserCookie")
public String secureUserCookie(@RequestParam String userName, HttpServletResponse response) {
Cookie cookie = new Cookie("secureUser", userName);
cookie.setMaxAge(600); // 10分
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
response.addCookie(cookie);
return "redirect:/showCookie";
}
このように設定すると、CookieはHTTPS通信時のみ送信され、JavaScriptからアクセスできなくなります。さらに値を暗号化すれば、万が一盗まれても内容を読み取られるリスクを減らせます。
Spring MVCでCookieを扱う際は、利便性と安全性のバランスを意識しながら設計することが大切です。特にセッション管理や認証機能と組み合わせる場合は、セキュリティ要件を十分に満たすようにしましょう。