あやきラボ

ソフトウェアエンジニアの生存戦略

Cookieの仕組みと正しい設定方法

この記事では、Cookieの仕組みと正しい設定方法を紹介します。

対象読者は、Cookieをなんとなく使っているが、自信を持って設定できない人です。

この記事を読めば、Cookieの仕組みと正しい設定方法がわかり、セキュリティを意識した実装ができるようになります。

実務で役立つ設定例も紹介するので、ぜひ最後までご覧ください。

Cookieとは何か

Cookieとは、Webサーバーがブラウザに保存させる小さなデータです。

HTTPはステートレスなプロトコルです。つまり、ログイン状態や言語設定といったユーザーごとの情報を、Webサーバーは保持しません。

しかし、そういったアプリケーション状態を保持したい場面は多くあります。そこでCookieが使われます。

Cookieを使ったアプリケーション状態保持の基本的な流れは以下の通りです。

Cookieを使った言語設定保持の流れ
Cookieを使った言語設定保持の流れ

ポイントは以下の通りです。

  • Set-Cookieレスポンスヘッダーを使って、Cookieを保存するようブラウザに指示する
  • Cookieリクエストヘッダーを使って、保存してあるCookieを都度Webサーバーに送信する
  • Cookieを使うからこそ、2回目のリクエスト時点で「言語設定として日本語を選択した事実」を引き継げる

Cookieはブラウザの開発ツールで確認できます。Google Chromeなら「Application」タブの「Cookies」から、現在保存されているCookieの一覧と各属性を見ることができます。一度自分の目で確認してみると理解が深まります。

Cookieの分類

Cookieは発行元、使用期間、目的によって分類できます。この分類は実務でもよく出てくるので、押さえておきましょう。

発行元については、訪問しているサイトと同じドメインから発行されたファーストパーティと、訪問しているサイトとは異なるドメインから発行されたサードパーティの2種類があります。

使用期間については、ブラウザを閉じると削除されるセッションCookieと、期限が切れるまではブラウザを閉じても残る永続Cookieの2種類があります。

目的については以下の通りです。

  • 重要機能実現: ECサイトにおけるショッピングカート機能実現のためのCookieなど
  • 環境設定: ユーザー好みの言語設定など
  • 統計: クリックしたリンクの収集など

Cookieの属性

Cookieにはいくつかの属性があり、挙動を制御できます。

Expires / Max-Age

Cookie有効期限を指定します。

Expiresは期限の日時を指定し、Max-Ageは期限までの秒数を指定します。どちらも設定されていない場合はセッションCookieになります。

Domain

Cookie送信するドメインを指定します。

たとえばDomain=example.comと設定すると、example.com自体に加えてsub.example.comなど末尾が一致するサブドメインにもCookieが送信されます。

省略すると、Cookieを発行したホストのみに送信されます。ドメインを指定した方がCookieが送信される対象が広がることに注意が必要です。

Path

Cookie送信するパスを指定します。

たとえばPath=/appと設定すると、/app以下のパスへのリクエストでのみCookieが送信されます。省略すると、Cookieを発行したパスが基準になります。

Secure

この属性がついたCookieは、HTTPS接続でのみ送信されます。

本番環境では必ずつけるべき属性です。HTTP接続でCookieが送信されると、盗聴されるリスクがあるからです。

HttpOnly

この属性がついたCookieは、JavaScriptからアクセスできなくなります

XSS攻撃でCookieを盗まれるリスクを軽減できます。特別な理由がない限りつけておきましょう。

SameSite

クロスサイトリクエスト1時にCookieを送信するかどうかを制御します。値は以下の3種類です。

  • Strict: 同一サイトからのリクエストでのみCookieを送信する。
  • Lax: 同一サイトからのリクエストに加え、外部サイトからのGETリクエスト(リンククリックなど)でも送信する。
  • None: クロスサイトリクエストでも送信する。この値を取るとき、Secure属性が必須。

CSRF対策として有効です。ブラウザによってデフォルト値が異なるため、明示的に設定することを推奨します。

特に理由がなければLaxが無難です。たとえばGoogle検索結果一覧からのサイトアクセスはクロスサイトリクエストですが、LaxならCookieが送られるので便利です。

Cookieの注意点

Cookieを使う際には、いくつかの注意点があります。

永続性がない

Cookieはユーザーがいつでも削除できますし、ブラウザの設定で無効化することもできます。

Cookieが存在することを前提とした設計は避け、Cookieがない場合の代替手段を用意しておきましょう。

データサイズの制限

1つのCookieは4KBまで、ドメインごとのCookieの数は50個まで、全部で3,000個までという目安があります。

これらを超えるとブラウザによってはCookieが削除されることもあるので、基本的には目安を守るのが得策です。

セキュリティリスク

属性を正しく設定しないと、Cookieが漏洩したり、悪用されたりするリスクが高まります。

さいごに

Cookieの仕組みと正しい設定方法について、理解していただけましたでしょうか?

まずは自分のプロジェクトのCookie設定を見直してみてください。ブラウザの開発ツールで確認して、SecureHttpOnlyなどが適切についているかチェックするだけでも価値があります。

最後までご覧いただきありがとうございました。また別の記事でお会いしましょう。


  1. クロスサイトリクエストとは、あるサイトから別のサイトへ送られるリクエストのことです。たとえば、外部サイトに埋め込まれたiframeや、別ドメインへのフォーム送信などが該当します。