Cookie を一言でいうと
Cookie は
「ブラウザの中に一時的にメモしておける“名札・メモ用紙”」
です。
HTTP は本来「1 回 1 回のリクエストがバラバラで、前後のつながりを覚えていない」仕組みです。
そこで「この人はさっきログインしたあのユーザーだよ」とか「カートの中身はこれだよ」といった情報を、
ブラウザ側に一時保存しておくために使われるのが Cookie です。
HTTP と Cookie の関係をざっくりイメージする
HTTP は「毎回初対面」なプロトコル
HTTP はステートレス(無状態)と言われます。
1 回目のリクエストと 2 回目のリクエストの間に、
「この 2 つは同じユーザーからだよ」という情報は、プロトコル的には一切ありません。
だから、そのままだと
ログイン状態を維持できない
カートの中身を覚えておけない
「前回の設定」を引き継げない
といった問題が出ます。
そこで Cookie の出番
Cookie は、
「ブラウザに小さなメモを持っておいてもらい、
次のリクエストでもそのメモを一緒に送ってもらう」
ための仕組みです。
サーバーが「このメモを持っておいてね」とブラウザに渡し、
ブラウザは次回以降のリクエストでそのメモを自動で送り返します。
これによって、
サーバーは「このリクエストは、さっきのあの人からだ」と認識できるようになります。
Cookie のやり取りの流れ
1. サーバー → ブラウザ:Set-Cookie
まず、サーバーがレスポンスで Cookie を渡します。
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
Content-Type: text/html
<html>...</html>
HTTPSet-Cookie ヘッダーが、
「ブラウザさん、この sessionId=abc123 というメモを保存しておいてね」
という指示です。
ブラウザはこれを受け取ると、sessionId=abc123 を自分の中に保存します。
2. ブラウザ → サーバー:Cookie
次に、同じサイトにもう一度アクセスするとき、
ブラウザは自動的に Cookie を付けてリクエストを送ります。
GET /mypage HTTP/1.1
Host: example.com
Cookie: sessionId=abc123
HTTPサーバーは sessionId=abc123 を見て、
「この人は、さっきログインしたユーザーだな」と判断できます。
ポイント:
Cookie の保存と送信は、ブラウザが自動でやってくれる。
サーバーは Set-Cookie を返すだけでよい。
Cookie の典型的な使い道
1. セッション管理(ログイン状態の維持)
一番よく使われるのが「ログイン状態の維持」です。
サーバー側で「セッション」という仕組みを持ち、sessionId のようなランダムな ID を発行します。
サーバー:sessionId=abc123 を Cookie としてブラウザに渡す
サーバー内部では abc123 → ユーザーID=1 のような対応表を持つ
ブラウザ:
次回以降のリクエストで Cookie: sessionId=abc123 を送る
サーバー:abc123 を見て「これはユーザーID=1のリクエストだな」と判断
こうして、
「毎回ログイン情報を送らなくても、ログイン状態を維持できる」
ようになります。
Java(Spring)では、JSESSIONID という名前の Cookie がセッション ID としてよく使われます。
2. カート情報や簡単な設定の保存
EC サイトの「カートの中身」や、
「ダークモード ON/OFF」などの簡単な設定を Cookie に保存することもあります。
ただし、
Cookie はクライアント側で書き換え可能 なので、
「信用してはいけないデータ」として扱う必要があります。
重要な情報や改ざんされると困る情報は、サーバー側に置き、
Cookie には「キー(ID)」だけを持たせるのが基本です。
Cookie の属性(オプション)とその意味
Path / Domain:どの URL に送るか
Set-Cookie: sessionId=abc123; Path=/;
Path は「どのパスに対してこの Cookie を送るか」を指定します。Path=/ なら、そのドメイン配下のすべてのパスに対して送られます。
Domain を指定すると、サブドメインをまたいで Cookie を共有することもできますが、
セキュリティ的な影響が大きいので、初心者のうちは「そういうこともできる」程度で OK です。
HttpOnly:JavaScript から触れないようにする
HttpOnly を付けると、
ブラウザの JavaScript(document.cookie)からその Cookie にアクセスできなくなります。
これは XSS(クロスサイトスクリプティング)攻撃で
Cookie を盗まれるリスクを減らすための重要な属性です。
セッション ID などの重要な Cookie には、
基本的に HttpOnly を付けるべきです。
Secure:HTTPS 通信のときだけ送る
Secure を付けると、
HTTPS のときだけその Cookie が送られます。
これにより、
平文の HTTP 通信で Cookie が盗まれるリスクを減らせます。
本番環境では、
セッション Cookie には Secure を付けるのが基本です。
Java(Spring)での Cookie の扱い
サーバー側で Cookie を読む
Spring MVC では、@CookieValue で簡単に Cookie を受け取れます。
@GetMapping("/mypage")
public String mypage(@CookieValue(name = "sessionId", required = false) String sessionId) {
if (sessionId == null) {
return "redirect:/login";
}
// sessionId からユーザーを特定して処理...
return "mypage";
}
Javarequired = false にしておくと、
Cookie がない場合でもエラーにならず、null が入ります。
サーバー側で Cookie をセットする
レスポンスに Cookie を付けたいときは、HttpServletResponse を使います。
@PostMapping("/login")
public String login(HttpServletResponse response) {
// 認証に成功したと仮定
Cookie cookie = new Cookie("sessionId", "abc123");
cookie.setPath("/");
cookie.setHttpOnly(true);
response.addCookie(cookie);
return "redirect:/mypage";
}
Javaこれで、レスポンスに
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
が付きます。
Cookie で絶対に意識してほしいこと(重要)
1. 機密情報をそのまま入れない
パスワード
クレジットカード番号
個人情報そのもの
こういったものを Cookie に直接入れてはいけません。
Cookie はクライアント側で見えるし、書き換えもできます。
「盗まれても改ざんされても困る情報」は、サーバー側に置く。
Cookie には“キー(ID)だけ”を持たせる。
これが鉄則です。
2. 信頼せず、必ずサーバー側で検証する
Cookie の値は、ユーザーが自由に書き換えられます。
sessionId=abc123 を sessionId=hacked に変えることもできます。
だから、
「Cookie にこう書いてあるから正しいはず」とは絶対に思わないこと。
必ずサーバー側で
その ID が有効か
そのユーザーに権限があるか
をチェックする必要があります。
初心者向けまとめ:Cookie を自分の言葉で説明するなら
あなたの言葉で整理すると、こうなります。
Cookie は、
「ブラウザに小さなメモ(key=value)を保存しておいてもらい、
次回以降のリクエストで自動的に送り返してもらう仕組み」で、
ログイン状態の維持やカート情報の紐づけなどに使われる。
サーバーは Set-Cookie でメモを渡し、
ブラウザは Cookie ヘッダーでそれを返す。
Java(Spring)では @CookieValue で読み取り、HttpServletResponse#addCookie で設定できる。
ただし、Cookie はクライアント側で見えるし書き換え可能なので、
機密情報を直接入れず、あくまで「サーバー側の状態を指すキー」として使うのが安全な設計。
ここまで読んで、
「ログイン状態をどうやって維持するか」を
Cookie+サーバー側セッションの組み合わせで、自分の言葉で説明できそうなら、
もう Cookie は“謎の仕組み”じゃなくて、あなたの武器になり始めてる。
