下記の仕様書で定義されています。
サーバは Set-Cookie ヘッダを用いて Cookie をクライアントに送信します。
Set-Cookie: foo=FOO
クライアントは次回、サーバにアクセスする際に、前回受け取った Cookie を Cookie ヘッダに指定して送信します。
Cookie: foo=FOO
Set-Cookie に name=value の形式で名前と値を指定します。
Set-Cookie: foo=FOO
name には下記の文字を使用できます。
0-9 a-z A-Z ! # $ % & ' * + - . ^ _ ` | ~
value には下記の文字を使用できます。カンマ(,)、セミコロン(;)、ダブルクォート(")、バックスラッシュ(\) は使用できません。値が任意の文字を含む場合は URLエンコーディングしたり、BASE64エンコーディングしたりします。値がイコール(=)を含むこともあるので Cookie を解析する際に単純 = で分割してしまうとデータが欠落してしまうことがあります。
0-9 a-z A-Z ! # $ % & ' ( ) * + - . / : < = > ? @ [ ] ^ _ ` { | } ~
value はダブルクォート(")で囲むこともできます。
Set-Cookie: foo="FOO"
複数の値を設定する際は Set-Cookie を複数書きます。
Set-Cookie: foo=FOO Set-Cookie: baa=BAA
デフォルトでは Cookie 情報はブラウザを閉じると消えてしまいますが、Expires 属性に未来の日時を指定することで、ブラウザを閉じてもその日時まで Cookie 情報を保持しておくことができます。日時には RFC 1123 で定義される下記の形式を指定します。
Set-Cookie: foo=FOO; Expires=Sun, 08 Sep 2024 23:59:59 GMT
Max-Age は Cookie の保持期間を秒数で指定します。Expires と Max-Age の両方が指定された場合は Max-Age が優先されます。
Set-Cookie: foo=FOO; Max-Age=3600
デフォルトでは www.example.com から受け取った Cookie は www.example.com のみに、example.com から受け取った Cookie は example.com のみに返します(完全一致)。Domain を指定すると、サブドメイン(後方一致)にも Cookie を返すようになります。例えば下記の例では example.com から取得した Cookie を www.example.com にも返すようになります。
Set-Cookie: foo=FOO; Domain=example.com
Path=/doc を指定すると /doc, /doc/aaa, /doc/bbb など /doc 配下のページに対して Cookie を送信します。/doc1 や /docs にはマッチしません。省略すると Cookie を設定したページのディレクトリ (/doc/aaa/bbb の場合は /doc/aaa) が設定されます。
Set-Cookie: foo=FOO; Path=/doc
HTTPS 通信を行っている場合のみ、Cookie を受信・送信します。HTTP 通信の時は Cookie を受け取りもせず、送信もしません。悪意の第三者に通信を傍受され、セッションハイジャックなどがおこわわれてしまうリスクを低減します。
Set-Cookie: foo=FOO; Secure
JavaScript から document.cookie へのアクセスを禁止します。HTTP通信でやり取りするのみで、JavaScript 操作ができないことから HttpOnly と名づけられています。クロスサイトスクリプティング(XSS) などの脆弱性をつかれてしまうリスクを低減します。
Set-Cookie: foo=FOO; HttpOnly
別ドメインに対して Cookie を送付する・しないを制御します。Strict は別ドメインには送付しません。None は別ドメインでも送付します。Lax は A.example.com と B.example.com や、A.example.co.jp と B.example.co.jp などで example の部分(eTLD+1)が同じであれば送付します。
Set-Cookie: foo=FOO; SameSite=Lax
クライアントが容量超過などの理由で Cookie 情報を削除する場合の保持重要度を High, Medium, Low のいずれかで指定します。
Set-Cookie: foo=FOO; Priority=High
JavaScript の document.cookie で Cookie を参照することができます。HttpOnly 属性付きの値は参照できません。
console.log(document.cookie); // foo=FOO; baa=BAA
JavaScript から Cookie を設定するには下記の様にします。
document.cookie = "foo=FOO"; document.cookie = "baa=BAA";
コンピュータ間で授受される短いトークンである「マジッククッキー(magic cookie)」とか、メッセージの入った「フォーチュンクッキー(fortune cookie)」とか、セサミストリートの「クッキーモンスター(cookie monster)」とか、「食べられる(設定される)もの」とか、「クッキーは保存食」とか、様々な説があるようです。
DevTools の [Application]-[Storage]-[Cookies] で確認することができます。
Expires属性に過去の日時を指定してください。
Set-Cookie: foo=FOO; Expres=Sat, 01 Jan 2000 00:00:00 GMT