カスタムHTTPヘッダー:命名規則


1114

何人かのユーザーから、自分のアカウントに関連するデータを、私たちが送信するリクエストのHTTPヘッダー、またはAPIから受け取るレスポンスに含めるように依頼されました。名前付け形式などに関して、カスタムHTTPヘッダーを追加するための一般的な規則は何ですか?

また、あなたが偶然見つけたこれらのスマートな使用法をウェブに投稿してください。私たちはこれをターゲットとして最善のものを使用してこれを実装しようとしています:)


25
ファイアウォールは応答ヘッダーフィールドを削除できることに注意してください。RFC 2616(1999年6月、HTTP 1.1)で言及されていないものをすべて削除する人もいます。クライアント側は、新しいフィールドがなくても使用できるはずです。
stesch

5
@steschによるコメントは、HTTP Sを使用する場合には適用されないことに注意してください。
code_dredd

1
@code_dreddによるコメントは都市の伝説であることに注意してください。ファイアウォールはHTTPSコンテンツをフィルタリングできます。参照howtoforge.com/filtering-https-traffic-with-squidwatchguard.com/help/docs/wsm/xtm_11/en-us/content/en-us/...
stesch

@steschあなたの記事が基本的にプロキシをMiTMのようなものに変えると仮定すると(暗号化されたクライアント接続を取得してから新しい接続を作成します)、ほとんど何でもできますが、その事実はプロキシのPoVからの暗号化を無効にしますb / cクライアントのコンテンツ自体を復号化しています。その場合、プロキシのPoVからは、基本的にはそもそもHTTPSを使用していないかのようです...
code_dredd

回答:


1171

推奨はされて いた「X-」で自分の名前を開始します。例えばX-Forwarded-ForX-Requested-With。これはRFC 2047のセクション5でも言及されています


アップデート1:2011年6月、非標準ヘッダーに「X-」プレフィックスを使用することの推奨廃止するために、最初のIETFドラフトが投稿されました。その理由は、「X-」で始まる非標準ヘッダーが標準になると、「X-」プレフィックスを削除すると下位互換性が失われ、アプリケーションプロトコルが両方の名前をサポートするように強制されるためです(たとえば、x-gzipgzipは同等になりました)。したがって、正式な推奨事項は、「X-」プレフィックスを付けずに、適切に名前を付けることです。


更新2:2012年6月、「X-」プレフィックスを使用することの推奨の廃止はRFC 6648として公式になりました。以下は関連性のある引用です。

3.新しいパラメーターの作成者への推奨事項

...

  1. パラメータ名の前に「X-」または同様の構成体を付けないでください。

4.プロトコル設計者への提言

...

  1. "X-"プレフィックスまたは同様の構造を持つパラメータの登録を禁止する必要があります(SHOULD NOT)。

  2. 「X-」接頭辞または同様の構造を持つパラメータは、標準化されていないものとして理解する必要があることを規定してはなりません。

  3. 「X-」接頭辞または同様の構成のないパラメータは、標準化されたものとして理解する必要があることを規定してはなりません。

「SHOULD NOT」(「非推奨」)は「MUST NOT」(「禁止」)と同じではないことに注意してください。これらのキーワードの別の仕様については、RFC 2119も参照してください。言い換えれば、「X-」プレフィックス付きヘッダーを引き続き使用できますが、公式には推奨されておらず、パブリック標準であるかのようにドキュメント化することはできません。


まとめ

  • 公式の推奨事項は、「X-」接頭辞なしで、それらを適切に名前を付けることです。
  • "X-"プレフィックス付きヘッダーを引き続き使用できますが、公式には推奨されておらず、パブリック標準であるかのようにドキュメント化することはできません。

306
プロのアスリートになることのない子供がたくさんいるように、カスタムヘッダーの多くが標準になることはありません。私はそれらの "X-"を保持する傾向があります。
G-Mac

19
@ G-Mac同意。非常に多くのカスタムヘッダーがあり、標準化されることはありません。そのいくつかは、コードをからif (header == "x-gzip")に編集するだけで簡単if (header == "x-gzip" || header == "gzip")です。アナロジーについては、別の例を挙げましょう。「ああ、誰かをプライベートからジェネラルに変更するのは面倒です。これからは、あなたはみんなジェネラルです。今はそれほど多くの作業を行う必要はありません」
コールジョンソン

