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

Was this helpful?