사용자 정의 HTTP 헤더 : 명명 규칙


1113

일부 사용자는 Google이 전송 한 요청 의 HTTP 헤더 또는 API로부터받은 응답에 계정과 관련된 데이터를 포함 하도록 요청했습니다. 이름 지정 , 형식 등의 측면에서 사용자 정의 HTTP 헤더를 추가하는 일반적인 규칙은 무엇입니까?

또한 웹에서 우연히 발견 한 스마트 한 사용법을 자유롭게 게시하십시오. 우리는 목표로 가장 좋은 것을 사용하여 이것을 구현하려고합니다. :)


25
방화벽은 응답 헤더 필드를 제거 할 수 있습니다. 일부는 RFC 2616 (1999 년 6 월, HTTP 1.1)에 언급되지 않은 모든 것을 제거합니다. 새 필드가 없으면 클라이언트 쪽을 계속 사용할 수 있습니다.
stesch

5
HTTP S 사용시 @stesch의 주석은 적용되지 않습니다 .
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에서 기본적으로 1 위에서 HTTPS를 사용하지 않은
것처럼 보입니다

답변:


1171

권장이 되어 있었다 "X-"로 이름을 시작합니다. 예 X-Forwarded-For, X-Requested-With. 이것은 RFC 2047 의 ao section 5에도 언급되어 있습니다.


업데이트 1 : 2011 년 6 월, 비표준 헤더에 "X-"접두사 사용을 권장 하지 않는 첫 번째 IETF 초안 이 게시되었습니다 . 그 이유는 접두사가 "X-"인 비표준 헤더가 표준이 될 때 "X-"접두어를 제거하면 이전 버전과의 호환성이 손상되어 응용 프로그램 프로토콜이 두 이름을 모두 지원하게됩니다 (예 : & 는 동일 함). 그래서, 공식 추천은 단지 그들을 이름을 지정하는 것입니다 은 "X-"접두사없이.x-gzipgzip


업데이트 2 : 2012 년 6 월, "X-"접두사 사용 권장 사항이 RFC 6648 으로 공식 폐기되었습니다 . 다음은 관련성의 인용입니다.

3. 새로운 매개 변수 생성자를위한 권장 사항

...

  1. 매개 변수 이름 앞에 "X-"또는 유사한 구문을 붙여서는 안됩니다.

4. 프로토콜 디자이너를위한 권장 사항

...

  1. 접두사 "X-"또는 이와 유사한 구문이있는 매개 변수를 등록해서는 안됩니다.

  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"). 당신의 비유에 관해서는, 여기 또 다른 것이 있습니다 : 군대가 "아, 누군가를 사적으로에서 일반으로 바꾸는 것은 번거 롭습니다. 그래서 지금부터, 당신은 모든 장군입니다. 이제 우리는 많은 일을 할 필요가 없습니다"
Cole Johnson

24
@ColeJohnson 그 비유가 작동하는지 확실하지 않습니다. 여기서 문제는 이름을 변경할 수있는 중심점이 없다는 것입니다. x-gzip을 기대하는 모든 코드 스 니펫을 이제 변경해야하거나 새 헤더 외에도 이전 헤더를 계속 사용해야합니다. 그것은 6648. RFC로 이동하는 것이 바람직입니다
비 노드

4
@Vinod 예. 말이 되겠지만, 오늘날에는 결코 빛을 볼 수없는 많은 제안 된 표준이 있습니다. 파일 형식의 경우 반드시; X-접두사를 삭제하십시오 . 나는 그것에 반대하지만, 계속해라. 헤더 OTOH의 경우 떨어 뜨리지 마십시오. "표준이 아닙니다. 무시할 수 있습니다"대 "표준이 아닌 X-헤더가 있습니다. 인식 할 수없는 헤더가 있습니다. 안전하게 무시할 수 있습니까?"
Cole Johnson

21
cweekly의 대답은 불필요하게 방어 적이지만, 나는 그가 옳다고 생각하며 그의 요점은이 의견 스레드에 설명 된 문제를 해결합니다. 요컨대, 헤더가 "대학원"인지 아닌지를 식별하려고 시도하지 마십시오. 대신 개인용 또는 공용 헤더인지 확인하십시오 (응용 프로그램 별 또는 "일반"/ "전역"). 개인 헤더의 경우 X-공용 헤더와 충돌하지 않도록 선택적으로 사용 하고 (공개 헤더를 처리하는 RFC6648 덕분에) 임의의 개인 접두사를 사용해야합니다. 공개 헤더의 X-경우 어떤 상황에서도 사용하지 마십시오 .
tne December

535

질문은 다시 읽습니다. 실제 질문은 CSS 속성의 공급 업체 접두사와 유사하지 않습니다. 공급 업체 지원 및 공식 표준에 대한 미래 보장 및 사고가 적절합니다. 실제 질문은 URL 쿼리 매개 변수 이름을 선택하는 것과 유사합니다. 아무도 그들이 무엇인지 신경 써서는 안됩니다. 그러나 사용자 지정 이름을 지정하는 것은 완벽하게 유효하고 일반적이며 올바른 방법입니다.