24
@ColeJohnsonその類推が機能するかどうかはわかりません。ここでの問題は、名前を変更できる中心点がないことです。x-gzipを必要とするすべてのコードスニペットを変更するか、新しいヘッダーに加えて古いヘッダーを引き続き使用する必要があります。これは、RFC 6648.で行くことが望ましいです
あるVinod

4
@Vinodはい。それは理にかなっていますが、一日の明かりを見ることは決してないような多くの提案された標準があります。ファイルの種類については、必ず。X-接頭辞を削除します。反対ですが、先に進んでください。ヘッダーOTOHの場合、ドロップしないでください。それは、「ああ、それは非標準です。無視できます」と「それらの非標準X-ヘッダーがあり、それから私が認識しないものがあるので、安全に無視できますか?」
Cole Johnson

21
cweeklyの答えのトーンは不必要に防御的ですが、私は彼が正しいと信じており、彼のポイントはこのコメントスレッドに示されている問題を解決します。つまり、ヘッダーが「卒業」するかどうかを識別しないでください。代わりに、それがプライベートヘッダーかパブリックヘッダー(アプリケーション固有または「汎用」/「グローバル」)かを判別します。プライベートヘッダーの場合は、オプションX-でパブリックヘッダーとの衝突がないことを確認するために使用し(パブリックヘッダーを処理するRFC6648のおかげです)、さらに任意のプライベートプレフィックスを確実に使用します。パブリックヘッダーでは、X-いかなる状況でも使用しないでください。
2014

535

質問は再読に耐えます。尋ねられる実際の質問は、CSSプロパティのベンダープレフィックスとは異なります。CSSプロパティでは、ベンダーサポートと公式の標準について将来の保証と考えが適切です。実際に尋ねられる質問は、URLクエリパラメータ名を選択することに似ています。誰も彼らが何であるか気にすべきではありません。しかし、カスタムのものを名前空間で区切ることは、完全に有効であり、一般的で正しいことです。

理論的根拠:カスタムのアプリケーション固有のヘッダー(「アカウントに関連するデータ」)の開発者間の規約
に関するものであり、ベンダー、標準化団体、またはサードパーティによって実装されるプロトコルとは何の関係もありません。問題は、サーバー、プロキシ、またはクライアントによる他の使用目的を持つ可能性のあるヘッダー名を回避することだけです。このため、「X-Gzip / Gzip」および「X-Forwarded-For / Forwarded-For」の例は参考になりません。提起された質問は、URLクエリパラメータの命名規則に似た、プライベートAPIのコンテキストにおける規則に関するものです。それは好みと名前の間隔の問題です。「X」のないプロキシまたはベンダーによって「X-ClientDataFoo」がサポートされていることに関する懸念

「X-」プレフィックスについて特別なまたは魔法のようなものはありませんが、カスタムヘッダーであることを明確にするのに役立ちます。実際、RFC-6648などは、「X-」プレフィックスの使用のケースを強化するのに役立ちます。これは、HTTPクライアントおよびサーバーのベンダーがプレフィックスを放棄するため、アプリ固有のプライベートAPI、個人データ通過メカニズムは、少数の公式の予約済みヘッダー名との名前空間の衝突に対してさらに適切に絶縁されています。そうは言っても、私の個人的な好みと推奨事項は、さらに一歩進んで、たとえば「X-ACME-ClientDataFoo」を実行することです(ウィジェット会社が「ACME」の場合)。

私見IETF仕様は、OPの質問に答えるには十分に具体的ではありません。それは、完全に異なるユースケースを区別できないためです。アプリ開発者がアプリ固有の文字列をクライアントとサーバー間でやり取りします。仕様は前者(A)にのみ関係します。ここでの問題は、(B)の規約があるかどうかです。がある。それらには、パラメーターをアルファベット順にグループ化し、タイプ(A)の多くの標準関連ヘッダーからそれらを分離することが含まれます。「X-」または「X-ACME-」接頭辞の使用は、(B)にとって便利で正当であり、(A)と競合しません。(A)の「X-」の使用をやめるベンダーが増えるほど、(B)のベンダーはより明確になります。

