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を使うときは、ここで紹介したような設定を理解し
適切な制限をかけて安全に使おう。