Webkitの要素の検証でCookieをいじっていると、見慣れないカラムに気づきました。気になったので調べました。
HTTP というカラムにチェックボックスが入っています。
ブラウザの要素の検証でCookieを見ると、左から
name , value, domain , path, expires , size ,http , secure
と並んでいます。
(cookie)
expires は期限
path/domain はオリジンの指定
secure は HTTPSだけで使われるCookie 、
http は? secure の逆??だとすると secure / http の両方のチェックが説明できないし、わざわざカラムにして表示しない。
だとすると、なんなのか?
http のチェックはなにか?
HTTP 通信ヘッダのみで使われるCookie
という意味になります。
わかりやすくいえば
JavaScript からはアクセス出来ないCookie
ということになります。
どういうことか?
実際に、JavaScriptでCookieにアクセスしてみる*1
JS で取得できたCookie
document.cookie.split(";").map(function(e,i){ e=e.split(/=/);return e[0]}) ["AFIKOW3730X428_ID", " SelectPlaza-VS37-Cookie", " __utmx", " __utmxx", " Aeon-VS24-Cookie", " __utma", " __utmc", " __utmz", " style", " Aeon-SSLVS14-Cookie" ] Cookie値がちゃんとアクセス出来ない。
http のチェックが入っていると、JSで読めない。
これは、JavascriptやXSS脆弱性があっても、Cookieを盗めないようにしたいのが目的です。
httponly にしておけば任意のJSの実効性があったとしてもセッションを乗っ取られる可能性は下がる。
*2
実際に使えるかも?
Cookeのアクセス制御をしてもXHRなどでCookieを見られるおそれがあるかも?
AjaxのgetAllResponseHeaders()でCookieにアクセス出来るから利用箇所は制限されると予想した。
しかし、XHRのレスポンスにset-cookieが出てこなかった
http-only意外と使えるかもしれない。
名前がイケてない?
http-only という名前がイケてない。http-only は 非secureを連想させてしまう。
追記
ググってると、document.cookieとhttp-onlyは10年近く前の記事が多く、ブラウザの差異で使えない。などと書かれてた
その情報は古いので、いまはむしろ使えると考えることにした。
いまでは差異を考える必要性が下がったので積極的に使うべきなのでしょう。
Ajaxのレスポンスヘッダへのアクセスでも取得できるのは脆弱性として報告があったので。
そこはもはや対策済みで読み取れないと考えてイイ。
以上から、http-onlyは活用していい