例:
Google(さまざまな標準化団体で少々の重みを持っている)は-今日、私の回答のこのわずかな編集で20141102-現在、 "X-Mod-Pagespeed"を使用してApacheモジュールのバージョンを示しています。特定の応答の変換に関与します。Googleが「X-」なしで「Mod-Pagespeed」を使用すること、および/またはIETFにその使用を祝福するように依頼することを本当に提案している人はいますか?

概要:
アプリ内でカスタムHTTPヘッダーを(Cookieの適切な代替手段として)使用してサーバーとの間でデータをやり取りしている場合、これらのヘッダーは明示的に、あなたのコンテキスト以外で使用することを意図していませんアプリケーションでは、「X-」または「X-FOO-」接頭辞を付けて名前をスペースで区切るのが合理的で一般的な規則です。


52
私のコメントの反対投票者が私の回答のどの部分が不愉快だと思うかを説明できれば幸いです。私の評判スコアはそれほど気になりませんが、本当に興味があります。不一致はどこにありますか?ありがとう。
cweekly 2013年

56
私はあなたの答えに完全に同意します。そして、それがここで尋ねられた実際の質問に答える唯一の答えです。ここでは、アプリケーション固有のカスタムヘッダーについて話していますが、HTTP標準で標準化されることはありません。人々が使いやすいこれらの共通の慣習はありますか?(たとえば、「_」を前に付けるなどですか?ie:( "_ClientDataFoo")
Marchy

14
マルキーに感謝します、ええ、受け入れられた答えは尋ねられた質問に対応していません。非標準(汎用)ヘッダーの「X-」プレフィックスのIETFの廃止は、標準化されることのないカスタムアプリ固有のヘッダーとは無関係です。あなたの質問に答えるために、私の意見と経験(webdevの16年)では、最善の慣習は前述の「X-ACME-ClientData」を使用することです。"X-" bc標準ではありません(これもありません。IETFの非推奨がここで無効になっているのはこのためです)、 "ACME-"で名前空間を "ACME"会社または特定のアプリに指定し、 "ClientData"は何でもかまいません。あなたが好きな意味の名前。:)
cweekly

5
@DarrelMiller ...したがって、X-ACMECO-WIDGET-FOOを使用することをお勧めします。OPの質問に対しては、X-の使用はRFC-6648やそれに類するものによって単に禁忌ではない、と私は主張します。あなたが他の人々のプロジェクトで使用するためのフレームワーク、ライブラリ、またはモジュールを提供しているベンダーである場合、それは別の話であり、必ずそのRFCをTに準拠させます。アプリ固有のヘッダー命名規則は、事実上完全にプライベートなAPIです。彼らはどのようにして「みんなの」名前と衝突しますか?それらは誰でしょうか?
cweekly

11
正直なところ、RFCの推論を理解するのに少し問題があります。もちろん、パラメーターが標準化されている場合は、xバージョンと非xバージョンの両方が存在します。これは、xバージョンと非xバージョンの動作が同じ場合にのみ問題になります。APIに「代理」ヘッダーを追加しようとしているため、ここで偶然見つけました。いつか公開される可能性があります(一般的なユースケースであるため)。「On-Behalf-Of」を使用し、いつか標準ヘッダーとして追加する場合、私のセマンティクスが標準化されたものと同じになる確率はどれくらいですか?
fool4jesus 2015

62

HTTPヘッダーの形式は、HTTP仕様で定義されています。仕様がRFC 2616であるHTTP 1.1について説明します。セクション4.2、「メッセージヘッダー」では、ヘッダーの一般的な構造が定義されています。

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

この定義は、トークンとテキストという2つの主要な柱に基づいています。どちらもセクション2.2、「基本ルール」で定義されています。トークンは:

   token          = 1*<any CHAR except CTLs or separators>

次に、CHAR、CTL、およびセパレーターで休憩します。

   CHAR           = <any US-ASCII character (octets 0 - 127)>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

テキストは:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

LWSは線形空白であり、その定義は再現しません。OCTETは次のとおりです。

   OCTET          = <any 8-bit sequence of data>

定義に注意書きがあります:

The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].

