Firefoxの開発者ツールが「生ヘッダ」を見せてくれない件について

August 25, 2017

重複するとまずそうなレスポンスヘッダが重複したときの各ブラウザの挙動を見ていたらFirefoxの不思議な仕様に気づいた。特段問題のある挙動というわけでもないのだが、ブログをGitHub Pagesに移したついでにテスト記事代わりに書き残しておく。

はじめに

HTTPヘッダの重複について

今回は細かくRFCとかを漁っていくことはしないがHTTP/1.1自体の仕様ではHTTPリクエスト/レスポンスヘッダの重複に関しては特に既定の動作というのは決まっていない。(認識違ってたら優しくマサカリ投げてください。)
そのため、同一名称のヘッダフィールドが重複した場合の挙動は各プロダクトの実装に依存するという状況になっている。

自分では検証したことはないのだが『めんどうくさいWebセキュリティ』ではWebブラウザの場合は先勝ちと後勝ちで半々に分かれると述べられていたと記憶している。

ほんとに重複についての規定はないの?

HTTP/1.1としてはヘッダフィールドの重複について特に既定の動作が決められてはいないものの、例えばContent-Security-Policyがそれぞれに食い違った内容で重複していると困るよね、という話はあって、HTTPヘッダを利用する各個別の仕様側でヘッダの重複について言及されている場合がある。

例えば今述べたCSPもそうだし(※1)、Cache-Controlヘッダなどについても重複する指示がある際のキャッシュの取り扱いについて定められている(※2)。

今回確認する環境

PHPで重複ヘッダを応答するページを作った。このページにFirefoxとChromeでアクセスし、開発者ツールでHTTPレスポンスヘッダを確認していく(※3)。IEとかEdgeとかは見ていない。気が向いたら見る。

<?php
  header('X-Test-Header: ' . 'AAAAA', false);
  header('X-Test-Header: ' . 'AAAAA', false);
  header('X-Test-Header: ' . 'BBBBB', false);
?>
<!DOCTYPE html>

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Duplicated headers test</title>
</head>
<body>
  <h1>Duplicated headers test</h1>
</body>
</html>

今回の事象

curlで「生ヘッダ」を確認する

何はともあれ確実に「生」で見えるであろうcurlでHTTPレスポンスヘッダを確認する。想定通りX-Test-Headerが重複し、それぞれ異なる値が設定されている。

yagihash:$ curl -X GET -I http://sqli.moe/fx-rawheaders/
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 24 Aug 2017 17:15:29 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 173
Connection: keep-alive
X-Test-Header: AAAAA
X-Test-Header: AAAAA
X-Test-Header: BBBBB

Chromeの場合

Chromeの場合はパースビューでもすでにきちんと重複ヘッダが別々に表示されている。

chrome1

一応view sourceから生の(はずの)ヘッダを表示してみても、きちんと別々に表示されている。

chrome2

Firefoxの場合

Firefoxの場合はパースビューの時点では複数のヘッダがまとめて表示されており、ヘッダが重複していることがわかりにくい。

firefox1

じゃあ元々はどうなっていたの?ということで生ヘッダをクリックして重複しているかどうかを見ようとしても、やっぱり1行にまとめられてしまっているので判別できない。

firefox2

まとめ

別にどうってことはない話なのだが、なんとなく腑に落ちないというか、”生ヘッダ”とは…となる挙動に出会ったので記録に残しておきましたとさ。この手の検証をする際は気をつけましょう。


※1 https://www.w3.org/TR/CSP/#csp-header

※2 https://tools.ietf.org/html/rfc7234#section-4.2.1

※3 確認はmacOS Sierra(10.12.6)上のGoogle Chrome 60.0.3112.101、Firefox 55.0.2でおこなった。