이론적 근거 : 개발자의 경우를 제외하고 벤더, 표준 기관 또는 프로토콜과 관련이없는 사용자 정의 애플리케이션 별 헤더 ( " 계정과 관련된 데이터 ")에 대한 개발자 간의 규칙
에 관한 것입니다. 문제는 서버, 프록시 또는 클라이언트가 의도 한 다른 용도로 사용될 수있는 헤더 이름을 피하기 만하면됩니다. 이러한 이유로, "X-Gzip / Gzip"및 "X-Forwarded-For / Forwarded-For"예제는 무례합니다. 제기 된 문제는 URL 쿼리 매개 변수 이름 지정 규칙과 유사하게 개인 API 컨텍스트의 규칙에 관한 것입니다. 그것은 선호와 이름 간격의 문제입니다. "X"가없는 프록시 또는 공급 업체가 "X-ClientDataFoo"를 지원하는 것에 대한 우려

"X-"접두사에 대해서는 특별하거나 마술이 없지만 사용자 정의 헤더임을 분명히하는 데 도움이됩니다. 실제로 RFC-6648 등은 HTTP 클라이언트 및 서버 공급 업체가 접두사를 버릴 때 앱별, 개인 API, 개인 데이터, "X-"접두사 사용 사례를 강화하는 데 도움을줍니다. 전달 메커니즘은 소수의 공식 예약 헤더 이름과의 이름 공간 충돌에 대해 더욱 잘 절연되고 있습니다. 즉, 개인적 취향과 권장 사항은 한 단계 더 나아가 "X-ACME-ClientDataFoo"(위젯 회사가 "ACME"인 경우)를 수행하는 것입니다.

IMHO의 IETF 사양은 OP의 질문에 대답하기에 불충분하게 구체적으로되어 있습니다. 이는 완전히 다른 유스 케이스를 구별하지 못하기 때문입니다. 클라이언트 및 서버와의 응용 프로그램 별 문자열을 전달하는 응용 프로그램 개발자. 사양은 전자와 관련이 있습니다 (A). 여기서 질문은 (B)에 대한 규칙이 있는지 여부입니다. 있습니다. 여기에는 매개 변수를 알파벳순으로 그룹화하고 (A) 유형의 많은 표준 관련 헤더에서 분리하는 과정이 포함됩니다. "X-"또는 "X-ACME-"접두어를 사용하는 것이 편리하고 (B)에 합법적이며 (A)와 충돌하지 않습니다. (A)에 더 많은 공급 업체가 "X-"를 사용하지 않을수록 (B)가 더 명확하게 구분됩니다.

예 :
Google (다양한 표준 기관에 약간의 무게를 가짐)은 오늘 답변으로 약간 수정하여 20141102 현재 아파치 모듈의 버전을 나타내는 "X-Mod-Pagespeed"를 사용하고 있습니다 주어진 응답을 변환하는 데 관여합니다. 누구든지 Google이 "X-"없이 "Mod-Pagespeed"를 사용하거나 IETF에 축복을 요청해야한다고 제안합니까?

요약 :
앱 내에서 사용자 지정 HTTP 헤더 (쿠키 대신 때때로 적절한 대안으로)를 사용하여 서버와 데이터를주고받는 경우 이러한 헤더는 명시 적으로 사용자의 컨텍스트 외부에서 사용되지 않습니다 "X-"또는 "X-FOO-"접두어로 이름 간격을 지정하는 것이 합리적이고 일반적인 규칙입니다.


52
내 의견에 대한 어떤 다운 보더가 내 답변의 어떤 부분이 불쾌하다고 생각하는지 설명해 주시면 감사하겠습니다. 평판 점수에 대해서는 그다지 신경 쓰지 않지만 진정으로 궁금합니다. 의견 불일치는 어디에 있습니까? 감사.
cweekly

56
귀하의 답변에 전적으로 동의하며 실제 질문에 답변하는 유일한 답변입니다. 여기서는 사용자 지정 응용 프로그램 별 헤더에 대해 이야기하고 있지만 HTTP 표준에서는 표준화되지 않습니다. 사람들이 사용하는 일반적인 규칙이 있습니까? (예 : "_"를 접두사로 사용 하시겠습니까? 예 : ( "_ClientDataFoo")
Marchy

14
감사합니다 Marchy, 예, 허용 된 답변은 질문 된 내용을 다루지 않습니다. 비표준 (그러나 일반) 헤더에 대한 "X-"접두사의 IETF 지원 중단은 표준화되지 않는 사용자 지정 앱 특정 헤더와 관련이 없습니다. 귀하의 질문에 대답하기 위해, 제 의견과 경험 (16 년 동안의 webdev)에서 가장 좋은 규칙은 위에서 언급 한 "X-ACME-ClientData"를 사용하는 것입니다. "X-"bc 표준이 아닙니다 (IETF 지원 중단이 여기에없는 이유도 아닙니다), "ACME-"를 "ACME"회사 또는 특정 앱에 네임 스페이스로 지정하고 "ClientData"는 무엇이든 가능합니다. 당신이 좋아하는 의미 론적 이름. :)
cweekly February

