HttpOnlyとは
HttpOnlyは、Cookieに付ける属性のひとつです。この属性が付いたCookieは、ブラウザ上のJavaScript(document.cookie)から読み取れなくなります。HTTPの通信で、サーバーとの間でやり取りされるだけになります。仕様はMDNのSet-Cookieの解説にまとめられています。
HttpOnlyが必要な理由
ログイン状態を保つセッションのCookieが盗まれると、攻撃者はその利用者になりすませます。サイトにXSSの脆弱性があると、差し込まれたスクリプトが document.cookie を読み、攻撃者のサーバーへ送信してしまうおそれがあります。HttpOnlyを付けておくと、このCookieはスクリプトから読めないため、盗難の被害を抑えられます。
Cookieの属性の違い
| 属性 | 役割 |
|---|---|
HttpOnly | JavaScriptからの読み取りを禁じる |
Secure | HTTPSの通信でだけ送る。暗号化されていない通信への流出を防ぐ |
SameSite | 他のサイトからの要求に、Cookieを付けるかを決める(Strict、Lax、None)。CSRFの対策になる |
セッションを保つCookieには、3つとも付けるのが基本です。
設定例
応答ヘッダーの例です。
Set-Cookie: sessionid=abc123; Path=/; Secure; HttpOnly; SameSite=Lax
PHPのセッションは、php.ini で指定できます。
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
PHPで自分でCookieを発行する場合は、属性を配列で渡します。
setcookie('name', 'value', [
'expires' => time() + 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
WordPressのログインに使われる認証Cookieは、標準でHttpOnlyが付いています。プラグインやテーマが独自に発行するCookieに、属性が付いているかは、別に確認が必要です。
確認方法
- ブラウザの開発者ツール(F12)で、「アプリケーション」(Application)タブの「Cookie」を開き、各Cookieの「HttpOnly」の列にチェックがあるかを見ます。
- コマンドでは、応答ヘッダーの
Set-Cookieを確認します。curl -s -D - -o /dev/null https://example.com/ | grep -i '^set-cookie'
よくある誤解
- HttpOnlyは、XSSの脆弱性を直すものではありません。スクリプトが差し込まれれば、Cookie以外の情報の取得や、利用者としての操作は行われるおそれがあります。XSSの根本の対策は、出力時のエスケープです。
- JavaScriptで読む必要のあるCookieには、HttpOnlyを付けられません。読み取りが不要なセッションのCookieに付けるのが基本です。
Webサイト セキュリティチェッカーで確認する
Webサイト セキュリティチェッカーは、URLを入力すると、サーバーが発行するCookieのうち、セッションに使われているとみられるものについて、Secure、HttpOnly、SameSiteの属性が付いているかを診断します。
関連用語
関連する用語
サイトの設定を無料で確認する
サイトのURLを入力するだけで、HttpOnly などの設定状況を診断できます。Webサイト セキュリティチェッカー「Security Checker X」は、登録なしで使えます。









