3. Message Format
HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body ]
HTTP ๋ฉ์์ง๋ฅผ ๋ถ์ํ๋ ์ผ๋ฐ์ ์ธ ์ ์ฐจ๋ start-line์ ์ฝ๊ณ , ๊ฐ ํค๋ ํ๋๋ฅผ ๋น ํ๊น์ง ํ๋ ์ด๋ฆ์ผ๋ก ํด์ ํ ์ด๋ธ๋ก ์ฝ์ ๋ค์ ๋ถ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ํ์ํ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ค. ๋ฉ์์ง ๋ณธ๋ฌธ์ด ํ์๋ ๊ฒฝ์ฐ, ๋ฉ์์ง ๋ณธ๋ฌธ ๊ธธ์ด์ ๋์ผํ octet์ ์์ ์ฝ๊ฑฐ๋ ์ปค๋ฅ์ ์ ๋ซ์ ๋๊น์ง ์คํธ๋ฆผ์ผ๋ก ์ฝ๋๋ค.
์์ ์๋ ๋ฐ๋์ HTTP ๋ฉ์์ง๋ฅผ US-ASCII [USASCII]์ ์์ ์งํฉ์ธ ์ธ์ฝ๋ฉ์์ octet๋ก ๊ตฌ ๋ฌธ ๋ถ์ํด์ผ ํ๋ค.(MUST)
๋ฐ์ ์๋ start-line๊ณผ ์ฒซ ๋ฒ์งธ ํค๋ ํ๋ ์ฌ์ด์ ๊ณต๋ฐฑ์ ๋ณด๋ด๋ฉด ์ ๋๋ค.(MUST NOT)
start-line ๊ณผ ์ฒซ ๋ฒ์งธ ํค๋ ํ๋ ์ฌ์ด์ ๊ณต๋ฐฑ์ ์์ ํ๋ ์์ ์๋ ๋ฉ์์ง๋ฅผ ์ ํจํ์ง ์์ ๊ฒ์ผ๋ก ๊ฑฐ๋ถ ํ๊ฑฐ๋ ๋ฉ์์ง๋ฅผ ๋ ์ด์ ์ฒ๋ฆฌํ์ง ์๊ณ ๊ฐ ๊ณต๋ฐฑ์ด ์ง์ ๋ ์ค์ ์๋นํด์ผ ํ๋ค.(MUST) (i.e., ๊ณต ๋ฐฑ์ด์ค๋๋ชจ๋ ํ์์ค๊ณผํจ๊ป, ์ฌ๋ฐ๋ฅด๊ฒํ์ฑ๋ํค๋ํ๋๊ฐ์์ ๋๊ฑฐ๋ํค๋๋ถ๋ฌธ์ด๋๋ ๋๊น์ง, ์ ์ฒด ๋ผ์ธ์ ๋ฌด์ํ๋ค)
3.1 Start Line
์์ฒญ๊ณผ ์๋ต ๋ฉ์ธ์ง์ ์ ์ผํ ์ฐจ์ด๋ start line ๊ณผ ๋ฉ์ธ์ง body์ ๊ธธ์ด๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ค์ง์ ์ผ๋ก๋ start line์ผ๋ก ๊ตฌ๋ถ์ ํ ์ ์์ง๋ง, ์๋ฒ๋ ์์ฒญ๋ง ๋ฐ๋๋ก ๊ตฌํ๋๊ณ ํด๋ผ์ด์ธํธ๋ ์๋ต๋ง ๋ฐ๋๋ก ๊ตฌํ๋๋ค.
start-line = request-line / status-line
3.1.1 Request Line
์์ฒญ ๋ฉ์์ง์ ์ฒซ ๋ฒ์งธ ์ค์ request-line ์ด๋ค.
request-line = method SP request-target SP HTTP-version CRLF
method ํ ํฐ์ ๋์ ๋ฆฌ์์ค๋ฅผ ์คํํ๊ธฐ ์ํ ์์ฒญ ๋ฉ์๋๋ฅผ ํ์ํ๋ค. ์์ฒญ ๋ฉ์๋๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ค.
request-target์ Section 5.3์ ์ ์๋ ๋๋ก ์์ฒญ์ ์ ์ฉํ ๋์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ค.
์ ํจํ์ง ์์ request-line์ ์์ ์๋ 400(Bad Request) ์ค๋ฅ ๋๋ 301(Moved Permanently) ๋ฆฌ๋ค์ด๋ ํธ๋ก ์๋ตํด์ผ ํ๋ฉฐ, request-target์ ์ ์ ํ ์ธ์ฝ๋ฉ๋์ด์ผ ํ๋ค.(SHOULD)
์ ํจํ์ง ์์ request-line์ ์์ฒญ ์ฒด์ธ์ ๋ฐ๋ผ ๋ณด์ ํํฐ๋ฅผ ์ฐํํ๋๋ก ์๋์ ์ผ ๋ก ์กฐ์๋ ์ ์์ผ๋ฏ๋ก ์์ ์๋ ๋ฆฌ๋ค์ด๋ ํธ ์์ด ์์ฒญ์ ์๋ ์์ ํ๊ณ ์ฒ๋ฆฌํด์๋ ์๋๋ค.(SHOULD NOT)
HTTP๋ Section 2.5์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ request-line์ ๊ธธ์ด์ ๋ํด ๋ฏธ๋ฆฌ ์ ์๋ ์ ํ์ ๋ ์ง ์๋๋ค.
๊ตฌํํ ๊ฒ๋ณด๋ค ๋ ๊ธด ๋ฉ์๋๋ฅผ ์์ ํ ์๋ฒ๋ 501(Not Implemented)์ํ ์ฝ๋ ๋ก ์๋ตํด์ผ ํ๋ค.(SHOULD)
request-target์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ค๋ URI๋ณด๋ค ๊ธด 414(URI Too Long)์ํ ์ฝ๋๋ก ์๋ตํด์ผ ํ๋ค.(MUST)([RFC95231]์ Section 6.5.12 ์ฐธ์กฐ)
๋ชจ๋ HTTP ๋ฐ์ ์์ ์์ ์๋, ์ต์ 8000 octet ๊ธธ์ด์ request-line์, ์ง์ํ๋ ๊ฒ์ ๊ถ์ฅํ ๋ค.(RECOMMENDED)
3.1.2 Status Line
์๋ต ๋ฉ์์ง์ ์ฒซ ๋ฒ์งธ ์ค์ status-line ์ด๋ค.
status-line = HTTP-version SP status-code SP reason-phrase CRLF
reason-phrase ์์๋ ์ซ์ ์ํ ์ฝ๋์ ๊ด๋ จ๋ ํ ์คํธ ์ค๋ช ์ ์ ๊ณตํ๋ ์ ์ผํ ๋ชฉ์ ์ผ๋ก ์กด์ฌํ๋ค.
ํด๋ผ์ด์ธํธ๋ reason-phase ๋ด์ฉ์ ๋ฌด์ํด์ผ ํ๋ค.(SHOULD)
reason-phrase = *( HTAB / SP / VCHAR / obs-text )
3.2 Header Fields
๊ฐ ํค๋ ํ๋๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ํ๋ ์ด๋ฆ ๋ค์ ์ฝ๋ก (":"), ์ ํ์ ์์ ๊ณต๋ฐฑ (OWS), ํ๋ ๊ฐ, ์ ํ์ ๋ค์ ๊ณต๋ฐฑ(OWS)์ผ๋ก ๊ตฌ์ฑ๋๋ค.
header-field = field-name ":" OWS field-value OWS
3.2.1 Field Extensibility
์ง์ ๋ ๋ฉ์์ง์ ์ฌ์ฉ๋๋ ํค๋ ํ๋์ ๊ฐ์์๋ ์ ํ์ด ์๋ค.
field-name์ด Connection ํค๋ ํ๋(Section 6.1)์ ๋์ด๋์ด ์์ง ์๊ฑฐ๋ ํ์๊ฐ ์ด๋ฌ ํ ํ๋๋ฅผ ์ฐจ๋จํ๊ฑฐ๋ ๋ณํํ๋๋ก ํน๋ณํ ๊ตฌ์ฑ๋์ด ์์ง ์๋ ๊ฒฝ์ฐ, ํ๋ก๋ ์ธ์ํ์ง ๋ชปํ๋ ํค๋ ํ๋๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.(MUST)
๋ค๋ฅธ ์์ ์๋ ์ธ์ํ ์ ์๋ ํค๋ ํ๋๋ฅผ ๋ฌด์ํด์ผ ํ ๋ค.(SHOULD)
์ ์๋ ๋ชจ๋ ํค๋ ํ๋๋ [RFC7131] Section 8.3์ ์ค๋ช ๋ ๋๋ก "Message Headers" ๋ ์ง์คํธ๋ฆฌ์ IANA์ ๋ฑ๋ก๋์ด์ผ ํ๋ค.
3.2.2 Field Order
ํค๋ ํ๋์ ์์๋ ์ค์ํ์ง ์์ผ๋ ์์ฒญ ์ Host, ์๋ต ์ Date ๋ฑ ์ ์ด ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ํค๋ ํ๋๋ฅผ ๋จผ์ ๋ณด๋ด ๊ตฌํ ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ์ง ์์ ์๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ข๋ค.
์๋ฒ๋ ํค๋ ํ๋์๋ ์กฐ๊ฑด, ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช ๋๋ ์์ฒญ ์ฒ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์๋์ ์ผ๋ก ์๋ชป๋ ์ค๋ณต ํค๋ ํ๋๊ฐ ํฌํจ๋ ์ ์์ผ๋ฏ๋ก ์ ์ฒด ์์ฒญ ํค๋ ๋ถ๋ฌธ์ ๋ฐ์ ๋๊น์ง ๋์ ๋ฆฌ์์ค์ ์์ฒญ์ ์ ์ฉํ๋ฉด ์ ๋๋ค.(MUST NOT)
๋ฐ์ ์๋ ํค๋ ํ๋์ ์ ์ฒด ํ๋ ๊ฐ์ด ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก [i.e., #(values)]์ผ๋ก ์ ์๋์ด ์๊ฑฐ๋ ํค๋ ํ๋๊ฐ ์ ์๋ ค์ง ์์ธ(์๋ ์ค๋ช ์ฐธ์กฐ)๊ฐ ์๋ ํ, ๋ฉ์์ง์ ๋์ผํ ํ๋ ์ด๋ฆ์ ๊ฐ์ง ํค๋ ํ๋๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํด์๋ ์ ๋๋ค.(MUST NOT)
์์ ์๋ ๊ฐ ํ์ ํ๋ ๊ฐ์ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ๊ฒฐํฉ๋ ํ๋ ๊ฐ์ ์์๋๋ก ์ถ๊ฐํ์ฌ ๋ฉ์์ง์ ์๋ฏธ๋ก ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋์ผํ ํ๋ ์ด๋ฆ์ ๊ฐ์ง ์ฌ๋ฌ ํค๋ ํ๋๋ฅผ ํ๋์ โfield-name: field-valueโ ์์ผ๋ก ๊ฒฐํฉํ ์ ์๋ค.(MAY)
๋ฉ์์ง๋ฅผ ์ ๋ฌํ ๋ ํ๋ฝ์๋ ์ด๋ฌํ ํ๋ ๊ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํด์๋ ์ ๋๋ค.(MUST NOT)
์ฐธ๊ณ : ์ค์ ๋ก "Set-Cookie" ํค๋ ํ๋([RFC6065])๋ ์๋ต ๋ฉ์์ง์ ์ฌ๋ฌ๋ฒ ๋ํ๋๋ฉฐ ๋ชฉ๋ก ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์์ ๋์ผํ ์ด๋ฆ์ ์ฌ๋ฌ ํค๋ ํ๋์์ ์์ ์๊ตฌ ์ฌํญ์ ์๋ฐํ๋ค. ํ๋ ๊ฐ์ ํ๋์ ํ๋ ๊ฐ์ผ๋ก ๊ฒฐํฉํ ์ ์์ผ๋ฏ๋ก, ์์ ์๋ ํค๋ ํ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ "Set-Cookie"๋ฅผ ํน๋ณํ ๊ฒฝ์ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค. (์์ธํ ๋ด์ฉ์ [Kri2001]์ Appendix A.2.3 ์ ๋ด๋ผ.)
3.2.3 Whitespace
์ด ๋ช ์ธ๋ OWS(optional whitespace ์ ํ์ ๊ณต๋ฐฑ), RWD(required whitespace ํ์ ๊ณต๋ฐฑ)๋ฐ BWS(bad whitespace "๋ถ๋" ๊ณต๋ฐฑ)์ ์ฌ์ฉ์ ๋ํ๋ด๋ ์ธ ๊ฐ์ง ๊ท์น์ ์ฌ์ฉํ๋ค.
๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์ ํ์ ์ธ ๊ณต๋ฐฑ(OWS)์ ์ ํธํ๋ ํ๋กํ ์ฝ ์์์ ๊ฒฝ์ฐ, ๋ฐ์ ์๋ ๋จ์ผ SP๋ก์ ์ ํ์ ์ธ ๊ณต๋ฐฑ(OWS)๋ฅผ ์์ฑํด์ผ ํ๋ค. (SHOULD)
๊ทธ๋ ์ง ์์๊ฒฝ์ฐ, ๋ฐ์ ์๋ ๋ด๋ถ ๋ฉ์์ง ํํฐ๋ง ์ค์ ์ ํจํ์ง ์๊ฑฐ๋ ์ํ์ง ์๋ ํ๋กํ ์ฝ ์์๋ฅผ ํ์ดํธ ์์ํ๋๋ฐ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ์ ํ์ ๊ณต๋ฐฑ์ ์์ฑํด์๋ ์ ๋๋ค.(SHOULD NOT)
RWS ๊ท์น์ ํ๋ ํ ํฐ์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ํ๋ ์ด์์ ์ ํ ๊ณต๋ฐฑ octets์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
๋ฐ์ ์๋ ๋จ์ผ SP๋ก์ RWS๋ฅผ ์์ฑํด์ผ ํ๋ค.(SHOULD)
BWS ๊ท์น์ ์ค์ง ์ญ์ฌ์ ์ธ ์ด์ ๋ก ์ ํ์ ์ธ ๊ณต๋ฐฑ(OWS)์ ํ๋ฝํ๋ ๋ฌธ๋ฒ์์ ์ฌ์ฉ๋๋ค.
๋ฐ์ ์๋ ๋ฉ์์ง์์ BWS๋ฅผ ์์ฑํด์๋ ์๋๋ค.(MUST NOT)
์์ ์๋ ์ด๋ฌํ ์๋ชป๋ ๊ณต๋ฐฑ์ ๊ตฌ๋ฌธ ๋ถ์ํ ํ ํ๋กํ ์ฝ ์์๋ฅผ ํด์ํ๊ธฐ ์ ์ ์ ๊ฑฐํด์ผ ํ๋ค.(MUST)
3.2.4 Field Parsing
๋ฉ์์ง๋ ๊ฐ๋ณ ํค๋ ํ๋ ์ด๋ฆ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฌธ ๋ถ์๋๋ค.
ํค๋ field-name๊ณผ ์ฝ๋ก ์ฌ์ด์๋ ๊ณต๋ฐฑ์ด ํ์ฉ๋์ง ์๋๋ค.
์๋ฒ๋ ์๋ต ์ฝ๋๊ฐ 400(Bad Request)๊ณผ ํจ๊ป ํค๋ ํ๋ ์ด๋ฆ๊ณผ ์ฝ๋ก ์ฌ์ด์ ๊ณต๋ฐฑ์ด ํฌํจ๋ ์์ ๋ ์์ฒญ ๋ฉ์์ง ๋ฅผ ๊ฑฐ๋ถํด์ผ ํ๋ค.(MUST)
ํ๋ฝ์๋ ๋ฉ์์ง๋ฅผ ๋ค์ด ์คํธ๋ฆผ์ผ๋ก ์ ๋ฌํ๊ธฐ ์ ์ ์๋ต ๋ฉ์์ง์์ ์ด๋ฌํ ๊ณต๋ฐฑ์ ๋ชจ๋ ์ ๊ฑฐํด์ผ ํ๋ค.(MUST)
์ญ์ฌ์ ์ผ๋ก, HTTP ํค๋ ํ๋ ๊ฐ์ ๊ฐ ์ฌ๋ฌ ์ค ์์ ์ต์ ํ๋ ์ด์์ ๊ณต๋ฐฑ ๋๋ ์ํ ํญ(obs- fold)์ ๋์ด ์ฌ๋ฌ์ค๋ก ํ์ฅํ ์ ์์๋ค.
๋ฐ์ ์๋ ๋ฉ์์ง๊ฐ ๋ผ์ธ ํด๋ฉ(์ฆ, obs-fold ๊ท์น๊ณผ ์ผ์นํ๋ field- value ํฌํจ)์ ํฌํจํ๋ ๋ฉ์์ง๋ฅผ ์์ฑํด์๋ ์๋๋ค. ๋จ, message/http ๋ฏธ๋์ด ํ์ ๋ด์์ ํจํค์ง ๋๋๋ก ์๋๋๊ฒ๋ค์ ํ์ฉํ๋ค. (MUST NOT)
message/http ์ปจํ ์ด๋ ๋ด์ ์๋ ์์ฒญ ๋ฉ์์ง์์ obs-fold๋ฅผ ์์ ํ๋ ์๋ฒ๋ 400(Bad Request)์ ๋ฐ์กํ์ฌ ๋ฉ์์ง๋ฅผ ๊ฑฐ๋ถํด์ผ ํ๋ค.(MUST)
message/http ์ปจํ ์ด๋ ๋ด์ ์๋ ์๋ต ๋ฉ์์ง์์ obs-fold๋ฅผ ์์ ํ๋ ํ๋ฝ์ ๋๋ ๊ฒ์ดํธ์จ์ด๋ ๋ฉ์์ง๋ฅผ ์ญ์ ํ๊ณ 502(Bad Gateway) ์๋ต์ผ๋ก ๋์ฒดํด์ผ ํ๋ค. (MUST)
message/http ์ปจํ ์ด๋ ๋ด์ ์๋ ์๋ต ๋ฉ์์ง์์ obs-fold๋ฅผ ์์ ํ๋ ์ฌ์ฉ์ ์์ด์ ํธ๋ ํ๋ ๊ฐ์ ํด์ํ๊ธฐ ์ ์, ์์ ๋ ๊ฐ obs-fold๋ฅผ ํ๋ ๋๋ ๋ ๋ง์ SP octets ์ผ๋ก ๋์ฒดํด ์ผ ํ๋ค.(MUST)
์๋ก ์ ์๋ ํค๋ ํ๋๋ ํ๋ ๊ฐ์ US-ASCII octet์ผ๋ก ์ ํํด์ผ ํ๋ค.(SHOULD)
์์ ์๋ ํ๋ ๋ด์ฉ(obs-text)์ ๋ค๋ฅธ octet์ ๋ถํฌ๋ช ๋ฐ์ดํฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.(SHOULD)
3.2.5 Field Limits
์ฒ๋ฆฌํ๋ ค๋ ๊ฒ๋ณด๋ค ํฐ ์์ฒญ ํค๋ ํ๋ ๋๋ ํ๋ ์งํฉ์ ์์ ํ๋ ์๋ฒ๋ ์ ์ ํ 4xx(Client Error)์ํ ์ฝ๋๋ก ์๋ตํด์ผ ํ๋ค.(MUST)
์ด๋ฌํ ํค๋ ํ๋๋ฅผ ๋ฌด์ํ๋ฉด ์๋ฒ์ smuggling ๊ณต๊ฒฉ ์ทจ์ฝ์ฑ์ด ์ฆ๊ฐํ๋ค(Section 9.5).
3.2.6 Field Value Components
๋๋ถ๋ถ์ HTTP ํค๋ ํ๋ ๊ฐ์ ๊ณต๋ฐฑ ๋๋ ํน์ ๊ตฌ๋ถ ๋ฌธ์๋ก ๊ตฌ๋ถ๋ ์ผ๋ฐ ๊ตฌ๋ฌธ ๊ตฌ์ฑ ์์ (token, quoted-string ๋ฐ comment)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋๋ค. ๊ตฌ๋ถ ๊ธฐํธ๋ ํ ํฐ (DQUOTE and โ(),/:;<=>?@[\]{}")์ ํ์ฉ๋์ง ์๋ US-ASCII ์๊ฐ์ ๋ฌธ์ ์งํฉ์์ ์ ํ๋๋ค.
ํ ์คํธ ๋ฌธ์๋ double-quote๋ก ๋ฌถ์ฌ ์์ผ๋ฉด ํ๋์ ๊ฐ์ผ๋ก ๋ถ์๋๋ค.
quoted-string ๊ฐ์ ์ฒ๋ฆฌํ๋ ์์ ์๋ quoted-pair๋ฅผ ๋ฐฑ์ฌ๋์๋ก octet์ ์ํด ๋์ฒด๋ ๊ฒ ์ฒ๋ผ ์ฒ๋ฆฌํด์ผ ํ๋ค.(MUST)
๋ฐ์ ์๋ DQUOTE์ ๋ฐฑ์ฌ๋์ octets์ ํด๋น ๋ฌธ์์ ์ธ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ quoted-string์์ quoted-pair๋ฅผ ์์ฑ๋ฉด ์ ๋๋ค.(SHOULD NOT)
๋ฐ์ ์๋ ๊ดํธ[โ(โandโ)โ]์ backslash octets๋ฅผ ํด๋น ์ฃผ์์ ์ธ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ comment ๋ด์ quoted-pair๋ฅผ ์์ฑํ๋ฉด ์ ๋๋ค.(SHOULD NOT)
3.3 Message Body
HTTP ๋ฉ์์ง์ ๋ฉ์์ง ๋ณธ๋ฌธ(์๋ ๊ฒฝ์ฐ)์ ํด๋น ์์ฒญ ๋๋ ์๋ต์ ํ์ด๋ก๋ ๋ณธ๋ฌธ์ ์ ๋ฌํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๋ฉ์์ง์์ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ํ์ฉ๋๋ ์๊ธฐ์ ๋ํ ๊ท์น์ ์์ฒญ๊ณผ ์๋ต์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
์์ฒญ์์ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ์์ผ๋ฉด Content-Length ๋๋ Transfer-Encoding ํค๋ ํ๋๋ก ํ์๋๋ค. ์๋ต์์ ๋ฉ์์ง ๋ณธ๋ฌธ์ ์กด์ฌ ์ฌ๋ถ๋ ์๋ตํ๋ ์์ฒญ ๋ฉ์๋์ ์๋ต ์ํ ์ฝ๋(Section 3.1.2)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
HEAD ์์ฒญ ๋ฉ์๋([RFC7231]์ Section 4.3.2)์ ๋ํ ์๋ต์ ๊ด๋ จ ์๋ต ํค๋ ํ๋(์:Transfer-Encoding, Content-Length, ๋ฑ)๊ฐ ์๋ ๊ฒฝ์ฐ ์์ฒญ ๋ฉ์๋๊ฐ GET([RFC7231]์ Section 4.3.1) ๋์์ ๋์ ๊ฐ๋ง ๋ํ๋ด๋ฏ๋ก ๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ์ง ์๋๋ค.
CONNECT ์์ฒญ ๋ฉ์๋([RFC7231]์ Section 4.3.6)์ 2xx (Successful) ์๋ต์ ๋ฉ์์ง ๋ณธ๋ฌธ ๋์ ํฐ๋ ๋ชจ๋๋ก ์ ํํ๋ค.
๋ชจ๋ 1xx (informational), 204 (No Content) ๋ฐ 304 (Not Modified) ์๋ต์๋ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ํฌํจ๋์ง ์๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ์๋ต์๋ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ํฌํจ๋์ง๋ง, ๋ณธ๋ฌธ์ ๊ธธ์ด๋ 0์ผ ์ ์๋ค.
3.3.1 Transfer-Encoding
Transfer-Encoding ํค๋ ํ๋์๋ ๋ฉ์์ง ๋ณธ๋ฌธ์ ํ์ฑํ๊ธฐ ์ํด ํ์ด ๋ก๋ ๋ณธ๋ฌธ์ ์ ์ฉ๋(๋ ๋ ์ ์ฉ๋ ) ์ ์ก ์ฝ๋ฉ ์์์ ํด๋นํ๋ ์ ์ก ์ฝ๋ฉ ์ด๋ฆ์ ๋์ดํ๋ค.
Transfer-Encoding = 1#transfer-coding
HTTP์ ๊ฒฝ์ฐ, Transfer-Encoding์ ์ฃผ๋ก ๋์ ์ผ๋ก ์์ฑ๋๋ ํ์ด ๋ก๋๋ฅผ ์ ํํ๊ฒ ์ง์ ํ๊ณ ์ ์ก ํจ์จ์ฑ ๋๋ ๋ณด์์ ์ํด์๋ง ์ ์ฉ๋๋ ํ์ด ๋ก๋ ์ธ์ฝ๋ฉ๊ณผ, ์ ํ๋ ๋ฆฌ์์ค์ ํน์ง์ธ ํ์ด ๋ก๋ ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
ํ์ด ๋ก๋ ๋ณธ๋ฌธ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์์ง ๋ชปํ ๋ ๋ฉ์์ง ํ๋ ์์ ์ค์ํ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ์์ ์๋ ์ฒญ ์ ์ก ์ฝ๋ฉ(Section 4.1)์ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ด์ผ ํ๋ค. (MUST)
๋ฐ์ ์๋ ๋ฉ์์ง ๋ณธ๋ฌธ ์ ๋๋ฒ ์ด์ ์ฒญํฌ ๋ถํ ๋ ๋ฉ์์ง๋ฅผ ์ ์ฉํด์๋ ์ ๋๋ค.(MUST NOT) (i.e., ์ด๋ฏธ ์ฒญํฌ ๋ถํ ๋ ๋ฉ ์์ง๋ ํ์ฉ๋์ง ์๋๋ค).
์ฒญํฌ ๋ถํ ์ด์ธ์ ์ ์ก ์ฝ๋ฉ์ด ์์ฒญ ํ์ด ๋ก๋ ๋ณธ๋ฌธ์ ์ ์ฉ๋๋ ๊ฒฝ ์ฐ, ๋ฐ์ ์๋ ๋ฉ์์ง๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ ์ ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ต์ข ์ ์ก ์ฝ๋ฉ์ผ๋ก ์ฒญํฌ ๋ถ ํ ์ ์ ์ฉํด์ผ ํ๋ค.(MUST)
๋ค์
Transfer-Encoding: gzip, chunked
๋ฉ์์ง ๋ณธ๋ฌธ์ ๊ตฌ์ฑํ๋ ๋์ ํ์ด ๋ก๋ ๋ณธ๋ฌธ์ด gzip ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ์์ถ๋ ๋ค์ chunked ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ ๋ ๊ฒ์ ๋ํ๋ธ๋ค.
HEAD ์์ฒญ์ ์๋ต ํ๊ฑฐ๋ ๋๋ 304(Not Modified) ์๋ต ([RFC7232]์ Section 4.1)์ ํตํด GET ์์ฒญ์ ์๋ต ํ๊ฑฐ๋, ๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ๊ฑฐ๋ ์กฐ๊ฑด ์๋ GET ์์ฒญ์ธ ๊ฒฝ์ฐ ์์๋ฒ๊ฐ ๋ฉ์์ง ๋ณธ๋ฌธ์ ์ ์ก ์ฝ๋ฉ์ ์ ์ฉ ํ์๊ฑฐ๋ผ๊ณ ํ์ํ๊ธฐ ์ํด Transfer-Encoding์ด ๋ณด๋ด์ง ์ ์๋ค.(MAY)
์๋ฒ๋ ์ํ ์ฝ๋๊ฐ 1xx (Informational) ๋๋ 204 (No Content) ์๋ต์์ Transfer- Encoding ํค๋ ํ๋๋ฅผ ๋ณด๋ด๋ฉด ์ ๋๋ค.(MUST NOT)
์๋ฒ๋ CONNECT ์์ฒญ์ 2xx (Successful) ์๋ต์์ Transfer-Encoding ํค๋ ํ๋๋ฅผ ๋ณด๋ด ๋ฉด ์ ๋๋ค.(MUST NOT) ([RFC7131]์ Section 4.3.6).
HTTP/1.1์ Transfer-Encoding์ด ์ถ๊ฐ๋์๋ค.
ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ HTTP/1.1(์ด์)์์ฒญ์ ์ฒ๋ฆฌ ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์์ง ๋ชปํ๋ ํ Transfer-Encoding์ ํฌํจํ๋ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ ๋๋ค.(MUST NOT)
ํด๋น ์์ฒญ์ด HTTP/1.1(๋๋ ๊ทธ ์ด์)์ ๋ํ๋ด์ง ์๋ ํ ์๋ฒ๋ Transfer-Encoding์ ํฌํจํ๋ ์๋ต์ ๋ณด๋ด๋ฉด ์ ๋๋ค.(MUST NOT)
์ดํดํ์ง ๋ชปํ๋ ์ ์ก ์ฝ๋ฉ๊ณผ ํจ๊ป ์์ฒญ ๋ฉ์์ง๋ฅผ ๋ฐ๋ ์๋ฒ๋ 501 (Not Implemented)๋ก ์๋ตํด์ผ ํ๋ค.(SHOULD)
3.3.2 Content-Length
๋ฉ์์ง์ Transfer-Encoding ํค๋ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ, Content-Length ํค๋ ํ๋๋ ์ ์ฌ์ ํ์ด ๋ก๋ ๋ณธ๋ฌธ์ ๋ํด ์์๋๋ ํฌ๊ธฐ๋ฅผ 10์ง์๋ก ์ ๊ณตํ ์ ์๋ค.
Content-Length = 1*DIGIT
๋ฐ์ ์๋ Transfer-Encoding ํค๋ ํ๋๋ฅผ ํฌํจํ๋ ๋ฉ์์ง์์ Content-Length ํค๋ ํ๋๋ฅผ ๋ณด๋ด๋ฉด ์ ๋๋ค.(MUST NOT)
Transfer-Encoding ์์ด ์ ์กํ๊ณ ์์ฒญ ๋ฉ์๋๊ฐ ๋๋ด๋ ํ์ด ๋ก๋ ๋ณธ๋ฌธ์ ๋ํ ์๋ฏธ๋ฅผ ์ ์ ํ ๋ ์ฌ์ฉ์ ์์ด์ ํธ๋ ์์ฒญ ๋ฉ์์ง์ Content-Length๋ฅผ ๋ณด๋ด์ผ ํ๋ค.(SHOULD)
์์ฒญ ๋ฉ์์ง์ ํ์ด ๋ก๋ ๋ณธ๋ฌธ์ด ํฌํจ๋์ด ์์ง ์๊ณ ๋ฉ์๋ ์๋ฏธ๋ก ์ด ์ด๋ฌํ ๋ณธ๋ฌธ์ ์์ํ์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์์ด์ ํธ๋ Content-length ํค๋ ํ๋๋ฅผ ๋ฐ์กํด๋ ์ ๋๋ค.(SHOULD NOT)
์๋ฒ๋ HEAD ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก Content-Length ํค๋ ํ๋๋ฅผ ์ ์กํ ์ ์๋ค. (MAY)
์๋ฒ๋ ๋์ผํ ์์ฒญ์์ GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋ต์ ํ์ด๋ก๋ ๋ณธ๋ฌธ์ ์ ์ก ๋ 10์ง์์ Content-Length์ field-value๊ฐ ๊ฐ์ง ์๋ ํ, ์๋ฒ๋ ์๋ต์ผ๋ก Content-Length๋ฅผ ๋ณด๋ด์๋ ์ ๋๋ค.(MUST NOT)
์๋ฒ๋ ์กฐ๊ฑด๋ถ GET ์์ฒญ์ ๋ํด 304 (Not Modified) ์๋ต์ Content-Length ํค๋ ํ๋๋ฅผ ๋ณด๋ผ ์ ์๋ค.
ํ๋ ๊ฐ์ด ๋์ผํ ์์ฒญ์ ๋ํ 200 (OK) ์๋ต์ ํ์ด๋ก๋ ๋ณธ๋ฌธ์์ ์ ์ก๋ 10์ง์์ Content-Length์ field-value๊ฐ ๊ฐ์ง ์๋ ํ, ์๋ฒ๋ ์๋ต์ผ๋ก Content-Length๋ฅผ ๋ณด๋ด์๋ ์ ๋๋ค.(MUST NOT)
์๋ฒ๋ ์ํ ์ฝ๋๊ฐ 1xx (Informational) ๋๋ 204 (No Content)์ธ ์๋ต์์ Content- Lengthํค๋ ํ๋๋ฅผ ๋ณด๋ด๋ฉด ์ ๋๋ค.(MUST NOT)
์๋ฒ๋ CONNECT ์์ฒญ์ ๋ํ 2xx (Successful) ์๋ต์์ Content-Length ํค๋ ํ๋๋ฅผ ๋ณด ๋ด์๋ ์ ๋๋ค.(MUST NOT) ([RFC7231]์ Section 4.3.6)
์์ ์ ์๋ ๊ฒฝ์ฐ์ ๋ณ๋๋ก, Transfer-Encoding์ด ์๋ ๊ฒฝ์ฐ, ์ ์ฒด ํค๋ ๋ถ๋ฌธ์ ๋ณด๋ด๊ธฐ ์ ์ ํ์ด ๋ก๋ ๋ณธ๋ฌธ ํฌ๊ธฐ๋ฅผ ์๊ณ ์๋ ์์๋ฒ๋ Content-Length ํค๋ ํ๋๋ฅผ ๋ณด๋ด์ผ ํ๋ค. (SHOULD)
Content-Length ํ๋ ๊ฐ์ด 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ ํจํ๋ค.
ํ์ด ๋ก๋ ๊ธธ์ด์ ๋ํ ์ฌ์ ์ ์ ๋ ์ ํ์ด ์์ผ๋ฏ๋ก ์์ ์๋ ์ ์ฌ์ ์ผ๋ก ํฐ 10์ง์ ์ซ์๋ฅผ ์์ธกํ๊ณ ์ ์ ๋ณํ ์ค๋ฒ ํ๋ก์ฐ ๋ก ์ธํ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํด์ผ ํ๋ค.(MUST)
์ฌ๋ฌ Content-Length ํค๋ ํ๋์ ํจ๊ป ๋์ผํ 10์ง์๋ก ๊ตฌ์ฑํ๋ field-value๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋, ๋๋ ๋จ๋ Content-Length ํค๋ ํ๋์ ํจ๊ป ๋์ผํ 10์ง์์ ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑํ๋ field-value๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋(์: โContent-length:42, 42โ), ์ค๋ณต๋ Content-Length ํค๋ ํ๋๊ฐ ์์ฑ๋๊ฑฐ๋ ์ ์คํธ๋ฆผ ๋ฉ์์ง ์ฒ๋ฆฌ๊ธฐ์ ์ํด ๊ฒฐํฉ๋ ๊ฒ์ผ๋ก ๋ํ๋๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ, ๊ทธ๋ ์์ ์๋ ์ ํจํ์ง ์์ ๋ฉ์์ง๋ฅผ ๊ฑฐ๋ถํ๊ฑฐ๋, ๋ฉ์์ง ๋ณธ๋ฌธ ๊ธธ์ด๋ฅผ ๊ฒฐ์ ํ๋๊ฒ ๋๋ ์ ์ก๋๊ธฐ ์ ์ 10์ง์๋ฅผ ํฌํจํ๋ ์ ํจํ ๋จ๋ Content-Length์ ํจ๊ป ์ค๋ณต๋ field-value ๋ฅผ ๋์ฒดํด์ผ ํ๋ค.(MUST)
3.3.3 Message Body Length
๋ฉ์์ง ๋ณธ๋ฌธ์ ๊ธธ์ด๋ ๋ค์ ์ค ํ๋์ ์ํด ๊ฒฐ์ ๋๋ค(์ฐ์ ์์ ์์๋๋ก):
๋ณธ๋ฌธ ์ฐธ์กฐ.
3.4 Handling Imcomplete Messages
์ผ๋ฐ์ ์ผ๋ก ์ทจ์๋ ์์ฒญ ๋๋ ํธ๋ฆฌ๊ฑฐ ๋ ์๊ฐ ์ด๊ณผ ์์ธ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ถ์์ ํ ์์ฒญ ๋ฉ์์ง๋ฅผ ์์ ํ๋ ์๋ฒ๋ ์ปค๋ฅ์ ์ ๋ซ๊ธฐ ์ ์ ์ค๋ฅ ์๋ต์ ๋ณด๋ผ ์ ์๋ค.(MAY)
์ปค๋ฅ์ ์ด ์กฐ๊ธฐ์ ๋ซํ๊ฑฐ๋ ์ฒญํฌ ๋ถํ ๋ ์ ์ก ์ฝ๋ฉ์ ๋์ฝ๋ฉ ํ๋ ๋ฐ ์คํจํ ๋ ๋ฐ์ํ ์ ์๋ ๋ถ์์ ํ ์๋ต ๋ฉ์์ง๋ฅผ ์์ ํ๋ ํด๋ผ์ด์ธํธ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๋์ ๋ถ์์ ํ ๋ฉ์์ง๋ก ๊ธฐ๋กํด์ผ ํ๋ค.(MUST)
RFC 7230 แแ ฅแซแแ งแจ pdf
์ธ์ฝ๋ฉ์ ์ข ๋ฃํ๋ zero-sized(0)์ ์ฒญํฌ๊ฐ ์์ ๋์ง ์์ผ๋ฉด ์ฒญํฌ ์ ์ก ์ฝ๋ฉ์ ์ฌ์ฉํ๋ ๋ฉ์์ง ๋ณธ๋ฌธ์ ๋ถ์์ ํ๋ค.
์์ ๋ ๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌ๊ธฐ(in octets)๊ฐ Content-Length์์ ์ง์ ํ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ์ ํจํ Content-Length๋ฅผ ์ฌ์ฉํ๋ ๋ฉ์์ง๋ ๋ถ์์ ํ๋ค.
3.5 Message Parsing Robustness
HTTP/1.1 ์ฌ์ฉ์ ์์ด์ ํธ๋ ์ถ๊ฐ CRLF๋ก ์์ํ๊ฑฐ๋ ์์ฒญ์ ๋ฐ๋์ ๋ฐ๋ฅด๋ฉด ์ ๋๋ค.(MUST NOT)
line-ending์ผ๋ก ์์ฒญ ๋ฉ์์ง ๋ณธ๋ฌธ์ ์ข ๋ฃํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์ ์์ด์ ํธ๋ ๋ฉ์์ง ๋ณธ๋ฌธ ๊ธธ์ด์ ๋ถ๋ถ์ผ๋ก์ ์ข ๋ฃ CRLF octet์ ์ธ์ด์ผ ํ๋ค.(MUST)
HTTP ์์ฒญ ๋ฉ์์ง๋ง ์ฒญ์ทจํ๊ฑฐ๋, HTTP ์์ฒญ ๋ฉ์์ง์ด๊ธฐ ์ํด start-line์์ ๋ํ๋๋ ๋ด์ฉ์ ์ฒ๋ฆฌํ๋ ์๋ฒ๊ฐ ์์ ๋์ด๋ ์๊ฒฉํจ ์์ธ ์ธ์๋ HTTP-message ๋ฌธ๋ฒ๊ณผ ์ผ์นํ์ง ์๋ octets์ ์ํธ์ค๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ, ์๋ฒ๋ 400 (Bad Request)์๋ต์ผ๋ก ์๋ตํด์ผ ํ๋ค. (SHOULD)
Last updated