つまり、2つの結論です。まず、ヘッダーはASCII文字のサブセットから構成される必要があることは明らかです。次に、ASCIIに制限したり、8ビット文字を除外したりするヘッダー値の定義には何もありません。これは、オクテットで明示的に構成され、制御文字のみが禁止されています(CRとLFは制御と見なされることに注意してください)。さらに、TEXTプロダクションに関するコメントは、オクテットがISO-8859-1であると解釈されること、およびそのエンコーディングの外の文字を表すためのエンコーディングメカニズム(偶然にも恐ろしい)があることを示唆しています。

したがって、特に@BalusCに応答するには、仕様に従って、ヘッダー値がISO-8859-1にあることは非常に明確です。私はTomcatからヘッダーに8859-1の高文字(具体的にはフランス語で使用されるアクセント付き母音)を送信し、Firefoxで正しく解釈させたので、これは実際にも理論上もある程度機能します(これはURLを含むLocationヘッダーでしたが、これらの文字はURLでは正しくありません。そのため、これは実際には違法でしたが、別の規則でした!)。

そうは言っても、すべてのサーバー、プロキシ、およびクライアントで動作するISO-8859-1には依存しないので、防御的プログラミングの問題としてASCIIを使用します。


3
新しいHTTP仕様RFC7230では、「新しく定義されたヘッダーフィールドは、フィールド値をUS-ASCIIオクテットに制限する必要があります(SHOULD)」。
Robert Tupelo-Schneck 2015年

23

RFC6648では、カスタムヘッダーが「標準化され、公開され、一般的に展開されるか、複数の実装で使用できるようになる」と想定することをお勧めします。したがって、「X-」または同様の構成要素をプレフィックスとして付けないことをお勧めします。

ただし、「[ヘッダー]が標準化される可能性が非常に低い場合」という例外があります。そのような「実装固有および私用」ヘッダーについては、RFCはベンダープレフィックスなどの名前空間は正当化されると述べています。


6
。標準化され、国民は、一般的に展開され、または複数の実装間で使用可能になるかもしれない『私は、これが使用する理由与え考える「RFC6648は、カスタムヘッダがあることを前提とすることをお勧めします』X-。それは任意の接頭辞なし何かが標準化さになるかもしれない可能性が高いですので、接頭辞を
コンラート

@Konrad 他の誰かの類似したヘッダー(ヘッダーではない)が標準化さX-れると想定すると、との競合を回避できますが、これはRFC6648が主に取るものとは異なる仮定です。RFCの例外は、将来の標準ヘッダーと、会社の合併などによってテクノロジーが統合される可能性のある別のベンダーのヘッダーとの間の潜在的な競合を考慮しています。そのため、例外にはベンダープレフィックスが必要です。
エドワードブレイ

17

HTTPヘッダーを変更する、より正確には、追加することは、他に何もなければ、優れたコードデバッグツールです。

URLリクエストがリダイレクトまたは画像を返す場合、デバッグコードの結果を一時的に書き込むhtml "ページ"はありません-少なくともブラウザに表示されるものはありません。

1つの方法は、データをローカルログファイルに書き込み、そのファイルを後で表示することです。もう1つは、デバッグされるデータと変数を反映するHTTPヘッダーを一時的に追加することです。

X-fubar-somevar:やX-testing-someresult:のような追加のHTTPヘッダーを定期的に追加して、テストを行います。そうでなければ、追跡が非常に困難であった多くのバグを発見しました。


2
なぜ彼はこの「標準」を使うべきなのでしょうか?ヘッダーは同じように機能します。"WHO_EVER_READS_THIS_IS_DUMB_"プレフィックスがあっても...
信じられないほどのJan

16

ヘッダーフィールド名レジストリはRFC3864で定義されており、「X-」には特別なものはありません。

私の知る限り、プライベートヘッダーのガイドラインはありません。疑わしい場合は避けてください。または、HTTP拡張フレームワーク(RFC 2774)をご覧ください

ユースケースをさらに理解することは興味深いでしょう。なぜメッセージ本文に情報を追加できないのですか?


13
カスタムヘッダーを検討している主な理由は、本文を解析せずにルーティングを決定できるようにするためです...
Rozwel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.