nginx에는 유효하지 않은 헤더를 버리고 전달하는 옵션이 있다.
유효하지 않은 헤더명을 가진 필드를 무시할 것인지에 대한 설정.
on
(무시)on
, off
underscores_in_headers
에 따라 달라진다.)유효한 헤더의 조건으로, 언더스코어를 허용할 것인지에 대한 설정.
off
(허용하지 않음)on
, off
짜잔~
underscores_in_headers: off
설정으로 인해 언더스코어를 포함한 헤더명은 invalid 해지고,ignore_invalid_headers: on
설정으로 인해 그 invalid 한 헤더는 무시되었습니다!오. 비슷한 내용이 있다. RFC9110 문서를 살펴보자.
- Fields
HTTP uses "fields" to provide data in the form of extensible name/value pairs with a registered key namespace.
6.3. Header Fields
Fields (Section 5) that are sent or received before the content are referred to as "header fields" (or just "headers", colloquially).
즉, 우리가 쓰는 헤더는 HTTP의 "필드" 종류 중 하나다. 그리고 그 필드의 이름에 대한 규약은 다음과 같다.
16.3.2.1. Considerations for New Field Names
(...) While the field-name syntax is defined to allow any token character, in practice some implementations place limits on the characters they accept in field-names. To be interoperable, new field names SHOULD constrain themselves to alphanumeric characters, "-", and ".", and SHOULD begin with a letter. For example, the underscore ("_") character can be problematic when passed through non-HTTP gateway interfaces (see Section 17.10).
my-custom-header
필드는 HTTP_MY_CUSTOM_HEADER
라는 필드가 된다.17.10. Application Handling of Field Names
For example, the Common Gateway Interface (CGI) mapping of protocol-specific meta-variables, defined by Section 4.1.18 of [RFC3875], is applied to received header fields that do not correspond to one of CGI's standard variables; the mapping consists of prepending "HTTP_" to each name and changing all instances of hyphen ("-") to underscore ("_"). This same mapping has been inherited by many other application frameworks in order to simplify moving applications from one platform to the next.
my-custom-header_v2
와 my-custom-header-v2
를 동시에 보냈다면 CGI 는 이걸 같은 헤더로 인식해버린다.https://www.geeksforgeeks.org/what-is-the-role-of-cgi-in-web-development/
무슨 일이 일어날 지 모르니 HTTP 헤더명에는 되도록 언더스코어 대신 하이픈을 사용하자.