Cookieとは

くっきー

Webサーバが Set-Cookie ヘッダでブラウザに保存させる、名前と値の組の小さなデータ。ブラウザは、以後の同じサイトへのリクエストに Cookie ヘッダで自動的に付けて送る。ステートレスなHTTPでログインの状態を保つため、セッションIDを入れて使うことが多い。Secure(HTTPSのときだけ送る)、HttpOnly(スクリプトから読めなくする)、SameSite(ほかのサイトから始まったリクエストに付けるか)、Expires・Max-Age(有効期限)などの属性で扱いを指定する。

「Cookie」は、2分野の6問の練習問題に出てきます(Web技術の基礎, 情報セキュリティの基礎など)。

この用語の分野: Web技術の基礎

仕組み

サーバは応答に「Set-Cookie: sid=…」のようなヘッダを付け、ブラウザはこれを保存します。その後、ブラウザは同じサイト(Domain と Path の属性で決まる範囲)へのリクエストに「Cookie: sid=…」を自動で付けて送ります。サーバは、受け取ったセッションIDを手がかりに、サーバの側に保存した利用者の情報を探します。有効期限を指定しないCookieは、一般にブラウザを閉じると消えます。

安全のための属性

Secure を付けると、HTTPSの通信のときだけ送られ、盗聴で値を知られることを防げます。HttpOnly を付けると、ページのJavaScriptから読めなくなり、XSSでセッションIDを盗まれる被害を減らせます。SameSite は、ほかのサイトから始まったリクエストにCookieを付けるかを Strict、Lax、None で指定するもので、利用者の意図しないリクエストを送らせる攻撃への対策の1つになります。

localStorageとの違い

localStorageもブラウザにデータを保存する仕組みですが、リクエストに自動では付かず、JavaScriptから読み書きして使います。Cookieは1つあたり一般に約4 KBまでと小さく、対象のサイトへのリクエストのたびに付いて送られるので、大きなデータを入れると通信が増えます。セッションIDのような認証の情報は、スクリプトから読めないHttpOnlyのCookieに入れるのが一般的です。

Cookieの練習問題に挑戦

ブラウザのlocalStorageとCookieの違いとして、正しいものはどれか。

  1. AlocalStorageのデータはリクエストに自動では付かず、同じオリジンのページのJavaScriptから読み書きして使う
  2. BlocalStorageのデータも、Cookieと同じように、同じサイトへのリクエストのたびにヘッダに入れられ、自動でサーバへ送られる
  3. ClocalStorageにもHttpOnly属性を付けられるので、セッションIDを置いても、ページのスクリプトからは読み取れない
答えと解説を見る

正解:A. localStorageのデータはリクエストに自動では付かず、同じオリジンのページのJavaScriptから読み書きして使う

localStorageは、オリジンごとにキーと値の文字列を保存するブラウザの記憶場所で、有効期限を決める仕組みはなく、一般に消すまで残ります。サーバへは自動では送られないので、送りたいときはJavaScriptでリクエストに入れます。Cookieは1つあたり一般に約4 KBまでと小さく、リクエストのたびに自動で送られるのに対し、localStorageにはより大きなデータを置けます。ただし、ページのJavaScriptからはいつでも読めるので、XSSがあると中身を盗まれます。認証に使う値を置くときは、この危険を考える必要があります。

よくある質問

Cookieを無効にするとどうなりますか?

セッションIDを受け渡せなくなるので、多くのサイトでログインの状態を保てなくなります。ショッピングカートの中身や表示の設定のように、Cookieで覚えている情報も保たれません。

サードパーティCookieとは何ですか?

いま見ているページとは別のサイト(広告を配信するサイトなど)が設定するCookieです。複数のサイトにまたがって利用者の行動を追跡するのに使われてきたため、プライバシーを守るために、既定で送らない、あるいは制限するブラウザがあります。

解説の中の「Cookie」

「Cookie」が出てくる問題(6問)

  1. 上のヘッダで設定されたCookieについての説明として、正しいものはどれか。
  2. ブラウザのlocalStorageとCookieの違いとして、正しいものはどれか。
  3. HTTPはステートレスなプロトコルである。このことと、Webサイトでログインした状態を保つ一般的な方法の説明として、正しいものはどれか。
  4. 掲示板のWebアプリケーションで、利用者が投稿した文章の中のスクリプトが、ほかの閲覧者のブラウザで実行されてしまう脆弱性があった。この脆弱性の名前と、根本的な対策の組み合わせとして正しいものはどれか。
  5. Webアプリケーションで、ログインしたままの利用者が攻撃者の用意した罠のページを開くと、利用者のブラウザから正規のサイトへ、利用者の意図しない送金や設定の変更のリクエストが送られてしまう脆弱性がある。この脆弱性への対策として適切なものはどれか。
  6. Webアプリケーションで、ログインの前と後で同じセッションIDを使い続けていると、攻撃者があらかじめ用意したセッションIDを利用者に使わせ、利用者がログインした後にそのIDで利用者になりすますおそれがある。この攻撃への対策として最も適切なものはどれか。

Web技術の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

クロスサイトスクリプティング(XSS) HTTP イベントループ WebSocket HTTPステータスコード HTTPメソッド OAuth CORS(オリジン間リソース共有) サーバサイドレンダリング(SSR) JSON

用語集の一覧へ