Cookie
Webサーバがブラウザに小さなデータを保存させ、条件に合う次回以降のリクエストで送り返させる仕組み。ログイン状態の維持などに使われる。Secure属性を付けたCookieは、HTTPSの通信でだけ送られる。
イマシルちゃんの解説
Webページを行き来するたびにログインし直すのは面倒だよね。
そこで使われるCookieは、ブラウザに小さなデータを保存してもらう仕組みなんだ。
サーバから受け取ったデータをブラウザが保存し、送り先などの条件に合う通信で自動的に送り返すよ。
例えば一連のやり取りを区別するセッションIDを入れておけば、サーバは届いたIDからログイン済みかを確かめられるんだ。
ページが変わってもログイン状態を保てるのは、こうした仕組みが働いているからだよ。
ログインに使うCookieが盗まれると悪用されるおそれがあるから、保護も大切なんだ。
この解説はわかりやすかったですか?
より深い解説
定義
Cookieは、RFC 6265で定められた、HTTPで状態を管理する仕組みである。サーバは、応答のSet-Cookieヘッダーで名前と値をブラウザに保存させる。ブラウザは、送り先などの条件に合う要求のCookieヘッダーで、その値を送り返す。HTTPは、もともと前のリクエストの状態を覚えない(ステートレスな)プロトコルなので、ログイン状態やショッピングカートの中身を維持するのに使われる。
(応答)Set-Cookie: SID=a8f3...; Secure; HttpOnly; SameSite=Lax; Path=/; Max-Age=3600
(以降の要求ヘッダー)Cookie: SID=a8f3...
サーバが保存を指示する段階と、ブラウザが送り返す段階ではヘッダー名が異なる。後者には通常、保存した名前と値を入れ、属性の指定をそのまま送り返すわけではない。
負荷分散で同じ転送先を選ぶ
ロードバランサは、Cookieの値を手掛かりに、同じ利用者の要求を同じ実サーバへ送れる。このように一連の通信の転送先を維持する仕組みをパーシステンスという。ロードバランサ自身が識別用の値を発行する方式や、アプリケーションの値を利用する方式がある。
同じ実サーバのメモリにログイン状態などを持つ構成では、要求のたびに転送先が変わると状態を引き継げない場合がある。Cookieで転送先を維持すると、この問題を避けやすい。ただし、実サーバの停止時に別のサーバでも状態を継続するには、セッション情報の共有などが別途必要である。
主な属性
| 属性 | 働き |
|---|---|
| Secure | URLのスキームが https のときだけ、ブラウザがCookieを送る。暗号化されていない通信で盗聴されるのを防ぐ |
| HttpOnly | JavaScriptからCookieを読み出せないようにする。XSSでCookieを盗まれるのを防ぐ |
| SameSite | ほかのサイトから送られるリクエストに、Cookieを付けるかを決める(Strict、Lax、None)。CSRFの対策になる |
| Expires、Max-Age | 有効期限。過ぎるとCookieは無効になる。指定しないと、ブラウザを閉じるまでの一時的なCookieになる |
| Domain | Cookieを送る先のドメインの範囲 |
| Path | URLのパスが、指定したパスで始まるときだけ送る |
セキュリティ上の注意
| 注意点 | 内容 |
|---|---|
| セッションIDの保護 | セッションIDを入れたCookieには、SecureとHttpOnlyを付ける |
| Domainを広げすぎない | Domainを指定すると、サブドメインにも送られる。不要なら指定しない |
| 重要な情報を入れない | Cookieの値は、利用者が見たり書き換えたりできる。パスワードなどを入れない |
プライバシーの面
ほかのサイトに埋め込まれた広告などが発行するCookie(サードパーティCookie)は、多くのサイトをまたいで利用者を追跡するのに使われてきた。このため、主要なブラウザでは、サードパーティCookieを制限する動きが進んでいる。