CookieのためのHTTPヘッダーフィールド(Cookie, Set-Cookie)を理解する

httpのイメージ画像 HTTP

Cookieとは

本来webサイトを提供するサーバーは、クライアントひとりひとりを識別できない。

しかし、cookieという情報をサーバーとブラウザでやりとりすることによって、
対象ブラウザの状態を一時的に記憶し、識別しておくことが可能になる。

これによってログインし続けることができるし、
ECサイトのカートに商品を入れっぱなしにすることができる。

Cookieはkey=valueの形式で管理される。

Cookieのために用意されているヘッダーフィールドは2種類ある

  • Set-Cookie
  • Cookie

これは、サーバーとクライアントで
どちらからどちらに向かって送信するかが異なる。

Set-Cookie

サーバー→クライアントに送信するときに付与するフィールド。

クライアントに対して
「このCookieを発行したので、持っててください。
このCookieを私に送ってくれれば、あなたが誰か/どういう状態か認識できます。」
というものである。

実際にkey=valueのCookieを渡したいとき、
下記のようにしてリクエストヘッダーに付与され、サーバーから送られてくる。

set-cookie: key=value;

Cookie

クライアント→サーバーに送信するときに付与するフィールド。

サーバーに対して
「私はこのCookieを持ってますよ。
このCookieを使って私が誰で、どんな状態なのかを認識してください。」
というものである。

クライアントがkey=valueというCookieをサーバーに送信したいときは、
リクエストヘッダーに下記のように付与してリクエストを行う。

cookie: key=value;

追加で付与される属性

Cookieを発行するときは、Cookieそのもの(key=value)だけではなく、
その他の情報も一緒に付与することがほとんどである。

また、これらの情報は「サーバー→クライアント」に送信するとき
つまり、「Set-Cookie」を使うときに付与される属性である。

言い換えると、これらの属性の決定権はサーバー側にあるということである。

  • expires
  • path
  • domain
  • secure
  • HttpOnly
  • SameSite

expires属性

Cookieの有効期限を指定するもの。

未指定の場合は、ブラウザを閉じるでが有効期限となる。

ここには日付が指定され、この日時を過ぎると
ブラウザからサーバーに対してこのCookieを送信することができなくなる。

set-cookie: key=value; expires=Tue, 05 Jul 2011 07:26:31 GMT;

domain属性

Cookieが有効なドメイン名を指定するもの。

未指定の場合はCookieを生成したサーバーのドメイン名となる。

また、この属性は後方一致で適応されるため

set-cookie: key=value; domain=example.com;

と指定した場合

example.com有効
hoge.example.com有効
fuga.example.com有効
developers-book.com無効

といった具合になる。

path属性

Cookieが有効なパスを指定するもの。

Cookieを送信する範囲を特定のディレクトリに限定することができる。

未指定の場合はドキュメントと同じディレクトリ。

set-cookie: key=value; path=/; domain=example.com;

Secure属性

HTTPS通信をしている場合のみCookieを送信するようにする。

未指定の場合はHTTPSでもHTTPでもCookieを送信する。

set-cookie: key=value; secure;

と指定されている場合は、下記のようにCookieの送信が制限される。

https://example.com/サーバーにCookieを送信できる
http://example.com/サーバーにCookieを送信できない

HttpOnly属性

これが設定されている時、JavaScriptからCookieの取得を行えないようにする。

具体的にはJavaScriptの「document.cookie」でCookieを読み出すことができなくなる。

JavaScriptを利用してCookieを悪用するタイプのXSSなどに対して有効な手段の一つ。
(XSSそのものを防ぐわけではないため注意)

まとめ

元々Webサイトはステートレス(状態を持たない)なものだったが、
Cookieを活用することでユーザーの識別やショッピングカートの機能などが実現できるようになった。

一方でそれだけ重要な情報がCookieには含まれていることが多く、悪用されるリスクも高い。

Cookieを使うときは、ここで紹介したような設定を理解し
適切な制限をかけて安全に使おう。

タイトルとURLをコピーしました