MEMO2017-05-25クッキーに関してバックエンドをNode.jsに切り替えようとしてExpress使ってexpress-sessionを使ってセッションを扱おうとしたらCookieに関するオプションがよくわからなかったのでまとめておく。サーバー側からの送信方法HTTPヘッダーにSet-Cookieを付与することによって送信出来る。httponlyパラメータに関しての説明は後述。クライアント側での取得方法サーバーから送られたCookieのデータは、document.cookieに保存されるので、単純に以下のコードで取得することが可能。document.cookie;ただ、これで取得できるのはオブジェクトではなく、fuga_cookie=hogeのような単純な文字列なので扱いづらい。cookie.js等のライブラリを使用したほうが良い。Set-Cookieの各種パラメータNAME=VALUECookieの本体、キーバリュー形式で値をクライアントに保管する。GMTみたいな感じで使用する。expiresに指定された日付までCookieが有効、超えると無効になる。cache-controlでも見たなこれ。max-age=3600みたいな感じで使用する。max-ageに指定された秒数間Cookieが有効。expiresと同時に指定された場合はmax-ageが有効になる。domain=example.comCookieが有効なドメインを指定する。現在のホストとdomainで指定された物が後方一致すればそのCookieは有効になる。domainには現在のホストと全く関係の無いものを設定しても無効になる。http://www.sd-milieu.netにアクセスがあってdomain=www.sd-milieu.netなら有効だが、domain=google.comとかは無効。そりゃ他人のドメインのCookieを操作できちゃうので当然っちゃ当然。どんな時に使うのかって言うとhttp://www.sd-milieu.netにアクセスがあった際にdomain=sd-milieu.netとして(これは有効)、http://blog.sd-milieu.netでもCookieを有効にしたりとかしたい場合に使う。同一ホスト間でCookieをやり取りしたい場合に使う。path=/Cookieが有効なパスを指定。現在のパスとpathで指定された物が前方一致すれば有効になる。path=/blogの場合、アクセスがあったURLがhttp://www.sd-milieu.net/blog/ならCookieが有効だが、http://www.sd-milieu.net/about/なら無効になる。secureこのオプションが設定されているCookieは、https通信の時のみ送信される。セッションを利用する場合は、セッションを利用するページは全てhttpsにしておきこのsecureオプションをセッションIDに付与しておかないと、http通信をしているページでもセッションIDが通信に平文で乗ってしまってMITM攻撃でセッションハイジャックされるよ、って感じなのかなと。httponlyこのオプションが付与されたCookieは、JavaScriptから参照できなくなる。XSS脆弱性があったとしても、このオプションをセッションIDに付与しておけばセッションハイジャックを防ぐことが出来る。セッションIDには付けよう。