それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

httpOnlyなCookieとは?

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

ということになります。

どういうことか?

実際に、JavaScriptCookieにアクセスしてみる*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値がちゃんとアクセス出来ない。

ブラウザに実際に入っているCookie

(aeonクッキーリスト)

document.cookie と比べて違うことが分かる。

http のチェックが入っていると、JSで読めない。

これは、JavascriptXSS脆弱性があっても、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は活用していい

*1:この場合はサイトJSなので、Extensionの場合どうなるかは知らない。

*2:もちろん、通信の中身をキャプチャリングされてしまえば抜けますが