5
@DarrelMiller ... 따라서 X-ACMECO-WIDGET-FOO를 사용하는 것이 좋습니다. 필자는 OP의 질문에 따라 X-의 사용은 RFC-6648 등에 의해 단순히 반대되는 것이 아니라고 주장한다. 다른 사람들의 프로젝트에서 사용하기 위해 프레임 워크, 라이브러리 또는 모듈을 제공하는 공급 업체 인 경우에는 다른 이야기이며, 반드시 RFC를 T에 따르십시오. 앱별 헤더 이름 지정 규칙은 사실상 완전히 개인 API입니다. 그들은 "다른 사람의 이름"과 어떻게 충돌할까요? 그것들은 누구입니까?
cweekly

11
솔직히 RFC 추론을 이해하는 데 약간의 어려움이 있습니다. 매개 변수가 표준화 된 경우 x 및 x가 아닌 버전이 모두있을 것입니다. x 및 x가 아닌 버전의 동작이 동일한 경우에만 문제가됩니다. API를 "대신"헤더를 추가하려고하므로 여기에서 우연히 발견되었습니다. 언젠가는 공용이 될 수 있습니다 (일반적인 유스 케이스이므로). "대신"을 사용하고 언젠가이를 표준 헤더로 추가하면 내 의미가 표준화 된 것과 동일 할 확률은 무엇입니까?
fool4jesus 2016

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>

이 정의는 토큰과 TEXT의 두 가지 주요 기둥에 있습니다. 둘 다 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].

두 가지 결론이 있습니다. 첫째, 헤더 이름 은 영숫자, 문장 부호 등 ASCII 문자의 하위 집합으로 구성되어야한다는 것이 분명합니다 . 둘째, 헤더 의 정의에는 아무것도 없습니다 을 할 때 ASCII로 제한하거나 8 비트 문자를 제외 . 제어 문자 만 금지 된 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 옥텟으로 제한해야합니다."라고 말합니다.
Robert Tupelo-Schneck

23

RFC6648 은 사용자 정의 헤더가 "다중 구현에서 표준화, 공개, 공통 배치 또는 사용 가능"할 것이라고 가정합니다. 따라서 접두사 "X-"또는 유사한 구문을 사용하지 않는 것이 좋습니다.

그러나 "[헤더]가 표준화 될 가능성이 극히 적은 경우"는 예외입니다. 이러한 "구현 별 및 개인용"헤더의 경우 RFC는 공급 업체 접두사와 같은 네임 스페이스가 정당하다고 말합니다.


6
"RFC6648은 사용자 정의 헤더가"표준화, 공개, 공통 배치 또는 여러 구현에서 사용 가능하게 될 수있다 "고 가정합니다. X-접두어가없는 것이 표준화 될 가능성이 있기 때문에 접두어 를 사용해야하는 이유가 있습니다 .
Konrad

@Konrad 다른 사람의 비슷한 헤더 (헤더가 아닌)가 표준화 되었다고 가정 하면와의 충돌을 피할 수 X-있지만 RFC6648이 주로 취하는 것과는 다른 가정입니다. RFC의 예외는 향후 표준 헤더와 회사 합병 등을 통해 기술이 통합 될 수있는 다른 공급 업체의 헤더 간의 잠재적 충돌을 설명합니다. 따라서 예외로 인해 공급 업체 접두사가 필요합니다.
Edward Brey

17

추가 HTTP 헤더를 추가 하거나 수정하면 더 좋은 코드 디버깅 도구입니다.

URL 요청이 경로 재 지정 또는 이미지를 리턴 할 때 디버그 코드의 결과를 브라우저에 표시되지 않는 html "페이지"가 ​​없습니다.

한 가지 방법은 데이터를 로컬 로그 파일에 쓰고 나중에 해당 파일을 보는 것입니다. 또 다른 방법은 디버깅중인 데이터 및 변수를 반영하는 HTTP 헤더를 임시로 추가하는 것입니다.

나는 정기적으로 X-fubar-somevar : 또는 X-testing-someresult :와 같은 추가 HTTP 헤더를 추가하여 문제를 테스트하고 추적하기가 매우 어려운 많은 버그를 발견했습니다.


2
왜이 "표준"을 사용해야합니까? 헤더는 동일하게 작동합니다. "WHO_EVER_READS_THIS_IS_DUMB_"접두사로도
놀라운 1 월

16

헤더 필드 이름 레지스트리는 RFC3864에 정의되어 있으며 "X-"에는 특별한 것이 없습니다.

내가 알 수있는 한, 개인 헤더에 대한 지침은 없습니다. 의심, 그들을 피하십시오. 또는 HTTP Extension Framework ( RFC 2774 )를 살펴보십시오 .

더 많은 사용 사례를 이해하는 것이 흥미로울 것입니다. 왜 메시지 본문에 정보를 추가 할 수 없습니까?


13
내가 일부 사용자 지정 헤더를 고려하는 주된 이유는 본문을 파싱하지 않고도 라우팅 결정을 내릴 수 있기 때문입니다.
Rozwel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.