| ์ธํฐ๋ท ์์ง๋์ด๋ง ํ์คํฌ ํฌ์ค (IETF) | ํธ์ง์: M. Thomson |
| ์์ฒญ ์๊ฒฌ: 9113 | Mozilla |
| ๋์ฒดํจ: 7540, 8740 | ํธ์ง์: C. Benfield |
| ๋ถ๋ฅ: ํ์ค ํธ๋ | Apple Inc. |
| ISSN: 2070-1721 | 2022๋ 6์ |
HTTP/2
์ด๋ก
์ด ๋ช ์ธ์๋ ํ์ดํผํ ์คํธ ์ ์ก ํ๋กํ ์ฝ(HTTP)์ ์๋ฏธ๋ก ์ ์ต์ ํํ์ฌ ํํํ HTTP ๋ฒ์ 2(HTTP/2)๋ฅผ ์ค๋ช ํ๋ค. HTTP/2๋ ํ๋ ์์ถ์ ๋์ ํ๊ณ ๋์ผํ ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ๋์ ๊ตํ์ ํ์ฉํจ์ผ๋ก์จ ๋คํธ์ํฌ ์์์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์๊ฒ ํ๋ค.
์ด ๋ฌธ์๋ RFC 7540 ๋ฐ RFC 8740์ ๋์ฒดํ๋ค.
์ด ๋ฉ๋ชจ์ ์ํ
์ด ๋ฌธ์๋ ์ธํฐ๋ท ํ์ค ํธ๋ ๋ฌธ์์ด๋ค.
์ด ๋ฌธ์๋ ์ธํฐ๋ท ์์ง๋์ด๋ง ํ์คํฌ ํฌ์ค(IETF)์ ์ฐ๋ฌผ์ด๋ค. ์ด๋ IETF ์ปค๋ฎค๋ํฐ์ ํฉ์๋ฅผ ๋ฐ์ํ๋ค. ๊ณต๊ฐ ๊ฒํ ๋ฅผ ๊ฑฐ์ณค๊ณ ์ธํฐ๋ท ์์ง๋์ด๋ง ์ด์ ๊ทธ๋ฃน(IESG)์ ์ํด ์ถํ ์น์ธ์ ๋ฐ์๋ค. ์ธํฐ๋ท ํ์ค์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ RFC 7841์ ์น์ 2์์ ํ์ธํ ์ ์๋ค.
์ด ๋ฌธ์์ ํ์ฌ ์ํ, ์ ์คํ, ๋ฐ ์ด์ ๋ํ ํผ๋๋ฐฑ ์ ์ถ ๋ฐฉ๋ฒ์ ๊ดํ ์ ๋ณด๋ https://www.rfc-editor.org/info/rfc9113์์ ํ์ธํ ์ ์๋ค.
Copyright Notice
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.
- 1. ์๊ฐ
- 2. HTTP/2 ํ๋กํ ์ฝ ๊ฐ์
- 3. HTTP/2 ์์
- 4. HTTP ํ๋ ์
- 5. ์คํธ๋ฆผ๊ณผ ๋ค์คํ
- 6. ํ๋ ์ ์ ์
- 7. ์ค๋ฅ ์ฝ๋
- 8. HTTP/2์์ HTTP ์๋ฏธ ํํ
- 9. HTTP/2 ์ฐ๊ฒฐ
- 10. ๋ณด์ ๊ณ ๋ ค์ฌํญ
- 11. IANA ๊ณ ๋ ค์ฌํญ
- 12. ์ฐธ๊ณ ๋ฌธํ
- Appendix A. ๊ธ์ง๋ TLS 1.2 ์ํธ ๋ชจ์
- Appendix B. RFC 7540์์์ ๋ณ๊ฒฝ์ฌํญ
- ๊ฐ์ฌ์ ๋ง
- ๊ธฐ์ฌ์
- ์ ์ ์ฃผ์
1. ์๊ฐ
ํ์ดํผํ ์คํธ ์ ์ก ํ๋กํ ์ฝ(HTTP, [HTTP])์ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ฐ HTTP ๋ฒ์ ์ด ๊ธฐ๋ณธ ์ ์ก์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ์ ์ก์ด ๋์ํ๋ ์กฐ๊ฑด์ ์ฐ๊ฒฐ๋์ด ์๋ค.
์ฌ๋ฌ ๋์ ์์ฒญ์ ๋ง๋๋ ๊ฒ์ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค. HTTP/1.0์ ์ฃผ์ด์ง TCP [TCP] ์ฐ๊ฒฐ์์ ํ ๋ฒ์ ํ๋์ ์์ฒญ๋ง ์ ํจํ ์ ์๋๋ก ํ์ฉํ๋ค. HTTP/1.1 [HTTP/1.1]์ ์์ฒญ ํ์ดํ๋ผ์ด๋์ ์ถ๊ฐํ์ง๋ง, ์ด๋ ์์ฒญ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก๋ง ํด๊ฒฐํ๊ณ ์ฌ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ ํค๋-์ค๋ธ-๋ผ์ธ ๋ธ๋กํน์ ์ํฅ์ ๋ฐ๋๋ค. ๋ฐ๋ผ์ HTTP/1.0 ๋ฐ HTTP/1.1 ํด๋ผ์ด์ธํธ๋ ๋์ ์์ฒญ์ ์ํด ์๋ฒ์ ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ค.
๊ฒ๋ค๊ฐ HTTP ํ๋๋ ์ข ์ข ๋ฐ๋ณต์ ์ด๊ณ ์ฅํฉํ์ฌ ๋ถํ์ํ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ ๋ฐํ๊ณ ์ด๊ธฐ TCP ํผ์ก ์ฐฝ์ด ๋น ๋ฅด๊ฒ ์ฑ์์ง๊ฒ ํ๋ค. ์ด๋ ์๋ก์ด TCP ์ฐ๊ฒฐ์์ ์ฌ๋ฌ ์์ฒญ์ด ์ด๋ฃจ์ด์ง ๋ ๊ณผ๋ํ ์ง์ฐ์ผ๋ก ์ด์ด์ง ์ ์๋ค.
HTTP/2๋ HTTP ์๋ฏธ๋ก ์ ๊ธฐ๋ณธ ์ฐ๊ฒฐ์ ์ต์ ํํ์ฌ ๋งคํํจ์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ๋์ผํ ์ฐ๊ฒฐ์์ ๋ฉ์์ง์ ๊ต์ฐจ ์ ์ก์ ํ์ฉํ๊ณ HTTP ํ๋์ ๋ํด ํจ์จ์ ์ธ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ค. ๋ํ ์์ฒญ์ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์์ด ๋ ์ค์ํ ์์ฒญ์ด ๋ ๋นจ๋ฆฌ ์๋ฃ๋๋๋ก ํ์ฌ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํจ๋ค.
๊ฒฐ๊ณผ ํ๋กํ ์ฝ์ HTTP/1.x์ ๋น๊ตํด ๋ ์ ์ TCP ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ฏ๋ก ๋คํธ์ํฌ์ ๋ ์ฐํธ์ ์ด๋ค. ์ด๋ ๋ค๋ฅธ ํ๋ก์ฐ์์ ๊ฒฝ์์ด ์ค๊ณ ๋ ์ฅ๊ธฐ๊ฐ ์ ์ง๋๋ ์ฐ๊ฒฐ๋ก ์ด์ด์ ธ ์ฌ์ฉ ๊ฐ๋ฅํ ๋คํธ์ํฌ ์ฉ๋์ ๋ ์ ํ์ฉํ๊ฒ ํ๋ค. ๋ค๋ง, ์ด ํ๋กํ ์ฝ์ TCP์ ํค๋-์ค๋ธ-๋ผ์ธ ๋ธ๋กํน์ ํด๊ฒฐํ์ง๋ ์๋๋ค.
๋ง์ง๋ง์ผ๋ก, HTTP/2๋ ์ด์ง ๋ฉ์์ง ํ๋ ์ด๋ฐ์ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๊ฒ ํ๋ค.
์ด ๋ฌธ์๋ RFC 7540 ๋ฐ 8740์ ๋์ฒดํ๋ค. ๋ถ๋ก B์๋ ์ฃผ๋ชฉํ ๋งํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ด๋์ด ์๋ค.
2. HTTP/2 ํ๋กํ ์ฝ ๊ฐ์
HTTP/2๋ HTTP ์๋ฏธ๋ก ์ ์ํ ์ต์ ํ๋ ์ ์ก์ ์ ๊ณตํ๋ค. HTTP/2๋ HTTP์ ๋ชจ๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ง์ํ์ง๋ง HTTP/1.1๋ณด๋ค ๋ ํจ์จ์ ์ด๋๋ก ์ค๊ณ๋์๋ค.
HTTP/2๋ TCP ์ฐ๊ฒฐ([TCP]) ์์์ ๋์ํ๋ ์ฐ๊ฒฐ ์งํฅ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต ํ๋กํ ์ฝ์ด๋ค. ํด๋ผ์ด์ธํธ๊ฐ TCP ์ฐ๊ฒฐ์ ์์ํ๋ ์ธก์ด๋ค.
HTTP/2์ ๊ธฐ๋ณธ ํ๋กํ ์ฝ ๋จ์๋ ํ๋ ์(์น์ 4.1)์ด๋ค. ๊ฐ ํ๋ ์ ์ ํ์ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋ค. ์๋ฅผ ๋ค์ด, HEADERS์ DATA ํ๋ ์์ HTTP ์์ฒญ๊ณผ ์๋ต์ ๊ธฐ์ด๋ฅผ ํ์ฑํ๋ค(์น์ 8.1); SETTINGS, WINDOW_UPDATE, PUSH_PROMISE์ ๊ฐ์ ๋ค๋ฅธ ํ๋ ์ ์ ํ์ HTTP/2์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์์ฒญ์ ๋ค์คํ๋ ๊ฐ HTTP ์์ฒญ/์๋ต ๊ตํ์ ๊ณ ์ ํ ์คํธ๋ฆผ(์น์ 5)๊ณผ ์ฐ๊ด์์ผ ์ด๋ฃจ์ด์ง๋ค. ์คํธ๋ฆผ์ ์๋ก ๋๋ถ๋ถ ๋ ๋ฆฝ์ ์ด๋ฏ๋ก, ํ๋์ ์์ฒญ์ด๋ ์๋ต์ด ์ฐจ๋จ๋๊ฑฐ๋ ์ ์ฒด๋์ด๋ ๋ค๋ฅธ ์คํธ๋ฆผ์ ์งํ์ ๋ง์ง ์๋๋ค.
๋ค์คํ์ ํจ๊ณผ์ ์ธ ์ฌ์ฉ์ ํ๋ฆ ์ ์ด์ ์ฐ์ ์์ ์ง์ ์ ๋ฌ๋ ค ์๋ค. ํ๋ฆ ์ ์ด(์น์ 5.2)๋ ์์ ์๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๋ฒ์๋ก ์ ์ก๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ์ฌ ๋ค์คํ๋ ์คํธ๋ฆผ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ณด์ฅํ๋ค. ์ฐ์ ์์ ์ง์ (์น์ 5.3)์ ์ ํ๋ ์์์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ก ๋ณด์ฅํ๋ค. ์ด HTTP/2 ๊ฐ์ ํ์ [RFC7540]์ ์ฐ์ ์์ ์ ํธ ๋ฐฉ์์ ๋ ์ด์ ๊ถ์ฅํ์ง ์๋๋ค.
์ฐ๊ฒฐ์์ ์ฌ์ฉ๋๋ HTTP ํ๋์๋ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ๋ง์ด ํฌํจ๋ ์ ์์ผ๋ฏ๋ก, ๊ทธ๊ฒ๋ค์ ํฌํจํ๋ ํ๋ ์์ ์์ถ๋๋ค(์น์ 4.3). ์ด๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์์ฒญ ํฌ๊ธฐ์ ํนํ ์ ๋ฆฌํ์ฌ ์ฌ๋ฌ ์์ฒญ์ ํ๋์ ํจํท์ผ๋ก ์์ถํ ์ ์๊ฒ ํ๋ค.
๋ง์ง๋ง์ผ๋ก, HTTP/2๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ต์ ํธ์ํ ์ ์๋ ์ ํ์ ์ํธ์์ฉ ๋ชจ๋๋ฅผ ์ถ๊ฐํ๋ค(์น์ 8.4). ์ด๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ ๊ฒ์ผ๋ก ์์๋๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ธกํ์ฌ ๋ณด๋ด๋ ๊ฒ์ผ๋ก, ์ ์ฌ์ ์ง์ฐ ์ด๋์ ์ํด ์ผ๋ถ ๋คํธ์ํฌ ์ฌ์ฉ์ ๊ฑฐ๋ํ๋ ๊ฒ์ด๋ค. ์๋ฒ๋ ์ด๋ฅผ ํฉ์ฑ๋ ์์ฒญ์ ์์ฑํ์ฌ PUSH_PROMISE ํ๋ ์์ผ๋ก ์ ์กํจ์ผ๋ก์จ ์ํํ๋ค. ๊ทธ๋ฐ ๋ค์ ์๋ฒ๋ ๋ณ๋์ ์คํธ๋ฆผ์์ ํฉ์ฑ ์์ฒญ์ ๋ํ ์๋ต์ ๋ณด๋ผ ์ ์๋ค.
2.1. ๋ฌธ์ ๊ตฌ์ฑ
HTTP/2 ๋ช ์ธ์๋ ๋ค ๋ถ๋ถ์ผ๋ก ๋๋๋ค:
- Starting HTTP/2 (์น์ 3)๋ HTTP/2 ์ฐ๊ฒฐ์ด ์ด๋ป๊ฒ ์์๋๋์ง๋ฅผ ๋ค๋ฃฌ๋ค.
- ํ๋ ์(์น์ 4) ๋ฐ ์คํธ๋ฆผ(์น์ 5) ๋ ์ด์ด๋ HTTP/2 ํ๋ ์์ด ์ด๋ป๊ฒ ๊ตฌ์กฐํ๋๊ณ ๋ค์คํ๋ ์คํธ๋ฆผ์ผ๋ก ํ์ฑ๋๋์ง๋ฅผ ์ค๋ช ํ๋ค.
- ํ๋ ์(์น์ 6) ๋ฐ ์ค๋ฅ(์น์ 7) ์ ์์๋ HTTP/2์์ ์ฌ์ฉ๋๋ ํ๋ ์ ๋ฐ ์ค๋ฅ ์ ํ์ ์ธ๋ถ์ฌํญ์ด ํฌํจ๋๋ค.
- HTTP ๋งคํ(์น์ 8)๊ณผ ์ถ๊ฐ ์๊ตฌ์ฌํญ(์น์ 9)์ ํ๋ ์๊ณผ ์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ HTTP ์๋ฏธ๋ก ์ด ์ด๋ป๊ฒ ํํ๋๋์ง๋ฅผ ์ค๋ช ํ๋ค.
์ผ๋ถ ํ๋ ์ ๋ฐ ์คํธ๋ฆผ ๊ณ์ธต ๊ฐ๋ ์ HTTP๋ก๋ถํฐ ๋ถ๋ฆฌ๋์ด ์์ง๋ง, ์ด ๋ช ์ธ์๋ ์์ ํ ์ผ๋ฐ์ ์ธ ํ๋ ์ ๊ณ์ธต์ ์ ์ํ์ง๋ ์๋๋ค. ํ๋ ์ ๋ฐ ์คํธ๋ฆผ ๋ ์ด์ด๋ HTTP์ ํ์์ ๋ง๊ฒ ์กฐ์ ๋์ด ์๋ค.
2.2. ๊ด๋ก ๋ฐ ์ฉ์ด
์ด ๋ฌธ์์์์ ํต์ฌ ๋จ์ด "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", ๋ฐ "OPTIONAL"์ ๋ชจ๋ ๋๋ฌธ์๋ก ๋ํ๋ ๋์ ํํด BCP 14 [RFC2119] ๋ฐ [RFC8174]์ ์ค๋ช ๋ ๋๋ก ํด์๋์ด์ผ ํ๋ค.
๋ชจ๋ ์ซ์ ๊ฐ์ ๋คํธ์ํฌ ๋ฐ์ดํธ ์์์ด๋ค. ๊ฐ์ ๋ณ๋๋ก ๋ช ์๋์ง ์๋ ํ ๋ถํธ ์๋ ๊ฐ์ด๋ค. ๋ฆฌํฐ๋ด ๊ฐ์ ์ ์ ํ๊ฒ ์ญ์ง์ ๋๋ 16์ง์๋ก ์ ๊ณต๋๋ค. 16์ง์ ๋ฆฌํฐ๋ด์ ์ญ์ง์ ๋ฆฌํฐ๋ด๊ณผ ๊ตฌ๋ณํ๊ธฐ ์ํด "0x"๋ก ์ ๋๋๋ค.
์ด ๋ช ์ธ์๋ ์ด์ง ํ์์ ์ค๋ช ํ ๋ RFC 9000์ ์น์ 1.3์ ์ค๋ช ๋ ๊ด๋ก๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํ์์ ๋คํธ์ํฌ ๋ฐ์ดํธ ์์๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋์ ๊ฐ์ ๋นํธ๊ฐ ๋ฎ์ ๊ฐ์ ๋นํธ๋ณด๋ค ๋จผ์ ํ๊ธฐ๋๋ค๋ ์ ์ ์ ์ํ๋ผ.
๋ค์ ์ฉ์ด๋ค์ด ์ฌ์ฉ๋๋ค:
- client:
- HTTP/2 ์ฐ๊ฒฐ์ ์์ํ๋ ์๋ํฌ์ธํธ. ํด๋ผ์ด์ธํธ๋ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ HTTP ์๋ต์ ์์ ํ๋ค.
- connection:
- ๋ ์๋ํฌ์ธํธ ๊ฐ์ ์ ์ก ๊ณ์ธต ์ฐ๊ฒฐ.
- connection error:
- ์ ์ฒด HTTP/2 ์ฐ๊ฒฐ์ ์ํฅ์ ๋ฏธ์น๋ ์ค๋ฅ.
- endpoint:
- ์ฐ๊ฒฐ์ ํด๋ผ์ด์ธํธ ๋๋ ์๋ฒ ์ค ํ๋.
- frame:
- ํ๋ ์ ์ ํ์ ๋ฐ๋ผ ๊ตฌ์กฐํ๋ ํค๋์ ๊ฐ๋ณ ๊ธธ์ด ์ฅํ ์ํ์ค๋ก ๊ตฌ์ฑ๋ HTTP/2 ์ฐ๊ฒฐ ๋ด์ ๊ฐ์ฅ ์์ ํต์ ๋จ์.
- peer:
- ์๋ํฌ์ธํธ. ํน์ ์๋ํฌ์ธํธ๋ฅผ ๋ ผํ ๋ "peer"๋ ๋ ผ์์ ์ฃผ์ฒด์ ์๊ฒฉ์ธ ์๋ํฌ์ธํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- receiver:
- ํ๋ ์์ ์์ ํ๋ ์๋ํฌ์ธํธ.
- sender:
- ํ๋ ์์ ์ ์กํ๋ ์๋ํฌ์ธํธ.
- server:
- HTTP/2 ์ฐ๊ฒฐ์ ์๋ฝํ๋ ์๋ํฌ์ธํธ. ์๋ฒ๋ HTTP ์์ฒญ์ ์์ ํ๊ณ HTTP ์๋ต์ ์ ์กํ๋ค.
- stream:
- HTTP/2 ์ฐ๊ฒฐ ๋ด์ ์๋ฐฉํฅ ํ๋ ์ ํ๋ฆ.
- stream error:
- ๊ฐ๋ณ HTTP/2 ์คํธ๋ฆผ์ ์ค๋ฅ.
๋ง์ง๋ง์ผ๋ก, "gateway", "intermediary", "proxy", ๋ฐ "tunnel" ์ฉ์ด๋ RFC 9110์ ์น์ 3.7์ ์ ์๋์ด ์๋ค. ์ค๊ฐ์๋ ๋ค๋ฅธ ์์ ์ ํด๋ผ์ด์ธํธ์ด์ ์๋ฒ๋ก ๋์ํ ์ ์๋ค.
๋ฉ์์ง ๋ณธ๋ฌธ์ ์ ์ฉ๋๋ "content" ์ฉ์ด๋ RFC 9110์ ์น์ 6.4์ ์ ์๋์ด ์๋ค.
3. HTTP/2 ์์
HTTP ์์ฒญ์ ์์ฑํ๋ ๊ตฌํ์ ์๋ฒ๊ฐ HTTP/2๋ฅผ ์ง์ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ๊ฒฌํด์ผ ํ๋ค.
HTTP/2๋ http ๋ฐ https URI ์คํด์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ RFC 9110์ ์น์ 4.2์ ์ ์๋์ด ์๊ณ HTTP/1.1๊ณผ ๋์ผํ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฌํ URI๋ ์ ์คํธ๋ฆผ ์๋ฒ(ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ์ค์ ํ๋ ค๋ ์ฆ๊ฐ์ ์ธ ํผ์ด)๊ฐ ์ด๋ค HTTP ๋ฒ์ ์ ์ง์ํ๋์ง์ ๋ํ ํ์๋ ํฌํจํ์ง ์๋๋ค.
HTTP/2 ์ง์์ ๊ฒฐ์ ํ๋ ์๋จ์ http์ https URI์ ๋ํด ๋ค๋ฅด๋ค. "https" URI์ ๋ํ ๊ฒ์ ๋ฐฉ๋ฒ์ ์น์ 3.2์ ์ค๋ช ๋์ด ์๋ค. "http" URI์ ๋ํ HTTP/2 ์ง์์ ๋์ญ ์ธ ์๋จ์ผ๋ก๋ง ๋ฐ๊ฒฌํ ์ ์์ผ๋ฉฐ ์ฌ์ ์ง์์ด ํ์ํ๋ค(์์ธํ ๋ด์ฉ์ ์น์ 3.3 ์ฐธ์กฐ).
3.1. HTTP/2 ๋ฒ์ ์๋ณ
์ด ๋ฌธ์์์ ์ ์ํ ํ๋กํ ์ฝ์ ๋ ๊ฐ์ง ์๋ณ์๋ฅผ ๊ฐ์ง๋ค. ์ด๋ ํ๋์ ๊ธฐ๋ฐํ ์ฐ๊ฒฐ์ ์์ฑํ๋ ๊ฒ์ ์ด ๋ฌธ์์ ์ค๋ช ๋ ์ ์ก, ํ๋ ์ด๋ฐ ๋ฐ ๋ฉ์์ง ์๋ฏธ๋ก ์ ์ฌ์ฉ์ ์๋ฏธํ๋ค.
-
๋ฌธ์์ด "h2"๋ HTTP/2๊ฐ ์ ์ก ๊ณ์ธต ๋ณด์(TLS)์ ์ฌ์ฉํ ๋์ ํ๋กํ ์ฝ์ ์๋ณํ๋ค; ์์ธํ ๋ด์ฉ์ ์น์ 9.2๋ฅผ ๋ณด๋ผ. ์ด ์๋ณ์๋ TLS ALPN ํ์ฅ(TLS Application-Layer Protocol Negotiation (ALPN) extension) ํ๋์ TLS ์์์์ HTTP/2๊ฐ ์๋ณ๋๋ ๋ชจ๋ ์ฅ์์์ ์ฌ์ฉ๋๋ค.
"h2" ๋ฌธ์์ด์ ALPN ํ๋กํ ์ฝ ์๋ณ์๋ก ๋ ์ฅํ ์ํ์ค 0x68, 0x32๋ก ์ง๋ ฌํ๋๋ค.
-
๋ฌธ์์ด "h2c"๋ ์ด์ ์ HTTP ์ ๊ทธ๋ ์ด๋ ๋ฉ์ปค๋์ฆ์ Upgrade ํค๋ ํ๋์์ ํ ํฐ์ผ๋ก ์ฌ์ฉ๋์๋ค(์์ธํ ๋ด์ฉ์ RFC 9110์ ์น์ 7.8 ์ฐธ์กฐ). ์ด ์ฌ์ฉ์ ๋๋ฆฌ ๋ฐฐํฌ๋์ง ์์๊ณ ์ด ๋ฌธ์์ ์ํด ์ฌ์ฉ ์ค๋จ(deprecated)๋์๋ค. "h2c"๋ก์ ์ ๊ทธ๋ ์ด๋์ ์ฌ์ฉ๋์๋ HTTP2-Settings ํค๋ ํ๋๋ ๋์ผํ๊ฒ ์ฌ์ฉ ์ค๋จ๋๋ค.
3.2. "https" URI์์ HTTP/2 ์์
"https" URI์ ์์ฒญ์ ํ๋ ํด๋ผ์ด์ธํธ๋ TLS ([TLS13])์ ALPN ํ์ฅ(ALPN extension)๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค.
TLS ์์ HTTP/2๋ "h2" ํ๋กํ ์ฝ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ค. "h2c" ํ๋กํ ์ฝ ์๋ณ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํด์๋ ์ ๋๋ฉฐ(MUST NOT) ์๋ฒ๊ฐ ์ ํํด์๋ ์ ๋๋ค; "h2c" ์๋ณ์๋ TLS๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ๋กํ ์ฝ์ ์ค๋ช ํ๋ค.
TLS ํ์์ด ์๋ฃ๋๋ฉด, ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๊ฐ๊ฐ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค(์น์ 3.4)๋ฅผ ์ ์กํด์ผ ํ๋ค(MUST).
3.3. ์ฌ์ ์ง์์ผ๋ก HTTP/2 ์์
ํด๋ผ์ด์ธํธ๋ ๋ค๋ฅธ ์๋จ์ผ๋ก ํน์ ์๋ฒ๊ฐ HTTP/2๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ HTTP/2๋ฅผ ์ง์ํ๋ค๋ ์ฌ์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์๋ค.
์๋ฒ๊ฐ HTTP/2๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ์๋ ํด๋ผ์ด์ธํธ๋ TCP ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค(์น์ 3.4)๋ฅผ ๋ณด๋ธ ๋ค์ HTTP/2 ํ๋ ์์ ์ ์กํ ์ ์๋ค. ์๋ฒ๋ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค์ ์กด์ฌ๋ก ์ด๋ฌํ ์ฐ๊ฒฐ์ ์๋ณํ ์ ์๋ค. ์ด๋ ํ๋ฌธ TCP ์์ HTTP/2 ์ฐ๊ฒฐ ์๋ฆฝ์๋ง ์ ์ฉ๋๋ค; TLS ์์ HTTP/2 ์ฐ๊ฒฐ์ TLS์์์ ํ๋กํ ์ฝ ํ์์ ์ฌ์ฉํด์ผ ํ๋ค(MUST).
๋ง์ฐฌ๊ฐ์ง๋ก, ์๋ฒ๋ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค(์น์ 3.4)๋ฅผ ์ ์กํด์ผ ํ๋ค(MUST).
์ถ๊ฐ ์ ๋ณด ์์ด ๊ณผ๊ฑฐ์ HTTP/2๋ฅผ ์ง์ํ์๋ค๋ ์ฌ์ค๋ง์ผ๋ก๋ ํฅํ ์ฐ๊ฒฐ์์ ํด๋น ์๋ฒ๊ฐ HTTP/2๋ฅผ ์ง์ํ ๊ฒ์ด๋ผ๋ ๊ฐํ ์ ํธ๊ฐ ๋์ง ์๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ ๊ตฌ์ฑ์ ๋ณ๊ฒฝ๋ ์ ์๊ณ , ํด๋ฌ์คํฐ๋ ์๋ฒ ์ธ์คํด์ค ๊ฐ์ ๊ตฌ์ฑ์ด ๋ค๋ฅผ ์ ์์ผ๋ฉฐ, ๋คํธ์ํฌ ์กฐ๊ฑด์ด ๋ณ๊ฒฝ๋ ์ ์๋ค.
3.4. HTTP/2 ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค
HTTP/2์์ ๊ฐ ์๋ํฌ์ธํธ๋ ์ฌ์ฉ ์ค์ธ ํ๋กํ ์ฝ์ ์ต์ข ํ์ธํ๊ณ HTTP/2 ์ฐ๊ฒฐ์ ์ด๊ธฐ ์ค์ ์ ํ๋ฆฝํ๊ธฐ ์ํด ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ฅผ ์ ์กํด์ผ ํ๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ฅผ ์ ์กํ๋ค.
ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ 24 ์ฅํ ์ ์ํ์ค๋ก ์์ํ๋ฉฐ, 16์ง ํ๊ธฐ๋ฒ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค:
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
์ฆ, ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ ๋ฌธ์์ด "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"์ผ๋ก ์์ํ๋ค. ์ด ์ํ์ค๋ SETTINGS ํ๋ ์(์น์ 6.5)์ด ๋ค๋ฐ๋ผ์ผ ํ๋ฉฐ, ์ด ํ๋ ์์ ๋น์ด ์์ ์ ์๋ค(MAY). ํด๋ผ์ด์ธํธ๋ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ฅผ ์ฐ๊ฒฐ์ ์ฒซ ๋ฒ์งธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ์ฅํ ์ผ๋ก ์ ์กํ๋ค.
์๋ฒ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ ์ ์ฌ์ ์ผ๋ก ๋น์ด ์์ ์ ์๋ SETTINGS ํ๋ ์(์น์ 6.5)์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์๋ฒ๊ฐ HTTP/2 ์ฐ๊ฒฐ์์ ๋ณด๋ด๋ ์ฒซ ๋ฒ์งธ ํ๋ ์์ด์ด์ผ ํ๋ค(MUST).
์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค์ ์ผ๋ถ๋ก ํผ์ด๋ก๋ถํฐ ์์ ๋ SETTINGS ํ๋ ์์ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค ์ ์ก ํ์ ํ์ธ๋์ด์ผ ํ๋ค(ํ์ธ ๋ฐฉ๋ฒ์ ์น์ 6.5.3 ์ฐธ์กฐ).
๋ถํ์ํ ์ง์ฐ์ ํผํ๊ธฐ ์ํด, ํด๋ผ์ด์ธํธ๋ ์๋ฒ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ฅผ ๋ณด๋ธ ์งํ์ ์ถ๊ฐ ํ๋ ์์ ์๋ฒ๋ก ์ ์กํ ์ ์๋ค. ๋ค๋ง ์๋ฒ์ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค SETTINGS ํ๋ ์์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ํต์ ํ๋ ๋ฐฉ์์ ์ํฅ์ ์ฃผ๋ ์ค์ ์ด ํฌํจ๋ ์ ์๋ค๋ ์ ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค. SETTINGS ํ๋ ์์ ์์ ํ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ค์ ์ ์กด์คํด์ผ ํ๋ค. ์ผ๋ถ ๊ตฌ์ฑ์์๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ถ๊ฐ ํ๋ ์์ ๋ณด๋ด๊ธฐ ์ ์ SETTINGS๋ฅผ ์ ์กํ ์ ์์ด ์ด ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์ ํจํ์ง ์์ ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค๋ฅผ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST). ์ด ๊ฒฝ์ฐ ํผ์ด๊ฐ HTTP/2๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋ํ๋ด๋ฏ๋ก GOAWAY ํ๋ ์(์น์ 6.8)์ ์๋ต๋ ์ ์๋ค(MAY).
4. HTTP ํ๋ ์
HTTP/2 ์ฐ๊ฒฐ์ด ์ค์ ๋๋ฉด ์๋ํฌ์ธํธ๋ค์ ํ๋ ์ ๊ตํ์ ์์ํ ์ ์๋ค.
4.1. ํ๋ ์ ํ์
๋ชจ๋ ํ๋ ์์ ๊ณ ์ ๊ธธ์ด 9์ฅํ ํค๋๋ก ์์ํ๊ณ ์ด์ด์ ๊ฐ๋ณ ๊ธธ์ด์ ํ๋ ์ ํ์ด๋ก๋๊ฐ ์จ๋ค.
HTTP Frame {
Length (24),
Type (8),
Flags (8),
Reserved (1),
Stream Identifier (31),
Frame Payload (..),
}
๊ทธ๋ฆผ 1: ํ๋ ์ ๋ ์ด์์
ํ๋ ์ ํค๋์ ํ๋๋ค์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค:
- Length:
-
ํ๋ ์ ํ์ด๋ก๋์ ๊ธธ์ด๋ก, ์ฅํ ๋จ์์ ๋ถํธ ์๋ 24๋นํธ ์ ์๋ก ํํ๋๋ค. ์์ ์๊ฐ SETTINGS_MAX_FRAME_SIZE์ ๋ํด ๋ ํฐ ๊ฐ์ ์ค์ ํ์ง ์์ ํ 214(16,384)๋ณด๋ค ํฐ ๊ฐ์ ์ ์กํด์๋ ์ ๋๋ค(MUST NOT).ํ๋ ์ ํค๋์ 9 ์ฅํ ์ ์ด ๊ฐ์ ํฌํจ๋์ง ์๋๋ค.
- Type:
-
ํ๋ ์์ 8๋นํธ ์ ํ. ํ๋ ์ ์ ํ์ ํ๋ ์์ ํ์๊ณผ ์๋ฏธ๋ก ์ ๊ฒฐ์ ํ๋ค. ๋ณธ ๋ฌธ์์ ์ ์๋ ํ๋ ์์ ์น์ 6์ ์ด๊ฑฐ๋์ด ์๋ค. ๊ตฌํ์ฒด๋ ์ ์ ์๋ ์ ํ์ ํ๋ ์์ ๋ฌด์ํ๊ณ ํ๊ธฐํด์ผ ํ๋ค(MUST).
- Flags:
-
ํ๋ ์ ์ ํ๋ณ ๋ถ๋ฆฌ์ธ ํ๋๊ทธ๋ฅผ ์ํด ์์ฝ๋ 8๋นํธ ํ๋.ํ๋๊ทธ๋ ์ง์ ๋ ํ๋ ์ ์ ํ์ ๋ํด ํน์ ํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ์ฌ์ฉ๋์ง ์๋ ํ๋๊ทธ๋ ํน์ ํ๋ ์ ์ ํ์ ๋ํด ์ ์๋ ์๋ฏธ๊ฐ ์๋ ํ๋๊ทธ๋ค์ด๋ค. ์ฌ์ฉ๋์ง ์๋ ํ๋๊ทธ๋ ์์ ์ ๋ฌด์๋์ด์ผ ํ๊ณ (MUST), ์ ์ก ์ ์ค์ ๋์ง ์์ ์ํ(0x00)๋ก ๋จ๊ฒจ์ ธ์ผ ํ๋ค(MUST).
- Reserved:
-
์์ฝ๋ 1๋นํธ ํ๋. ์ด ๋นํธ์ ์๋ฏธ๋ก ์ ์ ์๋์ด ์์ง ์์ผ๋ฉฐ, ์ ์ก ์์๋ 0x00์ผ๋ก ์ค์ ๋์ด ์์ด์ผ ํ๊ณ (MUST), ์์ ์์๋ ๋ฌด์๋์ด์ผ ํ๋ค(MUST).
- Stream Identifier:
-
์คํธ๋ฆผ ์๋ณ์(์์ธํ ๋ด์ฉ์ ์น์ 5.1.1 ์ฐธ์กฐ)๋ก, ๋ถํธ ์๋ 31๋นํธ ์ ์๋ก ํํ๋๋ค. ๊ฐ 0x00์ ๊ฐ๋ณ ์คํธ๋ฆผ์ด ์๋ ์ ์ฒด ์ฐ๊ฒฐ๊ณผ ์ฐ๊ด๋ ํ๋ ์์ ์์ฝ๋์ด ์๋ค.
ํ๋ ์ ํ์ด๋ก๋์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ์ ์ ์ผ๋ก ํ๋ ์ ์ ํ์ ์์กดํ๋ค.
4.2. ํ๋ ์ ํฌ๊ธฐ
ํ๋ ์ ํ์ด๋ก๋์ ํฌ๊ธฐ๋ ์์ ์๊ฐ SETTINGS_MAX_FRAME_SIZE ์ค์ ์์ ๊ด๊ณ ํ ์ต๋ ํฌ๊ธฐ๋ก ์ ํ๋๋ค. ์ด ์ค์ ์ 214(16,384)์์ 224-1(16,777,215) ์ฅํ ์ฌ์ด์ ์ด๋ค ๊ฐ์ด๋ ๊ฐ์ง ์ ์๋ค.
๋ชจ๋ ๊ตฌํ์ฒด๋ 214 ์ฅํ ๊ธธ์ด์ ํ๋ ์(ํ๋ ์ ํค๋ 9์ฅํ ์ ์ธ)์ ์์ ํ๊ณ ์ต์ํ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค(MUST). ํ๋ ์ ํฌ๊ธฐ๋ฅผ ์ค๋ช ํ ๋ ํ๋ ์ ํค๋์ ํฌ๊ธฐ๋ ํฌํจ๋์ง ์๋๋ค.
ํ๋ ์์ด SETTINGS_MAX_FRAME_SIZE์ ์ ์๋ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๊ฑฐ๋ ํ๋ ์ ์ ํ์ ๋ํด ์ ์๋ ์ด๋ค ์ ํ์ ์ด๊ณผํ๊ฑฐ๋ ํ์ ํ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ธฐ์๋ ๋๋ฌด ์์ผ๋ฉด ์๋ํฌ์ธํธ๋ FRAME_SIZE_ERROR ์ค๋ฅ ์ฝ๋๋ฅผ ์ ์กํด์ผ ํ๋ค(MUST). ์ ์ฒด ์ฐ๊ฒฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ํ๋ ์์์์ ํ๋ ์ ํฌ๊ธฐ ์ค๋ฅ๋ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST); ์ฌ๊ธฐ์๋ ํ๋ ๋ธ๋ก์ ๋ด๋ ํ๋ ์(์น์ 4.3)(์ฆ, HEADERS, PUSH_PROMISE, ๋ฐ CONTINUATION), SETTINGS ํ๋ ์, ๋ฐ ์คํธ๋ฆผ ์๋ณ์๊ฐ 0์ธ ๋ชจ๋ ํ๋ ์์ด ํฌํจ๋๋ค.
์๋ํฌ์ธํธ๋ ํ๋ ์์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ณต๊ฐ์ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋ค. ํ์ฉ๋ ์ต๋ ํฌ๊ธฐ๋ณด๋ค ์์ ํ๋ ์์ ์ฌ์ฉํ๋ฉด ์๋ต์ฑ์ด ํฅ์๋ ์ ์๋ค. ํฐ ํ๋ ์์ ์ ์กํ๋ฉด ์๊ธฐ ๋ฏผ๊ฐํ ํ๋ ์(์: RST_STREAM, WINDOW_UPDATE, ๋๋ PRIORITY)์ ์ ์ก์ด ์ง์ฐ๋ ์ ์์ผ๋ฉฐ, ํฐ ํ๋ ์์ ์ ์ก์ผ๋ก ์ฐจ๋จ๋๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
4.3. ํ๋ ์น์ ์์ถ ๋ฐ ์์ถ ํด์
ํ๋ ์น์ ์์ถ์ ํ๋ ๋ผ์ธ ์งํฉ(RFC 9110 ์น์ 5.2 ์ฐธ์กฐ)์ ์์ถํ์ฌ ํ๋ ๋ธ๋ก์ ํ์ฑํ๋ ๊ณผ์ ์ด๋ค. ํ๋ ์น์ ์์ถ ํด์ ๋ ํ๋ ๋ธ๋ก์ ํ๋ ๋ผ์ธ ์งํฉ์ผ๋ก ๋์ฝ๋ฉํ๋ ๊ณผ์ ์ด๋ค. HTTP/2 ํ๋ ์น์ ์ ์์ถ ๋ฐ ์์ถ ํด์ ์ ๋ํ ์ธ๋ถ์ฌํญ์ [COMPRESSION]์์ ์ ์๋๋ฉฐ, ์ญ์ฌ์ ์ด์ ๋ก ์ด ๊ณผ์ ๋ค์ ํค๋ ์์ถ ๋ฐ ์์ถ ํด์ ๋ผ ๋ถ๋ฅธ๋ค.
๊ฐ ํ๋ ๋ธ๋ก์ ๋จ์ผ ํ๋ ์น์ ์ ๋ชจ๋ ์์ถ๋ ํ๋ ๋ผ์ธ์ ์ด๋ฐํ๋ค. ํค๋ ์น์ ์ ์์ฌ-ํค๋ ํ๋ ํํ์ ๋ฉ์์ง ๊ด๋ จ ์ ์ด ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ฉฐ(์น์ 8.3), ์ด๋ ํ๋ ๋ผ์ธ๊ณผ ๋์ผํ ํ์์ ์ฌ์ฉํ๋ค.
ํ๋ ๋ธ๋ก์ ์์ฒญ, ์๋ต, ์ฝ์๋ ์์ฒญ ๋ฐ ํธ์๋ ์๋ต์ ์ ์ด ๋ฐ์ดํฐ์ ํค๋ ์น์ ์ ์ด๋ฐํ๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.4 ์ฐธ์กฐ). ์์ ์๋ต ๋ฐ PUSH_PROMISE(์น์ 6.6) ํ๋ ์์ ํฌํจ๋ ์์ฒญ์ ์ ์ธํ ๋ชจ๋ ์ด๋ฌํ ๋ฉ์์ง๋ ์ ํ์ ์ผ๋ก ํธ๋ ์ผ๋ฌ ์น์ ์ ์ด๋ฐํ๋ ํ๋ ๋ธ๋ก์ ํฌํจํ ์ ์๋ค.
ํ๋ ์น์ ์ ํ๋ ๋ผ์ธ์ ๋ชจ์์ด๋ค. ํ๋ ๋ธ๋ก์ ๊ฐ ํ๋ ๋ผ์ธ์ ๋จ์ผ ๊ฐ์ ์ด๋ฐํ๋ค. ์ง๋ ฌํ๋ ํ๋ ๋ธ๋ก์ ํ๋ ๋ธ๋ก ์กฐ๊ฐ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ๋ ์ด์์ ์ฅํ ์ํ์ค๋ก ๋๋์ด์ง๋ค. ์ฒซ ๋ฒ์งธ ํ๋ ๋ธ๋ก ์กฐ๊ฐ์ HEADERS(์น์ 6.2) ๋๋ PUSH_PROMISE(์น์ 6.6) ํ๋ ์์ ํ๋ ์ ํ์ด๋ก๋ ๋ด์์ ์ ์ก๋๋ฉฐ, ์ดํ์ ํ๋ ๋ธ๋ก ์กฐ๊ฐ์ CONTINUATION(์น์ 6.10) ํ๋ ์๋ค์ ์ํด ์ด๋ฐ๋ ์ ์๋ค.
Cookie header field๋ HTTP ๋งคํ์์ ํน์ํ๊ฒ ์ทจ๊ธ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.2.3 ์ฐธ์กฐ).
์์ ์๋ํฌ์ธํธ๋ ์กฐ๊ฐ๋ค์ ์ฐ๊ฒฐํ์ฌ ํ๋ ๋ธ๋ก์ ์ฌ์กฐ๋ฆฝํ ๋ค์ ๋ธ๋ก์ ์์ถ ํด์ ํ์ฌ ํ๋ ์น์ ์ ์ฌ๊ตฌ์ฑํ๋ค.
์์ ํ ํ๋ ์น์ ์ ๋ค์ ์ค ํ๋๋ก ๊ตฌ์ฑ๋๋ค:
- END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋ ๋จ์ผ HEADERS ๋๋ PUSH_PROMISE ํ๋ ์, ๋๋
- END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ HEADERS ๋๋ PUSH_PROMISE ํ๋ ์๊ณผ ํ๋ ์ด์์ CONTINUATION ํ๋ ์, ๋จ ๋ง์ง๋ง CONTINUATION ํ๋ ์์ END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ.
๊ฐ ํ๋ ๋ธ๋ก์ ๊ฐ๋ณ ๋จ์๋ก ์ฒ๋ฆฌ๋๋ค. ํ๋ ๋ธ๋ก์ ๋ค๋ฅธ ์ ํ์ ํ๋ ์์ด๋ ๋ค๋ฅธ ์คํธ๋ฆผ์ ํ๋ ์๊ณผ ๊ต์ฐจ๋์ง ์๋ ์ฐ์์ ์ธ ํ๋ ์ ์ํ์ค๋ก ์ ์ก๋์ด์ผ ํ๋ค(MUST). HEADERS ๋๋ CONTINUATION ํ๋ ์ ์ํ์ค์ ๋ง์ง๋ง ํ๋ ์์๋ END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ด์ผ ํ๋ค. PUSH_PROMISE ๋๋ CONTINUATION ํ๋ ์ ์ํ์ค์ ๋ง์ง๋ง ํ๋ ์์๋ END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ด์ผ ํ๋ค. ์ด๋ ํ๋ ๋ธ๋ก์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋จ์ผ ํ๋ ์๊ณผ ๋๋ฑํ๋๋ก ํ๋ค.
ํ๋ ๋ธ๋ก ์กฐ๊ฐ์ HEADERS, PUSH_PROMISE ๋๋ CONTINUATION ํ๋ ์์ ํ๋ ์ ํ์ด๋ก๋๋ก๋ง ์ ์ก๋ ์ ์๋ค. ์ด ํ๋ ์๋ค์ ์์ ์๊ฐ ์ ์งํ๋ ์์ถ ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. HEADERS, PUSH_PROMISE ๋๋ CONTINUATION ํ๋ ์์ ์์ ํ๋ ์๋ํฌ์ธํธ๋ ํ๋ ์์ ํ๊ธฐํ๋๋ผ๋ ํ๋ ๋ธ๋ก์ ์ฌ์กฐ๋ฆฝํ๊ณ ์์ถ ํด์ ๋ฅผ ์ํํด์ผ ํ๋ค. ์์ ์๊ฐ ํ๋ ๋ธ๋ก์ ์์ถ ํด์ ํ์ง ์์ผ๋ฉด ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ COMPRESSION_ERROR๋ก ์ฐ๊ฒฐ์ ์ข ๋ฃํด์ผ ํ๋ค(MUST).
ํ๋ ๋ธ๋ก์ ๋์ฝ๋ฉ ์ค๋ฅ๋ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ COMPRESSION_ERROR๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
4.3.1. ์์ถ ์ํ
ํ๋ ์์ถ์ ์ํ ๊ธฐ๋ฐ์ด๋ค. ๊ฐ ์๋ํฌ์ธํธ๋ ์ฐ๊ฒฐ์ ๋ชจ๋ ํ๋ ๋ธ๋ก์ ์ธ์ฝ๋ฉํ๊ณ ๋์ฝ๋ฉํ๊ธฐ ์ํด HPACK ์ธ์ฝ๋ ์ปจํ ์คํธ์ HPACK ๋์ฝ๋ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง๋ค. RFC 7541์ ์น์ 4๋ ๋์ ํ ์ด๋ธ์ ์ ์ํ๋ฉฐ, ์ด๋ ๊ฐ ์ปจํ ์คํธ์ ์ฃผ์ ์ํ์ด๋ค.
๋์ ํ ์ด๋ธ์ HPACK ๋์ฝ๋๊ฐ ์ค์ ํ๋ ์ต๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ์๋ํฌ์ธํธ๋ ์์ ์ HPACK ๋์ฝ๋ ์ปจํ ์คํธ๊ฐ ์ ํํ ํฌ๊ธฐ๋ฅผ SETTINGS_HEADER_TABLE_SIZE ์ค์ ์ ์ฌ์ฉํ์ฌ ํต์ ํ๋ค(์์ธํ ๋ด์ฉ์ ์น์ 6.5.2 ์ฐธ์กฐ). ์ฐ๊ฒฐ์ด ์๋ฆฝ๋๋ฉด ์์ชฝ ์๋ํฌ์ธํธ์ HPACK ๋์ฝ๋์ ์ธ์ฝ๋์ ๋์ ํ ์ด๋ธ ํฌ๊ธฐ๋ SETTINGS_HEADER_TABLE_SIZE ์ค์ ์ ์ด๊ธฐ๊ฐ์ธ 4,096 ๋ฐ์ดํธ๋ก ์์ํ๋ค.
SETTINGS_HEADER_TABLE_SIZE๋ฅผ ์ฌ์ฉํด ์ค์ ๋ ์ต๋๊ฐ์ ๋ณ๊ฒฝ์ ์๋ํฌ์ธํธ๊ฐ ์ค์ ์ ํ์ธํ ๋(์น์ 6.5.3) ํจ๋ ฅ์ด ๋ฐ์ํ๋ค. ํด๋น ์๋ํฌ์ธํธ์ HPACK ์ธ์ฝ๋๋ ๋์ฝ๋๊ฐ ์ค์ ํ ์ต๋๊ฐ๊น์ง ์์์ ํฌ๊ธฐ๋ก ๋์ ํ ์ด๋ธ์ ์ค์ ํ ์ ์๋ค. HPACK ์ธ์ฝ๋๋ Dynamic Table Size Update ์ง์์ด(RFC 7541 ์น์ 6.3)๋ก ๋์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ์ ์ธํ๋ค.
์๋ํฌ์ธํธ๊ฐ ๋์ ํ ์ด๋ธ์ ์ต๋๊ฐ์ ์ค์ด๋ SETTINGS_HEADER_TABLE_SIZE ๋ณ๊ฒฝ์ ํ์ธํ ํ์๋, ๊ทธ ์๋ํฌ์ธํธ์ HPACK ์ธ์ฝ๋๋ ๋ค์ ํ๋ ๋ธ๋ก์ ๋์ ํ ์ด๋ธ์ ์ค์ฌ์ง ์ต๋๊ฐ ์ดํ์ ํฌ๊ธฐ๋ก ์ค์ ํ๋ Dynamic Table Size Update ์ง์์ด๋ก ์์ํด์ผ ํ๋ค(RFC 7541 ์น์ 4.2 ์ฐธ์กฐ). ์๋ํฌ์ธํธ๋ ์ถ์ ํ์ธ ์ดํ์ ์ค๋ ํ๋ ๋ธ๋ก์ด ์ ํฉํ Dynamic Table Size Update ์ง์์ด๋ก ์์ํ์ง ์์ผ๋ฉด ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ COMPRESSION_ERROR๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
5. ์คํธ๋ฆผ๊ณผ ๋ค์คํ
"์คํธ๋ฆผ"์ HTTP/2 ์ฐ๊ฒฐ ๋ด์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๊ตํ๋๋ ๋ ๋ฆฝ์ ์ธ ์๋ฐฉํฅ ํ๋ ์ ์ฐ์์ ๋๋ค. ์คํธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ํน์ฑ์ ๊ฐ์ง๋๋ค:
- ๋จ์ผ HTTP/2 ์ฐ๊ฒฐ์ ์ฌ๋ฌ ๊ฐ์ ๋์ ์ด๋ฆฐ ์คํธ๋ฆผ์ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ์ชฝ ์๋ํฌ์ธํธ๊ฐ ์ฌ๋ฌ ์คํธ๋ฆผ์ ํ๋ ์์ ๊ต์ฐจ ์ ์กํ ์ ์์ต๋๋ค.
- ์คํธ๋ฆผ์ ์ผ๋ฐฉ์ ์ผ๋ก ์ค์ ๋์ด ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์ด๋ ์ชฝ ์๋ํฌ์ธํธ์์๋ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ์คํธ๋ฆผ์ ์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ผ๋ ๋ซ์ ์ ์์ต๋๋ค.
- ํ๋ ์์ด ์ ์ก๋๋ ์์๋ ์ค์ํฉ๋๋ค. ์์ ์๋ ํ๋ ์์ ์์ ๋ ์์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ํนํ HEADERS ๋ฐ DATA ํ๋ ์์ ์์๋ ์๋ฏธ๋ก ์ ์ผ๋ก ์ค์ํฉ๋๋ค.
- ์คํธ๋ฆผ์ ์ ์๋ก ์๋ณ๋ฉ๋๋ค. ์คํธ๋ฆผ ์๋ณ์๋ ์คํธ๋ฆผ์ ์์ํ๋ ์๋ํฌ์ธํธ๊ฐ ์คํธ๋ฆผ์ ํ ๋นํฉ๋๋ค.
5.1. ์คํธ๋ฆผ ์ํ
์คํธ๋ฆผ์ ์๋ช ์ฃผ๊ธฐ๋ ๊ทธ๋ฆผ 2์ ๋์ ์์ต๋๋ค.
๊ทธ๋ฆผ 2: ์คํธ๋ฆผ ์ํ
- send:
- ํด๋น ์๋ํฌ์ธํธ๊ฐ ์ด ํ๋ ์์ ์ ์กํจ
- recv:
- ํด๋น ์๋ํฌ์ธํธ๊ฐ ์ด ํ๋ ์์ ์์ ํจ
- H:
- HEADERS ํ๋ ์ (์๋ฌต์ ์ธ CONTINUATION ํ๋ ์ ํฌํจ)
- ES:
- END_STREAM ํ๋๊ทธ
- R:
- RST_STREAM ํ๋ ์
- PP:
- PUSH_PROMISE ํ๋ ์ (์๋ฌต์ ์ธ CONTINUATION ํ๋ ์ ํฌํจ); ์ํ ์ ์ด๋ ์ฝ์๋ ์คํธ๋ฆผ์ ๋ํด ์ ์ฉ๋ฉ๋๋ค
์ด ๋ค์ด์ด๊ทธ๋จ์ ์คํธ๋ฆผ ์ํ ์ ์ด์ ๊ทธ ์ ์ด์ ์ํฅ์ ์ฃผ๋ ํ๋ ์ ๋ฐ ํ๋๊ทธ๋ง์ ๋ณด์ฌ์ค๋๋ค. ์ด ์ ์์ CONTINUATION ํ๋ ์์ ์ํ ์ ์ด๋ฅผ ์ผ์ผํค์ง ์์ผ๋ฉฐ, ๊ทธ๊ฒ๋ค์ด ๋ค๋ฐ๋ฅด๋ HEADERS ๋๋ PUSH_PROMISE์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ํ ์ ์ด๋ฅผ ์ํด END_STREAM ํ๋๊ทธ๋ ๊ทธ๊ฒ์ ํฌํจํ๋ ํ๋ ์๊ณผ ๋ณ๊ฐ์ ์ด๋ฒคํธ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค; END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ HEADERS ํ๋ ์์ ๋ ๋ฒ์ ์ํ ์ ์ด๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
์์ชฝ ์๋ํฌ์ธํธ๋ ์คํธ๋ฆผ ์ํ์ ๋ํด ์ฃผ๊ด์ ์ธ ๊ด์ ์ ๊ฐ์ง๋ฉฐ, ํ๋ ์์ด ์ ์ก ์ค์ผ ๋ ์ํ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์๋ํฌ์ธํธ๋ ์คํธ๋ฆผ์ ์์ฑ์ ๋ํด ์กฐ์จํ์ง ์์ผ๋ฉฐ; ์คํธ๋ฆผ์ ์ด๋ ์ชฝ ์๋ํฌ์ธํธ์ ์ํด์๋ ์ผ๋ฐฉ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์ํ ๋ถ์ผ์น์ ๋ถ์ ์ ๊ฒฐ๊ณผ๋ RST_STREAM ์ ์ก ์ดํ์ "closed" ์ํ๋ก ์ ํ๋๋ฉฐ, ์ด ๊ฒฝ์ฐ ์คํธ๋ฆผ์ ๋ซ์ ํ์๋ ์ ์ ๋์ ํ๋ ์์ด ์์ ๋ ์ ์์ต๋๋ค.
์คํธ๋ฆผ์ ๋ค์ ์ํ๋ฅผ ๊ฐ์ง๋๋ค:
- idle:
-
๋ชจ๋ ์คํธ๋ฆผ์ "idle" ์ํ์์ ์์ํฉ๋๋ค.์ด ์ํ์์ ๋ค์ ์ ์ด๋ค์ด ์ ํจํฉ๋๋ค:
- ํด๋ผ์ด์ธํธ๋ก์ HEADERS ํ๋ ์์ ์ ์กํ๊ฑฐ๋ ์๋ฒ๋ก์ HEADERS ํ๋ ์์ ์์ ํ๋ฉด ์คํธ๋ฆผ์ "open"์ด ๋ฉ๋๋ค. ์คํธ๋ฆผ ์๋ณ์๋ ์น์ 5.1.1์์ ์ค๋ช ํ ๋๋ก ์ ํ๋ฉ๋๋ค. ๋์ผํ HEADERS ํ๋ ์์ ์คํธ๋ฆผ์ ์ฆ์ "half-closed"๋ก ๋ง๋ค ์๋ ์์ต๋๋ค.
- ๋ค๋ฅธ ์คํธ๋ฆผ์์ PUSH_PROMISE ํ๋ ์์ ์ ์กํ๋ฉด ๋์ค์ ์ฌ์ฉํ ์๋ณ์๊ฐ ์๋ idle ์คํธ๋ฆผ์ ์์ฝํฉ๋๋ค. ์์ฝ๋ ์คํธ๋ฆผ์ ์ํ๋ "reserved (local)"๋ก ์ ์ด๋ฉ๋๋ค. ์ค์ง ์๋ฒ๋ง PUSH_PROMISE ํ๋ ์์ ์ ์กํ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ ์คํธ๋ฆผ์์ PUSH_PROMISE ํ๋ ์์ ์์ ํ๋ฉด ๋์ค์ ์ฌ์ฉํ ์๋ณ์๊ฐ ์๋ idle ์คํธ๋ฆผ์ด ์์ฝ๋ฉ๋๋ค. ์์ฝ๋ ์คํธ๋ฆผ์ ์ํ๋ "reserved (remote)"๋ก ์ ์ด๋ฉ๋๋ค. ์ค์ง ํด๋ผ์ด์ธํธ๋ง PUSH_PROMISE ํ๋ ์์ ์์ ํ ์ ์์ต๋๋ค.
- PUSH_PROMISE ํ๋ ์์ idle ์คํธ๋ฆผ์์ ์ ์ก๋๋ ๊ฒ์ด ์๋๋ผ Promised Stream ID ํ๋์์ ์๋ก ์์ฝ๋ ์คํธ๋ฆผ์ ์ฐธ์กฐํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
- ๋ ํฐ ๊ฐ์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์คํธ๋ฆผ์ ์ด๋ฉด ํด๋น ์คํธ๋ฆผ์ ์ฆ์ "closed" ์ํ๋ก ์ ์ด๋ฉ๋๋ค; ์ด ์ ์ด๋ ๋ค์ด์ด๊ทธ๋จ์ ํ์๋์ง ์์ต๋๋ค.
HEADERS ๋๋ PRIORITY ์ด์ธ์ ๋ชจ๋ ํ๋ ์์ ์ด ์ํ์ ์คํธ๋ฆผ์์ ์์ ํ๋ ๊ฒ์ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ์ค๋ฅ ์ ํ์ PROTOCOL_ERROR์ ๋๋ค. ์ด ์คํธ๋ฆผ์ด ์๋ฒ์ ์ํด ์์๋ ๊ฒฝ์ฐ(์น์ 5.1.1 ์ฐธ์กฐ), HEADERS ํ๋ ์์ ์์ ํ๋ ๊ฒ๋ ์ฐ๊ฒฐ ์ค๋ฅ(PROTOCOL_ERROR)๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. - reserved (local):
-
"reserved (local)" ์ํ์ ์คํธ๋ฆผ์ PUSH_PROMISE ํ๋ ์์ ์ ์กํ์ฌ ์ฝ์๋ ์คํธ๋ฆผ์ ๋๋ค. PUSH_PROMISE ํ๋ ์์ ์๊ฒฉ ํผ์ด๊ฐ ์์ํ ์ด๋ฆฐ ์คํธ๋ฆผ๊ณผ ์ฐ๊ด์์ผ idle ์คํธ๋ฆผ์ ์์ฝํฉ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.4 ์ฐธ์กฐ).์ด ์ํ์์๋ ๋ค์ ์ ์ด๋ง ๊ฐ๋ฅํฉ๋๋ค:
- ์๋ํฌ์ธํธ๋ HEADERS ํ๋ ์์ ์ ์กํ ์ ์์ต๋๋ค. ์ด๋ ์คํธ๋ฆผ์ "half-closed (remote)" ์ํ๋ก ์ฝ๋๋ค.
- ์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ RST_STREAM ํ๋ ์์ ์ ์กํ์ฌ ์คํธ๋ฆผ์ "closed"๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ์คํธ๋ฆผ ์์ฝ์ ํด์ ํฉ๋๋ค.
์ด ์ํ์์ ์๋ํฌ์ธํธ๋ HEADERS, RST_STREAM, ๋๋ PRIORITY ์ด์ธ์ ์ด๋ค ์ข ๋ฅ์ ํ๋ ์๋ ์ ์กํด์๋ ์ ๋ฉ๋๋ค(MUST NOT).PRIORITY ๋๋ WINDOW_UPDATE ํ๋ ์์ ์ด ์ํ์์ MAY ์์ ๋ ์ ์์ต๋๋ค. ์ด ์ํ์ ์คํธ๋ฆผ์์ RST_STREAM, PRIORITY, ๋๋ WINDOW_UPDATE ์ด์ธ์ ์ด๋ค ํ๋ ์์ ์์ ํ๋ฉด ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ์ค๋ฅ ์ ํ์ PROTOCOL_ERROR์ ๋๋ค. - reserved (remote):
-
"reserved (remote)" ์ํ์ ์คํธ๋ฆผ์ ์๊ฒฉ ํผ์ด์ ์ํด ์์ฝ๋ ์คํธ๋ฆผ์ ๋๋ค.์ด ์ํ์์๋ ๋ค์ ์ ์ด๋ง ๊ฐ๋ฅํฉ๋๋ค:
- HEADERS ํ๋ ์์ ์์ ํ๋ฉด ์คํธ๋ฆผ์ "half-closed (local)"๋ก ์ ์ด๋ฉ๋๋ค.
- ์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ RST_STREAM ํ๋ ์์ ์ ์กํ์ฌ ์คํธ๋ฆผ์ "closed"๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ์คํธ๋ฆผ ์์ฝ์ ํด์ ํฉ๋๋ค.
์ด ์ํ์์๋ RST_STREAM, WINDOW_UPDATE, ๋๋ PRIORITY ์ด์ธ์ ํ๋ ์์ ์ ์กํด์๋ ์ ๋ฉ๋๋ค(MUST NOT).์ด ์ํ์ ์คํธ๋ฆผ์์ HEADERS, RST_STREAM, ๋๋ PRIORITY ์ด์ธ์ ์ด๋ค ํ๋ ์์ ์์ ํ๋ฉด ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ์ค๋ฅ ์ ํ์ PROTOCOL_ERROR์ ๋๋ค. - open:
-
"open" ์ํ์ ์คํธ๋ฆผ์ ์์ชฝ ํผ์ด๊ฐ ๋ชจ๋ ์ ํ์ ํ๋ ์์ ์ ์กํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์ํ์์ ์ ์กํ๋ ์ชฝ์ ๊ด๊ณ ๋ ์คํธ๋ฆผ ์์ค ํ๋ฆ ์ ์ด ํ๋๋ฅผ ์ค์ํฉ๋๋ค(์น์ 5.2).์ด ์ํ์์ ์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ ์ ์กํ ์ ์์ผ๋ฉฐ, ์ด๋ ์คํธ๋ฆผ์ "half-closed" ์ํ ์ค ํ๋๋ก ์ ์ด์ํต๋๋ค. END_STREAM ํ๋๊ทธ๋ฅผ ์ ์กํ ์ชฝ์ ์คํธ๋ฆผ ์ํ๊ฐ "half-closed (local)"๊ฐ ๋๊ณ , END_STREAM ํ๋๊ทธ๋ฅผ ์์ ํ ์ชฝ์ ์คํธ๋ฆผ ์ํ๊ฐ "half-closed (remote)"๊ฐ ๋ฉ๋๋ค.์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ ์ด ์ํ์์ RST_STREAM ํ๋ ์์ ์ ์กํ์ฌ ์ฆ์ "closed"๋ก ์ ์ด์ํฌ ์ ์์ต๋๋ค.
- half-closed (local):
-
"half-closed (local)" ์ํ์ ์คํธ๋ฆผ์ WINDOW_UPDATE, PRIORITY, ๋ฐ RST_STREAM์ ์ ์ธํ ํ๋ ์์ ์ ์กํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ์ํ๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ ์์ ํ๊ฑฐ๋ ์ด๋ ์ชฝ ํผ์ด๊ฐ RST_STREAM ํ๋ ์์ ์ ์กํ๋ฉด "closed"๋ก ์ ์ด๋ฉ๋๋ค.์ด ์ํ์์๋ ์ด๋ค ์ ํ์ ํ๋ ์๋ ์์ ํ ์ ์์ต๋๋ค. ์์ ๋ ํ๋ฆ ์ ์ด ํ๋ ์์ ์ฒ๋ฆฌ๋ฅผ ๊ณ์ํ๋ ค๋ฉด WINDOW_UPDATE ํ๋ ์์ ์ฌ์ฉํ์ฌ ํ๋ฆ ์ ์ด ํฌ๋ ๋ง์ ์ ๊ณตํ๋ ๊ฒ์ด ํ์ํ ์ ์์ต๋๋ค. ์ด ์ํ์์๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ด ์ ์ก๋ ํ์๋ ์ ์ ๋์ WINDOW_UPDATE ํ๋ ์์ด ๋์ฐฉํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.PRIORITY ํ๋ ์์ ์ด ์ํ์์ ์์ ๋ ์ ์์ต๋๋ค.
- half-closed (remote):
-
"half-closed (remote)" ์ํ์ ์คํธ๋ฆผ์ ์๊ฒฉ ํผ์ด๊ฐ ๋ ์ด์ ํ๋ ์ ์ ์ก์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ด ์ํ์์ ์๋ํฌ์ธํธ๋ ์์ ์ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ ์งํ ์๋ฌด๊ฐ ์์ต๋๋ค.์ด ์ํ์ ์คํธ๋ฆผ์์ WINDOW_UPDATE, PRIORITY, ๋๋ RST_STREAM ์ด์ธ์ ์ถ๊ฐ ํ๋ ์์ ์์ ํ๋ฉด ์คํธ๋ฆผ ์ค๋ฅ(์น์ 5.4.2)๋ก STREAM_CLOSED ์ ํ์ ์๋ต์ ํด์ผ ํฉ๋๋ค(MUST)."half-closed (remote)" ์ํ์ ์คํธ๋ฆผ์ ์๋ํฌ์ธํธ๊ฐ ๋ชจ๋ ์ ํ์ ํ๋ ์์ ์ ์กํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์ํ์์ ์๋ํฌ์ธํธ๋ ๊ณ์ํด์ ๊ด๊ณ ๋ ์คํธ๋ฆผ ์์ค ํ๋ฆ ์ ์ด ํ๋๋ฅผ ์ค์ํฉ๋๋ค(์น์ 5.2).์ด ์ํ์ ์คํธ๋ฆผ์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ ์ ์กํ๊ฑฐ๋ ์ด๋ ์ชฝ ํผ์ด๊ฐ RST_STREAM ํ๋ ์์ ์ ์กํ๋ฉด "closed"๋ก ์ ์ด๋ ์ ์์ต๋๋ค.
- closed:
-
"closed" ์ํ๋ ์ข ๋ฃ ์ํ์ ๋๋ค.์คํธ๋ฆผ์ ์๋ํฌ์ธํธ๊ฐ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ ์ ์กํ๊ณ ์์ ํ ํ "closed" ์ํ์ ๋ค์ด๊ฐ๋๋ค. ๋ํ ์๋ํฌ์ธํธ๊ฐ RST_STREAM ํ๋ ์์ ์ ์กํ๊ฑฐ๋ ์์ ํ ํ์๋ "closed" ์ํ๊ฐ ๋ฉ๋๋ค.์๋ํฌ์ธํธ๋ ๋ซํ ์คํธ๋ฆผ์์ PRIORITY ์ด์ธ์ ํ๋ ์์ ์ ์กํด์๋ ์ ๋ฉ๋๋ค(MUST NOT). ์๋ํฌ์ธํธ๋ ๋ซํ ์คํธ๋ฆผ์์ ๋ค๋ฅธ ์ ํ์ ํ๋ ์์ ์์ ํ๋ ๊ฒ์ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ STREAM_CLOSED๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(MAY), ์๋์ ์ธ๊ธ๋ ์์ธ๋ฅผ ์ ์ธํ๊ณ ๋.์๋ํฌ์ธํธ๊ฐ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์ ๋๋ RST_STREAM ํ๋ ์์ ์ ์กํ๋ฉด, ํผ์ด๊ฐ ์คํธ๋ฆผ์ ๋ซ๋ ํ๋ ์์ ์์ ํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ ์ WINDOW_UPDATE ๋๋ RST_STREAM ํ๋ ์์ ๋ฐ์ ์ ์์ต๋๋ค.์๋ํฌ์ธํธ๊ฐ "open" ๋๋ "half-closed (local)" ์ํ์ ์คํธ๋ฆผ์์ RST_STREAM ํ๋ ์์ ์ ์กํ๋ฉด, ํด๋น ์๋ํฌ์ธํธ๋ ์๊ฒฉ ํผ์ด๊ฐ ์ ์กํ๊ฑฐ๋ ์ ์ก ๋๊ธฐ์ด์ ๋ฃ์ ์ด๋ค ์ ํ์ ํ๋ ์๋ ์์ ํ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํ๋ ์์ ๋ฌด์ํ ์ ์์ง๋ง, ํ๋ ์น์ ์์ถ(์น์ 4.3) ๋๋ ํ๋ฆ ์ ์ด์ ๊ฐ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ์๋ ์ต์ํ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.์๋ํฌ์ธํธ๋ "closed" ์ํ์ ์๋ ๋ชจ๋ ์คํธ๋ฆผ์ ๋ํด ์ด๋ฌํ ์ต์ํ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์๋ํฌ์ธํธ๋ ํผ์ด๊ฐ ์คํธ๋ฆผ์ "closed"๋ก ๋ง๋ค๊ฒ ํ ํ๋ ์์ ์์ ํ์์ ๊ฐ์งํ๊ธฐ ์ํด ๋ค๋ฅธ ์ ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฝ์ฐ PRIORITY ์ด์ธ์ ํ๋ ์ ์์ ์ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ PROTOCOL_ERROR๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ํฌ์ธํธ๋ ์ค์ ์ ๋ํ ํ์ธ์ ๋ฐ์ ํ ์คํธ๋ฆผ์ ๋ซ์ ๋ค์ ๋์ฐฉํ DATA ํ๋ ์์ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๋ ๋ฑ, ํผ์ด๊ฐ ๋ซ์ ์ ํธ๋ฅผ ์์ ํ์์ ๋ํ๋ด๋ ํ๋ ์์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํ๋ณํ ์ ์์ต๋๋ค. ์ด ๋ชฉ์ ์ ์ํด ํ์ด๋จธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค(SHOULD NOT). ์๋ก๋ ๋ซ์ ๋ค์ SETTINGS ํ๋ ์์ ์ ์กํ๊ณ ํด๋น ์ค์ ํ์ธ์ ๋ฐ์ ํ์ ์ค๋ DATA ํ๋ ์์ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ค๋ฅธ ์ ํธ๋ก๋ PING ํ๋ ์, ๋ซ์ ์ดํ ์์ฑ๋ ์คํธ๋ฆผ์์ ์ค๋ ๋ฐ์ดํฐ ์์ , ๋๋ ๋ซ์ ์ดํ ์์ฑ๋ ์์ฒญ์ ๋ํ ์๋ต ๋ฑ์ด ์์ต๋๋ค.
๋ ๊ตฌ์ฒด์ ์ธ ๊ท์น์ด ์๋ ํ, ๊ตฌํ์ฒด๋ ์ํ ์ค๋ช ์์ ๋ช ์์ ์ผ๋ก ํ์ฉ๋์ง ์์ ํ๋ ์์ ์์ ํ๋ฉด ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ PROTOCOL_ERROR๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD). PRIORITY๋ ์ด๋ค ์คํธ๋ฆผ ์ํ์์๋ ์ ์ก ๋ฐ ์์ ๋ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์.
์ด ์น์ ์ ๊ท์น์ ์ด ๋ฌธ์์์ ์ ์๋ ํ๋ ์์๋ง ์ ์ฉ๋ฉ๋๋ค. ์๋ฏธ๊ฐ ์๋ ค์ ธ ์์ง ์์ ํ๋ ์์ ์์ ์ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ๋ ์์ ์ ์กํ๊ฑฐ๋ ์์ ํ๋ ์กฐ๊ฑด ์ญ์ ์๋ ค์ ธ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค; ํ์ฅ์ฑ์ ๋ํด์๋ ์น์ 5.5๋ฅผ ์ฐธ์กฐํ์ธ์.
HTTP ์์ฒญ/์๋ต ๊ตํ์ ์ํ ์ ์ด ์์๋ ์น์ 8.8์์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฒ ํธ์์ ์ํ ์ ์ด ์์๋ 8.4.1 ๋ฐ 8.4.2 ์น์ ์์ ์ฐพ์ ์ ์์ต๋๋ค.
5.1.1. ์คํธ๋ฆผ ์๋ณ์
์คํธ๋ฆผ์ ๋ถํธ ์๋ 31๋นํธ ์ ์๋ก ์๋ณ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์์ํ ์คํธ๋ฆผ์ ํ์ ๋ฒํธ์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค(MUST); ์๋ฒ๊ฐ ์์ํ ์คํธ๋ฆผ์ ์ง์ ๋ฒํธ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค(MUST). ์คํธ๋ฆผ ์๋ณ์ 0(0x00)์ ์ฐ๊ฒฐ ์ ์ด ๋ฉ์์ง์ ์ฌ์ฉ๋๋ฉฐ, ์ ์คํธ๋ฆผ์ ์์ฑํ๋ ๋ฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ก ์์ฑ๋ ์คํธ๋ฆผ์ ์๋ณ์๋ ๊ทธ ์คํธ๋ฆผ์ ์์ํ ์๋ํฌ์ธํธ๊ฐ ์ด๊ฑฐ๋ ์์ฝํ ๋ชจ๋ ์คํธ๋ฆผ๋ณด๋ค ์์น์ ์ผ๋ก ์ปค์ผ ํฉ๋๋ค(MUST). ์ด๋ HEADERS ํ๋ ์์ผ๋ก ์ด๋ฆฌ๋ ์คํธ๋ฆผ๊ณผ PUSH_PROMISE๋ก ์์ฝ๋๋ ์คํธ๋ฆผ์ ์ ์ฉ๋ฉ๋๋ค. ์์์น ๋ชปํ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์์ ํ ์๋ํฌ์ธํธ๋ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ PROTOCOL_ERROR๋ก ์๋ตํด์ผ ํฉ๋๋ค.
HEADERS ํ๋ ์์ ํ๋ ์ ํค๋์ ์คํธ๋ฆผ ์๋ณ์๋ก ํ์๋ ํด๋ผ์ด์ธํธ-์์ ์คํธ๋ฆผ์ "idle"์์ "open"์ผ๋ก ์ ์ด์ํต๋๋ค. PUSH_PROMISE ํ๋ ์์ ํ๋ ์ ํ์ด๋ก๋์ Promised Stream ID ํ๋๋ก ํ์๋ ์๋ฒ-์์ ์คํธ๋ฆผ์ "idle"์์ "reserved (local)" ๋๋ "reserved (remote)"๋ก ์ ์ด์ํต๋๋ค. ์คํธ๋ฆผ์ด "idle" ์ํ์์ ์ ์ด๋ ๋, ํผ์ด๊ฐ ๋ ๋ฎ์ ๊ฐ์ ์คํธ๋ฆผ ์๋ณ์๋ก ์ด์์ ์๋ ์๋ ๋ชจ๋ idle ์คํธ๋ฆผ์ ์ฆ์ "closed"๋ก ์ ์ด๋ฉ๋๋ค. ์ฆ, ์๋ํฌ์ธํธ๋ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ๊ฑด๋๋ธ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก ๊ฑด๋๋ด ์คํธ๋ฆผ์ ์ฆ์ ๋ซํ๋๋ค.
์คํธ๋ฆผ ์๋ณ์๋ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฅ๊ธฐ๊ฐ ์ฐ๊ฒฐ์ ์๋ํฌ์ธํธ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์คํธ๋ฆผ ์๋ณ์ ๋ฒ์๋ฅผ ์์งํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์์ฑํ ์ ์๋ ํด๋ผ์ด์ธํธ๋ ์ ์คํธ๋ฆผ์ ์ํด ์ ์ฐ๊ฒฐ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์์ฑํ ์ ์๋ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ์คํธ๋ฆผ์ ์ํด ์ ์ฐ๊ฒฐ์ ์ด๋๋ก ๊ฐ์ ํ๊ธฐ ์ํด GOAWAY ํ๋ ์์ ๋ณด๋ผ ์ ์์ต๋๋ค.
5.1.2. ์คํธ๋ฆผ ๋์์ฑ
ํผ์ด๋ SETTINGS_MAX_CONCURRENT_STREAMS ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ํ์ฑ ์คํธ๋ฆผ ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 6.5.2 ์ฐธ์กฐ). ์ต๋ ๋์ ์คํธ๋ฆผ ์ค์ ์ ๊ฐ ์๋ํฌ์ธํธ์ ํน์ ํ๋ฉฐ ์ค์ ์ ์์ ํ๋ ํผ์ด์๋ง ์ ์ฉ๋ฉ๋๋ค. ์ฆ, ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ์์ํ ์ ์๋ ๋์ ์คํธ๋ฆผ์ ์ต๋ ์๋ฅผ ์ง์ ํ๊ณ , ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ํ ์ ์๋ ๋์ ์คํธ๋ฆผ์ ์ต๋ ์๋ฅผ ์ง์ ํฉ๋๋ค.
"open" ์ํ ๋๋ ๋ "half-closed" ์ํ์ ์๋ ์คํธ๋ฆผ์ ์๋ํฌ์ธํธ๊ฐ ์ด ์ ์๋ ์ต๋ ์คํธ๋ฆผ ์์ ํฌํจ๋ฉ๋๋ค. ์ด ์ธ ์ํ ์ค ์ด๋ ํ๋์ ์๋ ์คํธ๋ฆผ์ SETTINGS_MAX_CONCURRENT_STREAMS ์ค์ ์ ๊ด๊ณ ๋ ํ๋์ ํฌํจ๋ฉ๋๋ค. "reserved" ์ํ๋ค์ ์๋ ์คํธ๋ฆผ์ ์คํธ๋ฆผ ํ๋์ ํฌํจ๋์ง ์์ต๋๋ค.
์๋ํฌ์ธํธ๋ ํผ์ด๊ฐ ์ค์ ํ ํ๋๋ฅผ ์ด๊ณผํด์๋ ์ ๋ฉ๋๋ค(MUST NOT). ๊ด๊ณ ๋ ๋์ ์คํธ๋ฆผ ํ๋๋ฅผ ์ด๊ณผํ๊ฒ ํ๋ HEADERS ํ๋ ์์ ์์ ํ ์๋ํฌ์ธํธ๋ ์ด๋ฅผ ์คํธ๋ฆผ ์ค๋ฅ(์น์ 5.4.2)์ธ PROTOCOL_ERROR ๋๋ REFUSED_STREAM๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค(MUST). ์ด๋ค ์ค๋ฅ ์ฝ๋๋ฅผ ์ ํํ๋๋์ ๋ฐ๋ผ ์๋ํฌ์ธํธ๊ฐ ์๋ ์ฌ์๋๋ฅผ ํ์ฉํ ์ง ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.7 ์ฐธ์กฐ).
SETTINGS_MAX_CONCURRENT_STREAMS ๊ฐ์ ํ์ฌ ์ด๋ฆฐ ์คํธ๋ฆผ ์๋ณด๋ค ๋ ๋ฎ๊ฒ ์ค์ด๋ ค๋ ์๋ํฌ์ธํธ๋ ์ด๊ณผํ๋ ์คํธ๋ฆผ์ ๋ซ๊ฑฐ๋ ์คํธ๋ฆผ์ด ์๋ฃ๋ ๋๊น์ง ํ์ฉํ ์ ์์ต๋๋ค.
5.2. ํ๋ฆ ์ ์ด
์คํธ๋ฆผ์ ์ฌ์ฉํ ๋ค์คํ๋ TCP ์ฐ๊ฒฐ ์ฌ์ฉ์ ๋ํ ๊ฒฝ์์ ์ด๋ํ์ฌ ์คํธ๋ฆผ์ด ๋ธ๋ก๋๋ ์ํฉ์ ๋ง๋ญ๋๋ค. ํ๋ฆ ์ ์ด ๋ฐฉ์์ ๋์ผ ์ฐ๊ฒฐ์ ์คํธ๋ฆผ๋ค์ด ์๋ก ํ๊ดด์ ์ผ๋ก ๊ฐ์ญํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ํ๋ฆ ์ ์ด๋ ๊ฐ๋ณ ์คํธ๋ฆผ๊ณผ ์ฐ๊ฒฐ ์ ์ฒด์ ๋ํด ์ฌ์ฉ๋ฉ๋๋ค.
HTTP/2๋ WINDOW_UPDATE ํ๋ ์(์น์ 6.9)์ ์ฌ์ฉํ์ฌ ํ๋ฆ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
5.2.1. ํ๋ฆ ์ ์ด ์์น
HTTP/2 ์คํธ๋ฆผ ํ๋ฆ ์ ์ด๋ ํ๋กํ ์ฝ ๋ณ๊ฒฝ ์์ด ๋ค์ํ ํ๋ฆ ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. HTTP/2 ํ๋ฆ ์ ์ด๋ ๋ค์ ํน์ฑ์ ๊ฐ์ง๋๋ค:
- ํ๋ฆ ์ ์ด๋ ์ฐ๊ฒฐ์ ํนํ๋์ด ์์ต๋๋ค. HTTP/2 ํ๋ฆ ์ ์ด๋ ๋จ์ผ ํ์ ์๋ํฌ์ธํธ๋ค ๊ฐ์์ ์๋ํ๋ฉฐ ์ ์ฒด ์ข ๋จ๊ฐ ๊ฒฝ๋ก์ ๊ฑธ์น์ง ์์ต๋๋ค.
- ํ๋ฆ ์ ์ด๋ WINDOW_UPDATE ํ๋ ์์ ๊ธฐ๋ฐํฉ๋๋ค. ์์ ์๋ ์คํธ๋ฆผ๋ณ ๋ฐ ์ ์ฒด ์ฐ๊ฒฐ์ ๋ํด ์์ ํ ์ค๋น๊ฐ ๋ ์ฅํ ์๋ฅผ ๊ด๊ณ ํฉ๋๋ค. ์ด ๋ฐฉ์์ ํฌ๋ ๋ง ๊ธฐ๋ฐ ์คํด์ ๋๋ค.
- ํ๋ฆ ์ ์ด๋ ๋ฐฉํฅ์ฑ์ด ์์ผ๋ฉฐ ์ ์ฒด ์ ์ด๋ ์์ ์๊ฐ ์ ๊ณตํฉ๋๋ค. ์์ ์๋ ๊ฐ ์คํธ๋ฆผ๊ณผ ์ ์ฒด ์ฐ๊ฒฐ์ ๋ํด ์ํ๋ ์ด๋ค ์ฐฝ ํฌ๊ธฐ๋ ์ ํํ ์ ์์ต๋๋ค(MAY). ์ ์ก์๋ ์์ ์๊ฐ ์ค์ ํ ํ๋ฆ ์ ์ด ํ๋๋ฅผ ์กด์คํด์ผ ํฉ๋๋ค(MUST). ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ฐ ์ค๊ฐ์๋ ๋ชจ๋ ์์ ์ ์ญํ ์์ ์์ ๋ค์ ํ๋ฆ ์ ์ด ์ฐฝ์ ๊ด๊ณ ํ๊ณ ์ ์ก ์ ํผ์ด๊ฐ ์ค์ ํ ํ๋๋ฅผ ์ค์ํฉ๋๋ค.
- ์ด๊ธฐ ํ๋ฆ ์ ์ด ์ฐฝ ๊ฐ์ ์ ์คํธ๋ฆผ๊ณผ ์ ์ฒด ์ฐ๊ฒฐ ๋ชจ๋์ ๋ํด 65,535 ์ฅํ ์ ๋๋ค.
- ํ๋ ์ ์ ํ์ ํ๋ฆ ์ ์ด๊ฐ ํ๋ ์์ ์ ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด ๋ฌธ์์์ ์ง์ ๋ ํ๋ ์ ์ค ์ค์ง DATA ํ๋ ์๋ง ํ๋ฆ ์ ์ด์ ๋์์ด๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ํ๋ ์ ์ ํ์ ๊ด๊ณ ๋ ํ๋ฆ ์ ์ด ์ฐฝ์ ๊ณต๊ฐ์ ์๋นํ์ง ์์ต๋๋ค. ์ด๋ ์ค์ํ ์ ์ด ํ๋ ์์ด ํ๋ฆ ์ ์ด ๋๋ฌธ์ ์ฐจ๋จ๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์๋ํฌ์ธํธ๋ ์์ ์ ํ๋ฆ ์ ์ด๋ฅผ ๋นํ์ฑํํ๋๋ก ์ ํํ ์ ์์ง๋ง, ์๋ํฌ์ธํธ๋ ํผ์ด์ ํ๋ฆ ์ ์ด ์ ํธ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
- HTTP/2๋ WINDOW_UPDATE ํ๋ ์์ ํ์๊ณผ ์๋ฏธ๋ง ์ ์ํฉ๋๋ค(์น์ 6.9). ์์ ์๊ฐ ์ธ์ ์ด ํ๋ ์์ ๋ณด๋ผ์ง ๋๋ ์ด๋ค ๊ฐ์ ๋ณด๋ผ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ, ๋๋ ์ ์ก์๊ฐ ์ธ์ ํจํท์ ์ ์กํ ์ง๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ด ๋ฌธ์์์ ๊ท์ ํ์ง ์์ต๋๋ค. ๊ตฌํ์ฒด๋ ์์ ๋ค์ ํ์์ ๋ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์์ต๋๋ค.
๊ตฌํ์ฒด๋ ๋ํ ์์ฒญ ๋ฐ ์๋ต ์ ์ก์ ์ฐ์ ์์๋ฅผ ์ ํ๊ณ , ์์ฒญ์ ํค๋-์ค๋ธ-๋ผ์ธ ๋ธ๋กํน์ ํผํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉฐ, ์ ์คํธ๋ฆผ ์์ฑ ๊ด๋ฆฌ๋ฅผ ์ฑ ์์ง๋๋ค. ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ ์ ํ์ ์ด๋ค ํ๋ฆ ์ ์ด ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ํธ์์ฉํ ์ ์์ต๋๋ค.
5.2.2. ํ๋ฆ ์ ์ด์ ์ ์ ํ ์ฌ์ฉ
ํ๋ฆ ์ ์ด๋ ์์ ์ ์ฝ ํ์ ์ด์๋๋ ์๋ํฌ์ธํธ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ ์๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก์๋ ๋ง์ ์ฐ๊ฒฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํด์ผ ํ๊ณ ์ ์คํธ๋ฆผ ์ฐ๊ฒฐ์ ๋๋ฆฌ๊ณ ๋ค์ด์คํธ๋ฆผ์ ๋น ๋ฅผ ์ ์์ต๋๋ค. ํ๋ฆ ์ ์ด๋ ์์ ์๊ฐ ์ด๋ค ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง ๋์ผ ์ฐ๊ฒฐ์ ๋ค๋ฅธ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ๊ณ์ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃน๋๋ค.
์ด ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ ๋ฐฐํฌํ๊ฒฝ์ ์ต๋ ํฌ๊ธฐ(231-1)์ ํ๋ฆ ์ ์ด ์ฐฝ์ ๊ด๊ณ ํ๊ณ , ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๋๋ง๋ค WINDOW_UPDATE ํ๋ ์์ ๋ณด๋ด์ด ์ด ์ฐฝ์ ์ ์งํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ค์ ๊ทธ ์์ ์์ ๋ํด ํ๋ฆ ์ ์ด๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ๋ฐ๋๋ก ์ ์ก์๋ ํญ์ ์์ ์๊ฐ ๊ด๊ณ ํ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ํฅ์ ๋ฐ์ต๋๋ค.
์ ํ๋ ์์(์: ๋ฉ๋ชจ๋ฆฌ)์ ๊ฐ์ง ๋ฐฐํฌ ํ๊ฒฝ์ ํผ์ด๊ฐ ์๋นํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ํํ๊ธฐ ์ํด ํ๋ฆ ์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ง, ํ๋ฆ ์ ์ด๊ฐ ๋์ญํญ * ์ง์ฐ ๊ณฑ์ ๋ชจ๋ฅธ ์ฑ ํ์ฑํ๋๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋คํธ์ํฌ ์์์ ๋น์ต์ ์ผ๋ก ์ฌ์ฉํ ์ ์์์ ์ ์ํ์ธ์(์์ธํ ๋ด์ฉ์ [RFC7323] ์ฐธ์กฐ).
๋์ญํญ * ์ง์ฐ ๊ณฑ์ ์์ ํ ์ธ์งํ๊ณ ์๋๋ผ๋ ํ๋ฆ ์ ์ด ๊ตฌํ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์๋ํฌ์ธํธ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ ์ฆ์ TCP ์์ ๋ฒํผ์์ HTTP/2 ํ๋ ์์ ์ฝ๊ณ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค(MUST). ์ ์์ ์ฝ์ง ๋ชปํ๋ฉด WINDOW_UPDATE์ ๊ฐ์ ์ค์ํ ํ๋ ์์ด ์ฝํ๊ณ ์ฒ๋ฆฌ๋์ง ์์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ํ๋ ์์ ์ ์ํ ์ฝ๋ ๊ฒ์ HTTP/2 ํ๋ฆ ์ ์ด๊ฐ ์์ ์ฝํ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์๋ํฌ์ธํธ๋ฅผ ๋ ธ์ถ์ํค์ง ์์ผ๋ฏ๋ก ์์ ์์ง ๊ณต๊ฒฉ์ ์ทจ์ฝํ๊ฒ ๋ง๋ค์ง ์์ต๋๋ค.
5.2.3. ํ๋ฆ ์ ์ด ์ฑ๋ฅ
์๋ํฌ์ธํธ๊ฐ ํผ์ด๊ฐ ์ด ์ฐ๊ฒฐ์์ ํญ์ ํผ์ด์ ๋์ญํญ * ์ง์ฐ ๊ณฑ๋ณด๋ค ํฐ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฆ ์ ์ด ์ฐฝ ๊ณต๊ฐ์ ๊ฐ์ง๋๋ก ๋ณด์ฅํ ์ ์๋ค๋ฉด, ๊ทธ ์์ ์ฒ๋ฆฌ๋์ HTTP/2 ํ๋ฆ ์ ์ด์ ์ํด ์ ํ๋ฉ๋๋ค. ์ด๋ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง๋๋ค.
์ ์์ WINDOW_UPDATE ํ๋ ์์ ์ ์กํ๋ฉด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์๋ํฌ์ธํธ๋ ์์ ์ฒ๋ฆฌ๋ ๊ฐ์ ์ ํ์์ฑ๊ณผ ์์ ์์ง ์ํ ๊ด๋ฆฌ๋ฅผ ๊ท ํ ์๊ฒ ํด์ผ ํ๋ฉฐ, ์ฐฝ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ ๋ต์ ์ ์ํ ๋ ์น์ 10.5๋ฅผ ์ฃผ์ ๊น๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
5.3. ์ฐ์ ์์ ์ง์
HTTP/2์ ๊ฐ์ ๋ค์คํ๋ ํ๋กํ ์ฝ์์๋ ์คํธ๋ฆผ์ ๋์ญํญ๊ณผ ๊ณ์ฐ ์์์ ์ฐ์ ๋ฐฐ๋ถํ๋ ๊ฒ์ด ์ฑ๋ฅ ํฅ์์ ๊ฒฐ์ ์ ์ผ ์ ์์ต๋๋ค. ์๋ชป๋ ์ฐ์ ์์ ์ง์ ๋ฐฉ์์ HTTP/2๊ฐ ์ฑ๋ฅ์ด ๋ฎ์์ง๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. TCP ๊ณ์ธต์ ๋ณ๋ ฌ์ฑ์ด ์ ํ ์๋ค๋ฉด, ์ฑ๋ฅ์ HTTP/1.1๋ณด๋ค ์๋นํ ๋์ ์ ์์ต๋๋ค.
์ข์ ์ฐ์ ์์ ์ง์ ๋ฐฉ์์ ๋ฆฌ์์ค์ ๋ด์ฉ, ๋ฆฌ์์ค ๊ฐ์ ๊ด๊ณ, ํผ์ด๊ฐ ํด๋น ๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง์ ๊ฐ์ ๋ฌธ๋งฅ์ ์ง์์ ์ ์ฉํ๋ฉด ์ด์ ์ ์ป์ต๋๋ค. ํนํ ํด๋ผ์ด์ธํธ๋ ์๋ฒ ์ฐ์ ์์ ์ง์ ์ ๊ด๋ จ๋ ์์ฒญ ์ฐ์ ์์์ ๊ดํ ์ง์์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ์ ์์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
5.3.1. RFC 7540์ ์ฐ์ ์์ ๋ฐฐ๊ฒฝ
RFC 7540๋ ์์ฒญ ์ฐ์ ์์๋ฅผ ์ ํธํ๋ ํ๋ถํ ์์คํ ์ ์ ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์์คํ ์ ๋ณต์กํ๊ฒ ํ๋ช ๋์๊ณ , ์ผ๊ด๋๊ฒ ๊ตฌํ๋์ง ์์์ต๋๋ค.
์ ์ฐํ ์คํด์ ํด๋ผ์ด์ธํธ๊ฐ ๋งค์ฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฐ์ ์์๋ฅผ ํํํ๊ฒ ํ๊ณ , ์ฑํ๋ ์ ๊ทผ ๋ฐฉ์ ์ฌ์ด์ ์ผ๊ด์ฑ์ด ๊ฑฐ์ ์์์ต๋๋ค. ์๋ฒ์๊ฒ๋ ์ด ์คํด์ ๋ํ ์ผ๋ฐ์ ์ง์์ ๊ตฌํํ๋ ๊ฒ์ด ๋ณต์กํ์ต๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์์ ์ฐ์ ์์์ ๊ตฌํ์ ๊ณ ๋ฅด์ง ์์์ต๋๋ค. ๋ง์ ์๋ฒ ๋ฐฐํฌ๋ ์์ฒญ ์ฒ๋ฆฌ์์ ํด๋ผ์ด์ธํธ ์ ํธ๋ฅผ ๋ฌด์ํ์ต๋๋ค.
์์ฝํ๋ฉด, RFC 7540์ ์ฐ์ ์์ ์ ํธ๋ ์ฑ๊ณต์ ์ด์ง ๋ชปํ์ต๋๋ค.
5.3.2. ์ด ๋ฌธ์์์์ ์ฐ์ ์์ ์ ํธ
์ด HTTP/2 ์ ๋ฐ์ดํธ๋ RFC 7540์ ์ ์๋ ์ฐ์ ์์ ์ ํธ๋ฅผ ์ฌ์ฉ ์ค๋จ(deprecate)ํฉ๋๋ค. ์ฐ์ ์์ ์ ํธ์ ๊ด๋ จ๋ ๋ณธ๋ฌธ์ ๋๋ถ๋ถ์ ์ด ๋ฌธ์์ ํฌํจ๋์ง ์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์์ ๊ตฌํ์ฒด๊ฐ RFC 7540์์ ์ค๋ช ๋ ์ฐ์ ์์ ์ ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ตฌํ์ฒด์ ์ํธ์ด์ฉ์ฑ์ ์ ์งํ ์ ์๋๋ก ์ผ๋ถ ํ๋ ์ ํ๋ ์ค๋ช ๊ณผ ํ์ ์ฒ๋ฆฌ ์ฌํญ์ ์ ์ง๋ฉ๋๋ค.
RFC 7540 ์ฐ์ ์์ ์คํด์ ๋ํ ์์ธํ ์ค๋ช ์ RFC 7540์ ์น์ 5.3์ ๋จ์ ์์ต๋๋ค.
์ฐ์ ์์ ์ ๋ณด๋ฅผ ์ ํธํ๋ ๊ฒ์ ๋ง์ ๊ฒฝ์ฐ์ ์ข์ ์ฑ๋ฅ์ ์ป๊ธฐ ์ํด ํ์ํฉ๋๋ค. ์ฐ์ ์์ ์ ํธ๊ฐ ์ค์ํ ๊ฒฝ์ฐ, ์๋ํฌ์ธํธ๋ [HTTP-PRIORITY]์ ์ค๋ช ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์ฒด ์คํด ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
๋น๋ก RFC 7540์ ์ฐ์ ์์ ์ ํธ๊ฐ ๋๋ฆฌ ์ฑํ๋์ง๋ ์์์ง๋ง, ๊ทธ๊ฒ์ด ์ ๊ณตํ๋ ์ ๋ณด๋ ๋ ๋์ ๋์์ด ์๋ ์ํฉ์์๋ ์ฌ์ ํ ์ ์ฉํ ์ ์์ต๋๋ค. HEADERS๋ PRIORITY ํ๋ ์์์ ์ฐ์ ์์ ์ ํธ๋ฅผ ์์ ํ๋ ์๋ํฌ์ธํธ๋ ๊ทธ ์ ๋ณด๋ฅผ ์ ์ฉํจ์ผ๋ก์จ ์ด์ต์ ์ป์ ์ ์์ต๋๋ค. ํนํ ์ด๋ฌํ ์ ํธ๋ฅผ ์๋นํ๋ ๊ตฌํ์ฒด๋ ๋์์ด ์์ ๋ ์ด ์ฐ์ ์์ ์ ํธ๋ฅผ ๋ฒ๋ฆฌ๋ ๊ฒ์์ ์ด์ต์ ์ป์ง ๋ชปํ ๊ฒ์ ๋๋ค.
์๋ฒ๋ ์ฐ์ ์์ ์ ํธ๊ฐ ์ ํ ์๋ ๊ฒฝ์ฐ ์์ฒญ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ ๋ ๋ค๋ฅธ ๋ฌธ๋งฅ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD). ์๋ฒ๋ ์ ํธ๊ฐ ์ ํ ์๋ ๊ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์์๋ค๋ ํ์๋ก ํด์ํ ์ ์์ต๋๋ค(MAY). RFC 7540์ ์น์ 5.3.5์ ์ค๋ช ๋ ๊ธฐ๋ณธ๊ฐ์ ๋๋ถ๋ถ์ ์กฐ๊ฑด์์ ์ฑ๋ฅ์ด ์ข์ง ์์ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ์ด๋ฅผ ์๋์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋๋ญ ๋๋ค.
5.4. ์ค๋ฅ ์ฒ๋ฆฌ
HTTP/2 ํ๋ ์ด๋ฐ์ ๋ ๊ฐ์ง ๋ฒ์ฃผ์ ์ค๋ฅ๋ฅผ ํ์ฉํฉ๋๋ค:
- ์ ์ฒด ์ฐ๊ฒฐ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ค๋ฅ ์กฐ๊ฑด์ ์ฐ๊ฒฐ ์ค๋ฅ์ ๋๋ค.
- ๊ฐ๋ณ ์คํธ๋ฆผ์ ์ค๋ฅ๋ ์คํธ๋ฆผ ์ค๋ฅ์ ๋๋ค.
์ค๋ฅ ์ฝ๋ ๋ชฉ๋ก์ ์น์ 7์ ํฌํจ๋์ด ์์ต๋๋ค.
์๋ํฌ์ธํธ๊ฐ ์ฒ๋ฆฌ ์ค์ ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๊ตฌํ์ฒด๋ ์ฒ๋ฆฌ ์ค ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ง๋ง(MAY) ๊ฒฐ๊ณผ๋ก ๋ณด๊ณ ํ๋ ๊ฒ์ ์คํธ๋ฆผ ์ค๋ฅ ํ๋์ ์ฐ๊ฒฐ ์ค๋ฅ ํ๋๋ก ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD).
์ฃผ์ด์ง ์คํธ๋ฆผ์ ๋ํด ๋ณด๊ณ ๋ ์ฒซ ๋ฒ์งธ ์คํธ๋ฆผ ์ค๋ฅ๋ ๊ทธ ์คํธ๋ฆผ์์ ๋ค๋ฅธ ์ค๋ฅ๋ค์ด ๋ณด๊ณ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๋น๊ต์ ํ๋กํ ์ฝ์ ์ฌ๋ฌ ๊ฐ์ GOAWAY ํ๋ ์์ ํ์ฉํ์ง๋ง, ์๋ํฌ์ธํธ๋ ์ฐ์ํ ์ข ๋ฃ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ํ ๋ณดํต ํ ์ข ๋ฅ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ง ๋ณด๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD). ๋ง์ฝ ์ข ๋ฃ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ์๋ํฌ์ธํธ๋ ์ด์ ์ NO_ERROR๋ฅผ ํฌํจํ GOAWAY์ ๋๋ถ์ด ์๋ก์ด ์ค๋ฅ ์ฝ๋๋ฅผ ๊ฐ์ง ์ถ๊ฐ GOAWAY ํ๋ ์์ ๋ณด๋ผ ์ ์์ต๋๋ค(MAY).
์๋ํฌ์ธํธ๊ฐ ์ฌ๋ฌ ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๋ฉด ๊ทธ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ๋ณด๊ณ ํ ์ ์์ต๋๋ค(MAY). ๋ง์ฝ ํ๋ ์์ด ์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ์ ๋ฐํ๋ฉด ๊ทธ ์ค๋ฅ๋ ๋ฐ๋์ ๋ณด๊ณ ๋์ด์ผ ํฉ๋๋ค(MUST). ์ถ๊ฐ๋ก, ์๋ํฌ์ธํธ๋ ์ค๋ฅ ์กฐ๊ฑด์ ๊ฐ์งํ ๋ ์ ์ฉ ๊ฐ๋ฅํ ์ด๋ค ์ค๋ฅ ์ฝ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค; ์ผ๋ฐ ์ค๋ฅ ์ฝ๋(์: PROTOCOL_ERROR ๋๋ INTERNAL_ERROR)๋ ๋ ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ ์ฝ๋ ๋์ ํญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
5.4.1. ์ฐ๊ฒฐ ์ค๋ฅ ์ฒ๋ฆฌ
์ฐ๊ฒฐ ์ค๋ฅ๋ ํ๋ ์ ๊ณ์ธต์ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉํดํ๊ฑฐ๋ ์ด๋ค ์ฐ๊ฒฐ ์ํ๋ฅผ ์์์ํค๋ ๋ชจ๋ ์ค๋ฅ์ ๋๋ค.
์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ๋ง๋ ์๋ํฌ์ธํธ๋ ๋จผ์ ํผ์ด๋ก๋ถํฐ ๋ง์ง๋ง์ผ๋ก ์ฑ๊ณต์ ์ผ๋ก ์์ ํ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ํฌํจํ GOAWAY ํ๋ ์์ ๋ณด๋ด๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD). GOAWAY ํ๋ ์์ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ ์ด์ ๋ฅผ ๋ํ๋ด๋ ์ค๋ฅ ์ฝ๋(์น์ 7)๋ฅผ ํฌํจํฉ๋๋ค. ์ค๋ฅ ์กฐ๊ฑด์ ๋ํด GOAWAY ํ๋ ์์ ์ ์กํ ํ์๋ ์๋ํฌ์ธํธ๊ฐ TCP ์ฐ๊ฒฐ์ ๋ซ์์ผ ํฉ๋๋ค(MUST).
GOAWAY๊ฐ ์์ ์๋ํฌ์ธํธ์ ์ ๋ขฐ์ฑ ์๊ฒ ๋๋ฌํ์ง ์์ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ GOAWAY๋ ํผ์ด์๊ฒ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ ์ด์ ๋ฅผ ์๋ฆฌ๋ ค๋ ์ต์ ์ ์๋์ผ ๋ฟ์ ๋๋ค.
์๋ํฌ์ธํธ๋ ์ธ์ ๋ ์ง ์ฐ๊ฒฐ์ ์ข ๋ฃํ ์ ์์ต๋๋ค. ํนํ, ์๋ํฌ์ธํธ๋ ์คํธ๋ฆผ ์ค๋ฅ๋ฅผ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(MAY). ์๋ํฌ์ธํธ๋ ์ํฉ์ด ํ๋ฝํ๋ค๋ฉด ์ฐ๊ฒฐ์ ๋๋ผ ๋ GOAWAY ํ๋ ์์ ๋ณด๋ด๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD).
5.4.2. ์คํธ๋ฆผ ์ค๋ฅ ์ฒ๋ฆฌ
์คํธ๋ฆผ ์ค๋ฅ๋ ๋ค๋ฅธ ์คํธ๋ฆผ์ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉํดํ์ง ์๋ ํน์ ์คํธ๋ฆผ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ์ ๋๋ค.
์คํธ๋ฆผ ์ค๋ฅ๋ฅผ ๊ฐ์งํ ์๋ํฌ์ธํธ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์คํธ๋ฆผ์ ์๋ณ์๋ฅผ ํฌํจํ๋ RST_STREAM ํ๋ ์์ ์ ์กํฉ๋๋ค(์น์ 6.4). RST_STREAM ํ๋ ์์ ์ค๋ฅ ์ ํ์ ๋ํ๋ด๋ ์ค๋ฅ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
RST_STREAM์ ์๋ํฌ์ธํธ๊ฐ ์คํธ๋ฆผ์์ ๋ณด๋ผ ์ ์๋ ๋ง์ง๋ง ํ๋ ์์ ๋๋ค. RST_STREAM ํ๋ ์์ ์ ์กํ ํผ์ด๋ ์๊ฒฉ ํผ์ด๊ฐ ์ ์กํ๊ฑฐ๋ ์ ์ก ๋๊ธฐ์ด์ ์ฌ๋ ค๋ ํ๋ ์๋ค์ ์์ ํ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํ๋ ์์ ๋ฌด์ํ ์ ์์ง๋ง, ํ๋ ์น์ ์์ถ ์ํ(์น์ 4.3)๋ ํ๋ฆ ์ ์ด์ ๊ฐ์ด ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ ์์ธ์ ๋๋ค.
๋ณดํต ์๋ํฌ์ธํธ๋ ์ด๋ค ์คํธ๋ฆผ์ ๋ํด์๋ RST_STREAM ํ๋ ์์ ๋ ๋ฒ ์ด์ ์ ์กํด์๋ ์ ๋ฉ๋๋ค(SHOULD NOT). ๊ทธ๋ฌ๋ ์๋ํฌ์ธํธ๋ ๋ซํ ์คํธ๋ฆผ์์ ํ๋ ์์ ๋ผ์ด๋ ํธ๋ฆฝ ์๊ฐ ์ด์ ์์ ํ๋ฉด ์ถ๊ฐ RST_STREAM ํ๋ ์์ ๋ณด๋ผ ์ ์์ต๋๋ค(MAY). ์ด ๋์์ ์๋ชป ๋์ํ๋ ๊ตฌํ์ฒด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ํ์ฉ๋ฉ๋๋ค.
๋ฃจํ๋ฅผ ํผํ๊ธฐ ์ํด ์๋ํฌ์ธํธ๋ RST_STREAM์ ๋ํ ์๋ต์ผ๋ก ๋ค์ RST_STREAM์ ๋ณด๋ด์๋ ์ ๋ฉ๋๋ค(MUST NOT).
5.4.3. ์ฐ๊ฒฐ ์ข ๋ฃ
์คํธ๋ฆผ์ด "open" ๋๋ "half-closed" ์ํ๋ก ๋จ์ ์๋ ๋์ TCP ์ฐ๊ฒฐ์ด ๋ซํ๊ฑฐ๋ ๋ฆฌ์ ๋๋ฉด, ์ํฅ์ ๋ฐ์ ์คํธ๋ฆผ์ ์๋์ผ๋ก ์ฌ์๋ํ ์ ์์ต๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.7 ์ฐธ์กฐ).
5.5. HTTP/2 ํ์ฅ
HTTP/2๋ ํ๋กํ ์ฝ์ ํ์ฅ์ ํ์ฉํฉ๋๋ค. ์ด ์น์ ์ ์ค๋ช ๋ ์ ํ ๋ด์์ ํ๋กํ ์ฝ ํ์ฅ์ ์ถ๊ฐ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ํ๋กํ ์ฝ์ ์ด๋ค ์ธก๋ฉด์ด๋ผ๋ ๋ณ๊ฒฝํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ํ์ฅ์ ๋จ์ผ HTTP/2 ์ฐ๊ฒฐ์ ๋ฒ์ ๋ด์์๋ง ์ ํจํฉ๋๋ค.
์ด๊ฒ์ ์ด ๋ฌธ์์ ์ ์๋ ํ๋กํ ์ฝ ์์์ ์ ์ฉ๋ฉ๋๋ค. ์ด๋ ์๋ก์ด ๋ฉ์๋, ์ํ ์ฝ๋ ๋๋ ํ๋ ์ ์์ ๊ฐ์ ๊ธฐ์กด์ HTTP ํ์ฅ ์ต์ ์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค(์์ธํ ๋ด์ฉ์ RFC 9110์ ์น์ 16 ์ฐธ์กฐ).
ํ์ฅ์ ์๋ก์ด ํ๋ ์ ์ ํ(์น์ 4.1), ์๋ก์ด ์ค์ (์น์ 6.5), ๋๋ ์๋ก์ด ์ค๋ฅ ์ฝ๋(์น์ 7)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์ฅ ์ง์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ ์ง์คํธ๋ฆฌ๋ RFC 7540์ ์น์ 11์ ์ ์๋์ด ์์ต๋๋ค.
๊ตฌํ์ฒด๋ ํ์ฅ ๊ฐ๋ฅํ ํ๋กํ ์ฝ ์์์ ์๋ ค์ง์ง ์์๊ฑฐ๋ ์ง์๋์ง ์๋ ๊ฐ์ ๋ฌด์ํด์ผ ํฉ๋๋ค(MUST). ๊ตฌํ์ฒด๋ ์๋ ค์ง์ง ์์๊ฑฐ๋ ์ง์๋์ง ์๋ ์ ํ์ ํ๋ ์์ ํ๊ธฐํด์ผ ํฉ๋๋ค(MUST). ์ด๋ ์ด๋ฌํ ํ์ฅ ์ง์ ๋ค์ด ์ฌ์ ํฉ์๋ ํ์ ์์ด ํ์ฅ์ ์ํด ์์ ํ๊ฒ ์ฌ์ฉ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ค๋ง, ํ๋ ๋ธ๋ก(์น์ 4.3)์ ์ค๊ฐ์ ๋ํ๋๋ ํ์ฅ ํ๋ ์์ ํ์ฉ๋์ง ์์ผ๋ฉฐ; ์ด๋ฌํ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ธ PROTOCOL_ERROR๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(MUST).
ํ์ฅ์ ์ด ๋ฌธ์์ ์ ์๋ ํ๋กํ ์ฝ ์์ ๋๋ ํ์ฅ ๋ฉ์ปค๋์ฆ์ด ์ ์๋์ง ์์ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํผํด์ผ ํฉ๋๋ค(SHOULD). ์ฌ๊ธฐ์๋ ํ๋ ์ ๋ ์ด์์ ๋ณ๊ฒฝ, ํ๋ ์์ด HTTP ๋ฉ์์ง๋ก ๊ตฌ์ฑ๋๋ ๋ฐฉ์์ ์ถ๊ฐ ๋๋ ๋ณ๊ฒฝ(์น์ 8.1), ์์ฌ-ํค๋ ํ๋ ์ ์ ๋ณ๊ฒฝ, ๋๋ ํธํ ์๋ํฌ์ธํธ๊ฐ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ด๋ค ํ๋กํ ์ฝ ์์์ ๋ณ๊ฒฝ์ด ํฌํจ๋ฉ๋๋ค.
๊ธฐ์กด ํ๋กํ ์ฝ ์์๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํ์ฅ์ ์ฌ์ฉ๋๊ธฐ ์ ์ ํ์๋์ด์ผ ํฉ๋๋ค(MUST). ์๋ฅผ ๋ค์ด, HEADERS ํ๋ ์์ ๋ ์ด์์์ ๋ณ๊ฒฝํ๋ ํ์ฅ์ ํผ์ด๊ฐ ์ด๋ฅผ ํ์ฉํ๋ค๋ ๊ธ์ ์ ์ ํธ๋ฅผ ์ค ๋๊น์ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์์ ๋ ๋ ์ด์์์ด ์ธ์ ํจ๋ ฅ์ ๋ฐ์ํ๋์ง ์กฐ์จํ ํ์๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ก, DATA ํ๋ ์ ์ด์ธ์ ํ๋ ์์ ํ๋ฆ ์ ์ด ๋์์ผ๋ก ์ทจ๊ธํ๋ ค๋ฉด ์์ชฝ ์๋ํฌ์ธํธ๊ฐ ์ดํดํด์ผ ํ๋ ์๋ฏธ ๋ณ๊ฒฝ์ด ํ์ํ๋ฏ๋ก, ์ด๋ ํ์์ ํตํด์๋ง ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์๋ ํ์ฅ ์ฌ์ฉ์ ํ์ํ๋ ํน์ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ์ง ์์ง๋ง, ์ค์ (์น์ 6.5.2)์ด ๊ทธ ๋ชฉ์ ์ ์ฌ์ฉ๋ ์ ์์์ ์ง์ ํฉ๋๋ค. ์์ชฝ ํผ์ด๊ฐ ํ์ฅ ์ฌ์ฉ ์์ฌ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ ์ค์ ํ๋ฉด ํ์ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค์ ์ด ํ์ฅ ํ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ด๊ธฐ ๊ฐ์ ํ์ฅ์ด ์ด๊ธฐ์๋ ๋นํ์ฑํ๋๋๋ก ์ ์๋์ด์ผ ํฉ๋๋ค(MUST).
6. ํ๋ ์ ์ ์
์ด ๋ช ์ธ์๋ ๊ณ ์ ํ 8๋นํธ ํ์ ์ฝ๋๋ก ์๋ณ๋๋ ์ฌ๋ฌ ํ๋ ์ ์ ํ์ ์ ์ํ๋ค. ๊ฐ ํ๋ ์ ์ ํ์ ์ฐ๊ฒฐ ์ ์ฒด๋ ๊ฐ๋ณ ์คํธ๋ฆผ์ ์ค์ ๋ฐ ๊ด๋ฆฌ์์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ชฉ์ ์ ์ํํ๋ค.
ํน์ ํ๋ ์ ์ ํ์ ์ ์ก์ ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ์๋ํฌ์ธํธ๊ฐ ์ฐ๊ฒฐ ์ํ์ ๋ํด ๋๊ธฐํ๋ ๊ด์ ์ ์ ์งํ์ง ๋ชปํ๋ฉด ์ฐ๊ฒฐ ๋ด์์์ ์ฑ๊ณต์ ์ธ ํต์ ์ด ๋ ์ด์ ๋ถ๊ฐ๋ฅํด์ง๋ค. ๋ฐ๋ผ์ ์๋ํฌ์ธํธ๊ฐ ์ด๋ค ํ๋ ์์ ์ฌ์ฉ์ด ์ํ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํด ๊ณต๋์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
6.1. DATA
DATA ํ๋ ์(type=0x00)์ ์คํธ๋ฆผ๊ณผ ์ฐ๊ด๋ ์์์ ๊ฐ๋ณ ๊ธธ์ด ์ฅํ ์ํ์ค๋ฅผ ์ ๋ฌํ๋ค. ์๋ฅผ ๋ค์ด ํ๋ ์ด์์ DATA ํ๋ ์์ HTTP ์์ฒญ ๋๋ ์๋ต ๋ฉ์์ง์ ๋ณธ๋ฌธ์ ์ด๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
DATA ํ๋ ์์ ํจ๋ฉ์ ํฌํจํ MAY ์๋ค. ํจ๋ฉ์ ๋ฉ์์ง ํฌ๊ธฐ๋ฅผ ์จ๊ธฐ๊ธฐ ์ํด DATA ํ๋ ์์ ์ถ๊ฐ๋ ์ ์๋ค. ํจ๋ฉ์ ๋ณด์ ๊ธฐ๋ฅ์ด๋ค; ์์ธํ ๋ด์ฉ์ ์น์ 10.7์ ์ฐธ์กฐํ๋ผ.
DATA Frame {
Length (24),
Type (8) = 0x00,
Unused Flags (4),
PADDED Flag (1),
Unused Flags (2),
END_STREAM Flag (1),
Reserved (1),
Stream Identifier (31),
[Pad Length (8)],
Data (..),
Padding (..2040),
}
๊ทธ๋ฆผ 3: DATA ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. DATA ํ๋ ์์ ๋ค์์ ์ถ๊ฐ ํ๋๋ฅผ ํฌํจํ๋ค:
- Pad Length:
- ํ๋ ์ ํจ๋ฉ์ ๊ธธ์ด๋ฅผ ์ฅํ ๋จ์๋ก ๋ด๋ 8๋นํธ ํ๋์ด๋ค. ์ด ํ๋๋ PADDED ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์กด์ฌํ๋ค.
- Data:
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ. ๋ฐ์ดํฐ์ ์์ ์กด์ฌํ๋ ๋ค๋ฅธ ํ๋๋ค์ ๊ธธ์ด๋ฅผ ์ ์ธํ ํ๋ ์ ํ์ด๋ก๋์ ๋๋จธ์ง์ด๋ค.
- Padding:
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ฏธ๋ฅผ ๊ฐ์ง์ง ์๋ ํจ๋ฉ ์ฅํ ๋ค. ์ ์ก ์ ํจ๋ฉ ์ฅํ ์ MUST 0์ผ๋ก ์ค์ ๋์ด์ผ ํ๋ค. ์์ ์๋ ํจ๋ฉ์ ๊ฒ์ฆํ ์๋ฌด๋ ์์ง๋ง, ๋น์(้้ถ) ํจ๋ฉ์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ MAY ์๋ค.
DATA ํ๋ ์์ ๋ค์๊ณผ ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ ์ํ๋ค:
- PADDED (0x08):
- ์ค์ ๋๋ฉด PADDED ํ๋๊ทธ๋ Pad Length ํ๋์ ๊ทธ๊ฐ ์ค๋ช ํ๋ ํจ๋ฉ์ด ์กด์ฌํจ์ ๋ํ๋ธ๋ค.
- END_STREAM (0x01):
- ์ค์ ๋๋ฉด END_STREAM ํ๋๊ทธ๋ ์ด ํ๋ ์์ด ์๋ณ๋ ์คํธ๋ฆผ์ ๋ํด ์๋ํฌ์ธํธ๊ฐ ์ ์กํ ๋ง์ง๋ง ํ๋ ์์์ ๋ํ๋ธ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ฉด ์คํธ๋ฆผ์ "half-closed" ์ํ ์ค ํ๋ ๋๋ "closed" ์ํ๋ก ์ ์ด๋๋ค(์น์ 5.1).
DATA ํ๋ ์์ ๋ฐ๋์ ์คํธ๋ฆผ๊ณผ ์ฐ๊ด๋์ด์ผ ํ๋ค. Stream Identifier ํ๋๊ฐ 0x00์ธ DATA ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
DATA ํ๋ ์์ ํ๋ฆ ์ ์ด์ ๋์์ด๋ฉฐ ์คํธ๋ฆผ์ด "open" ๋๋ "half-closed (remote)" ์ํ์ผ ๋๋ง ์ ์ก๋ ์ ์๋ค. ์ ์ฒด DATA ํ๋ ์ ํ์ด๋ก๋๋ Pad Length ๋ฐ Padding ํ๋๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ํฌํจํ์ฌ ํ๋ฆ ์ ์ด์ ํฌํจ๋๋ค. ์คํธ๋ฆผ์ด "open" ๋๋ "half-closed (local)" ์ํ๊ฐ ์๋ ์คํธ๋ฆผ์ DATA ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.2์ ๊ท์ ๋ STREAM_CLOSED ์ ํ์ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
ํจ๋ฉ ์ฅํ ์ ์ด ์๋ Pad Length ํ๋์ ๊ฐ์ผ๋ก ๊ฒฐ์ ๋๋ค. ํจ๋ฉ์ ๊ธธ์ด๊ฐ ํ๋ ์ ํ์ด๋ก๋์ ๊ธธ์ด ์ด์์ธ ๊ฒฝ์ฐ ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
6.2. HEADERS
HEADERS ํ๋ ์(type=0x01)์ ์คํธ๋ฆผ์ ์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ(์น์ 5.1) ํ๋ ๋ธ๋ก ์กฐ๊ฐ์ ํจ๊ป ์ด๋ฐํ๋ค. ์ด๋ฆ๊ณผ ๋ฌ๋ฆฌ HEADERS ํ๋ ์์ ํค๋ ์น์ ๋๋ ํธ๋ ์ผ๋ฌ ์น์ ์ ์ด๋ฐํ ์ ์๋ค. HEADERS ํ๋ ์์ ์คํธ๋ฆผ์ด "idle", "reserved (local)", "open" ๋๋ "half-closed (remote)" ์ํ์ผ ๋ ์ ์ก๋ ์ ์๋ค.
HEADERS Frame {
Length (24),
Type (8) = 0x01,
Unused Flags (2),
PRIORITY Flag (1),
Unused Flag (1),
PADDED Flag (1),
END_HEADERS Flag (1),
Unused Flag (1),
END_STREAM Flag (1),
Reserved (1),
Stream Identifier (31),
[Pad Length (8)],
[Exclusive (1)],
[Stream Dependency (31)],
[Weight (8)],
Field Block Fragment (..),
Padding (..2040),
}
๊ทธ๋ฆผ 4: HEADERS ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. HEADERS ํ๋ ์ ํ์ด๋ก๋์๋ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ํ๋๊ฐ ์๋ค:
- Pad Length:
- ํ๋ ์ ํจ๋ฉ์ ๊ธธ์ด๋ฅผ ์ฅํ ๋จ์๋ก ๋ด๋ 8๋นํธ ํ๋์ด๋ค. ์ด ํ๋๋ PADDED ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์กด์ฌํ๋ค.
- Exclusive:
- ๋จ์ผ ๋นํธ ํ๋๊ทธ. ์ด ํ๋๋ PRIORITY ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์กด์ฌํ๋ค. HEADERS ํ๋ ์์ ์ฐ์ ์์ ์ ํธ๋ ์ฌ์ฉ ์ค๋จ๋์๋ค; ์์ธํ ๋ด์ฉ์ ์น์ 5.3.2๋ฅผ ๋ณด๋ผ.
- Stream Dependency:
- 31๋นํธ ์คํธ๋ฆผ ์๋ณ์. ์ด ํ๋๋ PRIORITY ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์กด์ฌํ๋ค.
- Weight:
- ๋ถํธ ์๋ 8๋นํธ ์ ์. ์ด ํ๋๋ PRIORITY ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์กด์ฌํ๋ค.
- Field Block Fragment:
- ํ๋ ๋ธ๋ก ์กฐ๊ฐ(์น์ 4.3).
- Padding:
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ฏธ๋ฅผ ๊ฐ์ง์ง ์๋ ํจ๋ฉ ์ฅํ ๋ค. ์ ์ก ์ ํจ๋ฉ ์ฅํ ์ MUST 0์ผ๋ก ์ค์ ๋์ด์ผ ํ๋ค. ์์ ์๋ ํจ๋ฉ์ ๊ฒ์ฆํ ์๋ฌด๋ ์์ง๋ง, ๋น์(้้ถ) ํจ๋ฉ์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ MAY ์๋ค.
HEADERS ํ๋ ์์ ๋ค์๊ณผ ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ ์ํ๋ค:
- PRIORITY (0x20):
-
์ค์ ๋๋ฉด PRIORITY ํ๋๊ทธ๋ Exclusive, Stream Dependency ๋ฐ Weight ํ๋๊ฐ ์กด์ฌํจ์ ๋ํ๋ธ๋ค.
- PADDED (0x08):
-
์ค์ ๋๋ฉด PADDED ํ๋๊ทธ๋ Pad Length ํ๋์ ๊ทธ๊ฐ ์ค๋ช ํ๋ ํจ๋ฉ์ด ์กด์ฌํจ์ ๋ํ๋ธ๋ค.
- END_HEADERS (0x04):
-
์ค์ ๋๋ฉด END_HEADERS ํ๋๊ทธ๋ ์ด ํ๋ ์์ด ์ ์ฒด ํ๋ ๋ธ๋ก(์น์ 4.3)์ ํฌํจํ๋ฉฐ ๋ค๋ฐ๋ฅด๋ CONTINUATION ํ๋ ์์ด ์์์ ๋ํ๋ธ๋ค.END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ HEADERS ํ๋ ์์ ๋์ผํ ์คํธ๋ฆผ์ ๋ํ CONTINUATION ํ๋ ์์ผ๋ก ๋ค๋ฐ๋ผ์ผ ํ๋ค. ์์ ์๋ ๋ค๋ฅธ ์ ํ์ ํ๋ ์์ด๋ ๋ค๋ฅธ ์คํธ๋ฆผ์ ํ๋ ์์ ์์ ํ๋ฉด ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
- END_STREAM (0x01):
-
์ค์ ๋๋ฉด END_STREAM ํ๋๊ทธ๋ ์ด ํ๋ ๋ธ๋ก(์น์ 4.3)์ด ์๋ณ๋ ์คํธ๋ฆผ์ ๋ํด ์๋ํฌ์ธํธ๊ฐ ์ ์กํ ๋ง์ง๋ง ๊ฒ์์ ๋ํ๋ธ๋ค.END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ HEADERS ํ๋ ์์ ์คํธ๋ฆผ์ ์ข ๋ฃ๋ฅผ ์ ํธํ๋ค. ๋ค๋ง END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ HEADERS ํ๋ ์์ ์ด์ด ๋์ผํ ์คํธ๋ฆผ์ ๋ํด CONTINUATION ํ๋ ์์ด ์ฌ ์ ์๋ค. ๋ ผ๋ฆฌ์ ์ผ๋ก๋ CONTINUATION ํ๋ ์์ HEADERS ํ๋ ์์ ์ผ๋ถ์ด๋ค.
HEADERS ํ๋ ์์ ํ๋ ์ ํ์ด๋ก๋๋ ํ๋ ๋ธ๋ก ์กฐ๊ฐ(์น์ 4.3)์ ํฌํจํ๋ค. HEADERS ํ๋ ์์ ๋ง์ง ์๋ ํ๋ ๋ธ๋ก์ CONTINUATION ํ๋ ์(์น์ 6.10)์์ ๊ณ์๋๋ค.
HEADERS ํ๋ ์์ ๋ฐ๋์ ์คํธ๋ฆผ๊ณผ ์ฐ๊ด๋์ด์ผ ํ๋ค. Stream Identifier ํ๋๊ฐ 0x00์ธ HEADERS ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
HEADERS ํ๋ ์์ ์น์ 4.3์ ์ค๋ช ๋ ๋๋ก ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
ํจ๋ฉ ์ฅํ ์ ์ด ์๋ Pad Length ํ๋์ ๊ฐ์ผ๋ก ๊ฒฐ์ ๋๋ค. ํจ๋ฉ์ ๊ธธ์ด๊ฐ ํ๋ ์ ํ์ด๋ก๋์ ๊ธธ์ด ์ด์์ธ ๊ฒฝ์ฐ ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
6.3. PRIORITY
PRIORITY ํ๋ ์(type=0x02)์ ์ฌ์ฉ ์ค๋จ(deprecated)๋์๋ค; ์์ธํ ๋ด์ฉ์ ์น์ 5.3.2๋ฅผ ๋ณด๋ผ. PRIORITY ํ๋ ์์ idle ๋๋ closed ์คํธ๋ฆผ์ ํฌํจํ์ฌ ์ด๋ค ์คํธ๋ฆผ ์ํ์์๋ ์ ์ก๋ ์ ์๋ค.
PRIORITY Frame {
Length (24) = 0x05,
Type (8) = 0x02,
Unused Flags (8),
Reserved (1),
Stream Identifier (31),
Exclusive (1),
Stream Dependency (31),
Weight (8),
}
๊ทธ๋ฆผ 5: PRIORITY ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. PRIORITY ํ๋ ์์ ํ์ด๋ก๋๋ ๋ค์์ ์ถ๊ฐ ํ๋๋ฅผ ํฌํจํ๋ค:
- Exclusive:
- ๋จ์ผ ๋นํธ ํ๋๊ทธ.
- Stream Dependency:
- 31๋นํธ ์คํธ๋ฆผ ์๋ณ์.
- Weight:
- ๋ถํธ ์๋ 8๋นํธ ์ ์.
PRIORITY ํ๋ ์์ ์ด๋ค ํ๋๊ทธ๋ ์ ์ํ์ง ์๋๋ค.
PRIORITY ํ๋ ์์ ํญ์ ์คํธ๋ฆผ์ ์๋ณํ๋ค. Stream Identifier๊ฐ 0x00์ธ PRIORITY ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
PRIORITY ํ๋ ์์ ์ ์ก ๋๋ ์์ ์ ์ด๋ค ์คํธ๋ฆผ์ ์ํ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค(์น์ 5.1). PRIORITY ํ๋ ์์ "idle" ๋๋ "closed"๋ฅผ ํฌํจํ ์ด๋ค ์ํ์ ์คํธ๋ฆผ์์๋ ์ ์ก๋ ์ ์๋ค. PRIORITY ํ๋ ์์ ๋จ์ผ ํ๋ ๋ธ๋ก์ ๊ตฌ์ฑํ๋ ์ฐ์๋ ํ๋ ์๋ค ์ฌ์ด์ ์ ์ก๋์ด์๋ ์ ๋๋ค(์น์ 4.3).
๊ธธ์ด๊ฐ 5 ์ฅํ ์ด ์๋ PRIORITY ํ๋ ์์ ์น์ 5.4.2์ ๊ท์ ๋ FRAME_SIZE_ERROR ์ ํ์ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
6.4. RST_STREAM
RST_STREAM ํ๋ ์(type=0x03)์ ์คํธ๋ฆผ์ ์ฆ์ ์ข ๋ฃํ ์ ์๊ฒ ํด ์ค๋ค. RST_STREAM์ ์คํธ๋ฆผ ์ทจ์๋ฅผ ์์ฒญํ๊ฑฐ๋ ์ค๋ฅ ์กฐ๊ฑด์ด ๋ฐ์ํ์์ ์๋ฆฌ๊ธฐ ์ํด ์ ์ก๋๋ค.
RST_STREAM Frame {
Length (24) = 0x04,
Type (8) = 0x03,
Unused Flags (8),
Reserved (1),
Stream Identifier (31),
Error Code (32),
}
๊ทธ๋ฆผ 6: RST_STREAM ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. ์ถ๊ฐ๋ก RST_STREAM ํ๋ ์์ ์ค๋ฅ ์ฝ๋๋ฅผ ์๋ณํ๋ ๋ถํธ ์๋ 32๋นํธ ์ ์ ํ๋๋ฅผ ํฌํจํ๋ค(์น์ 7). ์ค๋ฅ ์ฝ๋๋ ์คํธ๋ฆผ์ด ์ข ๋ฃ๋๋ ์ด์ ๋ฅผ ๋ํ๋ธ๋ค.
RST_STREAM ํ๋ ์์ ์ด๋ค ํ๋๊ทธ๋ ์ ์ํ์ง ์๋๋ค.
RST_STREAM ํ๋ ์์ ์ฐธ์กฐ๋ ์คํธ๋ฆผ์ ์์ ํ ์ข ๋ฃ์ํค๊ณ ํด๋น ์คํธ๋ฆผ์ "closed" ์ํ๋ก ๋ง๋ ๋ค. ์คํธ๋ฆผ์์ RST_STREAM์ ์์ ํ ํ ์์ ์๋ ํด๋น ์คํธ๋ฆผ์ ๋ํด ์ถ๊ฐ ํ๋ ์์ ์ ์กํด์๋ ์ ๋๋ค(MUST NOT), ๋จ PRIORITY๋ ์์ธ์ด๋ค. ๊ทธ๋ฌ๋ RST_STREAM์ ์ ์กํ ํ ์ ์กํ ์๋ํฌ์ธํธ๋ RST_STREAM ๋์ฐฉ ์ ์ ํผ์ด๊ฐ ์ ์กํ๊ฑฐ๋ ์ ์ก ๋๊ธฐ์ด์ ์ฌ๋ ค๋ ์ถ๊ฐ ํ๋ ์์ ์์ ํ๊ณ ์ฒ๋ฆฌํ ์ค๋น๋ฅผ MUST ํด์ผ ํ๋ค.
RST_STREAM ํ๋ ์์ ๋ฐ๋์ ์คํธ๋ฆผ๊ณผ ์ฐ๊ด๋์ด์ผ ํ๋ค. Stream Identifier๊ฐ 0x00์ธ RST_STREAM ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
RST_STREAM ํ๋ ์์ "idle" ์ํ์ ์คํธ๋ฆผ์ ๋ํด ์ ์กํด์๋ MUST NOT ํ๋ค. "idle" ์คํธ๋ฆผ์ ์๋ณํ๋ RST_STREAM ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
๊ธธ์ด๊ฐ 4 ์ฅํ ์ด ์๋ RST_STREAM ํ๋ ์์ ์น์ 5.4.1์ ๊ท์ ๋ FRAME_SIZE_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
6.5. SETTINGS
SETTINGS ํ๋ ์(type=0x04)์ ํผ์ด ๋์์ ์ ํธ๋ ๋ฐ ์ ์ฝ๊ณผ ๊ฐ์ด ์๋ํฌ์ธํธ ๊ฐ ํต์ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น๋ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ค. ๋ํ SETTINGS ํ๋ ์์ ์ด๋ฌํ ์ค์ ์ ์์ ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. SETTINGS ํ๋ ์์ ๊ฐ๋ณ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ "setting"์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
์ค์ ์ ํ์๋๋ ๊ฒ์ด ์๋๋ผ ์ ์ก์ ํผ์ด์ ํน์ฑ์ ์ค๋ช ํ๋ฉฐ ์์ ํผ์ด๊ฐ ์ฌ์ฉํ๋ค. ๋์ผํ ์ค์ ์ ๋ํด ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ ํผ์ด๊ฐ ๊ด๊ณ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ๋ ๋์ ์ด๊ธฐ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ค์ ํ ์ ์๊ณ , ์๋ฒ๋ ์์ ๋ณด์กด์ ์ํด ๋ ๋ฎ์ ๊ฐ์ ์ค์ ํ ์ ์๋ค.
SETTINGS ํ๋ ์์ ์ฐ๊ฒฐ ์์ ์ ์์ชฝ ์๋ํฌ์ธํธ๊ฐ MUST ์ ์กํด์ผ ํ๋ฉฐ, ์ฐ๊ฒฐ ์์ ์ฃผ๊ธฐ ์ค ๋ค๋ฅธ ์์ ์ ์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ ์ ์กํ ์ ์๋ค(MAY). ๊ตฌํ์ฒด๋ ์ด ๋ช ์ธ์์์ ์ ์ํ ๋ชจ๋ ์ค์ ์ ์ง์ํด์ผ ํ๋ค(MUST).
SETTINGS ํ๋ ์์ ๊ฐ ๋งค๊ฐ๋ณ์๋ ํด๋น ๋งค๊ฐ๋ณ์์ ๊ธฐ์กด ๊ฐ์ ๋์ฒดํ๋ค. ์ค์ ์ ํ์๋๋ ์์๋๋ก ์ฒ๋ฆฌ๋๋ฉฐ, SETTINGS ํ๋ ์์ ์์ ์๋ ๊ฐ ์ค์ ์ ํ์ฌ ๊ฐ ์ธ์๋ ์ด๋ค ์ํ๋ ์ ์งํ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ SETTINGS ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์์ ์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ณธ ๊ฐ์ด๋ค.
SETTINGS ํ๋ ์์ ์์ ํผ์ด์ ์ํด ํ์ธ๋๋ค. ์ด๋ฅผ ์ํด SETTINGS ํ๋ ์์ ACK ํ๋๊ทธ๋ฅผ ์ ์ํ๋ค:
- ACK (0x01):
- ์ค์ ๋๋ฉด ACK ํ๋๊ทธ๋ ์ด ํ๋ ์์ด ํผ์ด์ SETTINGS ํ๋ ์ ์์ ๋ฐ ์ ์ฉ์ ํ์ธํจ์ ๋ํ๋ธ๋ค. ์ด ๋นํธ๊ฐ ์ค์ ๋๋ฉด SETTINGS ํ๋ ์์ ํ์ด๋ก๋๋ MUST ๋น์ด ์์ด์ผ ํ๋ค. ACK ํ๋๊ทธ๊ฐ ์ค์ ๋ SETTINGS ํ๋ ์์ ๊ธธ์ด ํ๋ ๊ฐ์ด 0์ด ์๋ ์ํ๋ก ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ FRAME_SIZE_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค. ์์ธํ ๋ด์ฉ์ ์น์ 6.5.3("Settings Synchronization")์ ๋ณด๋ผ.
SETTINGS ํ๋ ์์ ํญ์ ์ฐ๊ฒฐ์ ์ ์ฉ๋๋ฉฐ, ๋จ์ผ ์คํธ๋ฆผ์๋ ์ ์ฉ๋์ง ์๋๋ค. SETTINGS ํ๋ ์์ Stream Identifier ํ๋๋ 0(0x00)์ด์ด์ผ ํ๋ค(MUST). Stream Identifier ํ๋๊ฐ 0x00์ด ์๋ SETTINGS ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
SETTINGS ํ๋ ์์ ์ฐ๊ฒฐ ์ํ์ ์ํฅ์ ์ค๋ค. ์๋ชป ํ์ฑ๋์๊ฑฐ๋ ๋ถ์์ ํ SETTINGS ํ๋ ์์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
๊ธธ์ด๊ฐ 6 ์ฅํ ์ ๋ฐฐ์๊ฐ ์๋ SETTINGS ํ๋ ์์ ์น์ 5.4.1์ ๊ท์ ๋ FRAME_SIZE_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
6.5.1. SETTINGS ํ์
SETTINGS ํ๋ ์์ ํ์ด๋ก๋๋ 16๋นํธ ์ค์ ์๋ณ์์ 32๋นํธ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ 0๊ฐ ์ด์์ ์ค์ ๋ค๋ก ์ด๋ฃจ์ด์ง๋ค.
SETTINGS Frame {
Length (24),
Type (8) = 0x04,
Unused Flags (7),
ACK Flag (1),
Reserved (1),
Stream Identifier (31) = 0,
Setting (48) ...,
}
Setting {
Identifier (16),
Value (32),
}
๊ทธ๋ฆผ 7: SETTINGS ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. SETTINGS ํ๋ ์์ ํ์ด๋ก๋๋ ์์ ๊ฐ์์ Setting ํ๋๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ Setting ํ๋๋ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋๋ค:
- Identifier:
- 16๋นํธ ์ค์ ์๋ณ์; ์น์ 6.5.2 ์ฐธ์กฐ.
- Value:
- ์ค์ ์ ๋ํ 32๋นํธ ๊ฐ.
6.5.2. ์ ์๋ ์ค์
๋ค์์ ์ค์ ๋ค์ด ์ ์๋์ด ์๋ค:
- SETTINGS_HEADER_TABLE_SIZE (0x01):
-
์ด ์ค์ ์ ์ก์ ์๊ฐ ํ๋ ๋ธ๋ก์ ๋์ฝ๋ฉํ๋ ๋ฐ ์ฌ์ฉํ๋ ์์ถ ํ ์ด๋ธ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ฅํ ๋จ์๋ก ์๊ฒฉ ์๋ํฌ์ธํธ์ ์๋ฆด ์ ์๊ฒ ํ๋ค. ์ธ์ฝ๋๋ ์ด ๊ฐ ์ดํ์ ์์ ํฌ๊ธฐ๋ฅผ ์์ถ ํ์ ๋ด๋ถ์ ์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ์ ์๋ค(์์ธํ ๋ด์ฉ์ [COMPRESSION] ์ฐธ์กฐ). ์ด๊ธฐ ๊ฐ์ 4,096 ์ฅํ ์ด๋ค.
- SETTINGS_ENABLE_PUSH (0x02):
-
์ด ์ค์ ์ ์๋ฒ ํธ์๋ฅผ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค. ์๋ฒ๋ ์ด ํ๋ผ๋ฏธํฐ๊ฐ 0์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ PUSH_PROMISE ํ๋ ์์ ์ ์กํด์๋ ์ ๋๋ค(MUST NOT); ์์ธํ ๋ด์ฉ์ ์น์ 8.4๋ฅผ ๋ณด๋ผ. ํด๋ผ์ด์ธํธ๊ฐ ์ด ํ๋ผ๋ฏธํฐ๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ ์ด๋ฅผ ํ์ธ๋ฐ์๋ค๋ฉด, PUSH_PROMISE ํ๋ ์์ ์์ ํ๋ ๊ฒ์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).SETTINGS_ENABLE_PUSH์ ์ด๊ธฐ ๊ฐ์ 1์ด๋ค. ํด๋ผ์ด์ธํธ์๊ฒ ์ด ๊ฐ์ PUSH_PROMISE ํ๋ ์์ ์์ ํ๊ธธ ์ํจ์ ๋ํ๋ธ๋ค. ์๋ฒ์ ๋ํด์๋ ์ด ์ด๊ธฐ ๊ฐ์ ํจ๊ณผ๊ฐ ์์ผ๋ฉฐ ๊ฐ 0๊ณผ ๋๋ฑํ๋ค. 0 ๋๋ 1 ์ด์ธ์ ๊ฐ์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).์๋ฒ๋ ์ด ๊ฐ์ ๋ช ์์ ์ผ๋ก 1๋ก ์ค์ ํด์๋ ์ ๋๋ค(MUST NOT). ์๋ฒ๋ SETTINGS ํ๋ ์์ ๋ณด๋ผ ๋ ์ด ์ค์ ์ ์๋ตํ ์ ์์ผ๋ฉฐ, ํฌํจํ๋ค๋ฉด ๊ทธ ๊ฐ์ MUST 0์ด์ด์ผ ํ๋ค. ํด๋ผ์ด์ธํธ๋ SETTINGS_ENABLE_PUSH๊ฐ 1๋ก ์ค์ ๋ SETTINGS ํ๋ ์์ ์์ ํ๋ฉด ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
- SETTINGS_MAX_CONCURRENT_STREAMS (0x03):
-
์ด ์ค์ ์ ์ก์ ์๊ฐ ํ์ฉํ ์ต๋ ๋์ ์คํธ๋ฆผ ์๋ฅผ ๋ํ๋ธ๋ค. ์ด ์ ํ์ ๋ฐฉํฅ์ฑ์ ์ด๋ฉฐ, ์ก์ ์๊ฐ ์์ ์๊ฐ ์์ฑํ ์ ์๋๋ก ํ์ฉํ๋ ์คํธ๋ฆผ ์์ ์ ์ฉ๋๋ค. ์ด๊ธฐ์๋ ์ด ๊ฐ์ ์ ํ์ด ์๋ค. ๋ณ๋ ฌ์ฑ์ ๋ถํ์ํ๊ฒ ์ ํํ์ง ์๊ธฐ ์ํด ์ด ๊ฐ์ 100๋ณด๋ค ์๊ฒ ์ค์ ํ์ง ์๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.SETTINGS_MAX_CONCURRENT_STREAMS์ ๊ฐ์ด 0์ธ ๊ฒฝ์ฐ ์๋ํฌ์ธํธ๋ ์ด๋ฅผ ํน๋ณํ๊ฒ ์ฒ๋ฆฌํด์๋ ์ ๋๋ค(SHOULD NOT). 0 ๊ฐ์ ์๋ก์ด ์คํธ๋ฆผ ์์ฑ ์์ฒด๋ฅผ ๋ฐฉ์งํ๊ธด ํ์ง๋ง, ํ์ฑ ์คํธ๋ฆผ์ผ๋ก ์์ง๋๋ ๋ค๋ฅธ ์ด๋ค ์ ํ์์๋ ๋์ผํ ํ์์ด ๋ฐ์ํ ์ ์๋ค. ์๋ฒ๋ ์งง์ ๊ธฐ๊ฐ ๋์๋ง 0์ ์ค์ ํด์ผ ํ๋ค(SHOULD); ๋ง์ฝ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฝํ๊ณ ์ถ์ง ์๋ค๋ฉด ์ฐ๊ฒฐ์ ๋ซ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค.
- SETTINGS_INITIAL_WINDOW_SIZE (0x04):
-
์ด ์ค์ ์ ์คํธ๋ฆผ ์์ค ํ๋ฆ ์ ์ด๋ฅผ ์ํ ์ก์ ์์ ์ด๊ธฐ ์ฐฝ ํฌ๊ธฐ(์ฅํ ๋จ์)๋ฅผ ๋ํ๋ธ๋ค. ์ด๊ธฐ ๊ฐ์ 216-1(65,535) ์ฅํ ์ด๋ค.์ด ์ค์ ์ ๋ชจ๋ ์คํธ๋ฆผ์ ์ฐฝ ํฌ๊ธฐ์ ์ํฅ์ ์ค๋ค(์์ธํ ๋ด์ฉ์ ์น์ 6.9.2 ์ฐธ์กฐ).231-1์ ์ด๊ณผํ๋ ๊ฐ์ ์น์ 5.4.1์ ๊ท์ ๋ FLOW_CONTROL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
- SETTINGS_MAX_FRAME_SIZE (0x05):
-
์ด ์ค์ ์ ์ก์ ์๊ฐ ์์ ํ ์ํฅ์ด ์๋ ์ต๋ ํ๋ ์ ํ์ด๋ก๋ ํฌ๊ธฐ๋ฅผ ์ฅํ ๋จ์๋ก ๋ํ๋ธ๋ค.์ด๊ธฐ ๊ฐ์ 214(16,384) ์ฅํ ์ด๋ค. ์๋ํฌ์ธํธ๊ฐ ๊ด๊ณ ํ๋ ๊ฐ์ ์ด๊ธฐ ๊ฐ๊ณผ ํ์ฉ๋๋ ์ต๋ ํ๋ ์ ํฌ๊ธฐ(224-1 ๋๋ 16,777,215 ์ฅํ ) ์ฌ์ด์ฌ์ผ ํ๋ฉฐ ํฌํจ๋๋ค. ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฐ์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
- SETTINGS_MAX_HEADER_LIST_SIZE (0x06):
-
์ด ๊ถ๊ณ ์ค์ ์ ์ก์ ์๊ฐ ์์ ํ ์ค๋น๊ฐ ๋ ์ต๋ ํ๋ ์น์ ํฌ๊ธฐ๋ฅผ ์ฅํ ๋จ์๋ก ํผ์ด์๊ฒ ์๋ฆฐ๋ค. ๊ฐ์ ํ๋ ๋ผ์ธ์ ๋น์์ถ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ฉฐ, ์ด๋ฆ๊ณผ ๊ฐ์ ๊ธธ์ด(์ฅํ ๋จ์)์ ๊ฐ ํ๋ ๋ผ์ธ์ ๋ํด 32 ์ฅํ ์ ์ค๋ฒํค๋๋ฅผ ๋ํ ๊ฒ์ด๋ค.ํน์ ์์ฒญ์ ๋ํด ๊ด๊ณ ๋ ๊ฐ๋ณด๋ค ๋ ๋ฎ์ ํ๋๋ฅผ ๊ฐ์ ํ MAY ์๋ค. ์ด ์ค์ ์ ์ด๊ธฐ ๊ฐ์ ๋ฌด์ ํ์ด๋ค.
์๋ ค์ง์ง ์์๊ฑฐ๋ ์ง์๋์ง ์๋ ์๋ณ์๋ฅผ ๊ฐ์ง SETTINGS ํ๋ ์์ ์์ ํ ์๋ํฌ์ธํธ๋ ํด๋น ์ค์ ์ ๋ฌด์ํด์ผ ํ๋ค(MUST).
6.5.3. ์ค์ ๋๊ธฐํ
๋๋ถ๋ถ์ SETTINGS ๊ฐ์ ํผ์ด๊ฐ ๋ณ๊ฒฝ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์์ ํ๊ณ ์ ์ฉํ์ ๋๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ ์ตํ๊ฑฐ๋ ํ์ํ๋ค. ์ด๋ฌํ ๋๊ธฐํ ์์ ์ ์ ๊ณตํ๊ธฐ ์ํด, ACK ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ SETTINGS ํ๋ ์์ ์์ ์๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ ๋ฐ์ดํธ๋ ์ค์ ์ ์ ์ฉํด์ผ ํ๋ค(MUST). SETTINGS ํ๋ ์์ ์์ ๋ ์์๋๋ก ํ์ธ๋๋ค.
SETTINGS ํ๋ ์์ ๊ฐ๋ค์ ๋ค๋ฅธ ๊ฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ์ ๋์ง ์์ ์ฑ ํ์๋ ์์๋๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST). ์ง์๋์ง ์๋ ์ค์ ์ ๋ฌด์๋์ด์ผ ํ๋ค(MUST). ๋ชจ๋ ๊ฐ์ด ์ฒ๋ฆฌ๋ ํ ์์ ์๋ ์ฆ์ ACK ํ๋๊ทธ๊ฐ ์ค์ ๋ SETTINGS ํ๋ ์์ ์ ์กํด์ผ ํ๋ค(MUST). ACK ํ๋๊ทธ๊ฐ ์ค์ ๋ SETTINGS ํ๋ ์์ ์์ ํ๋ฉด ๋ณ๊ฒฝ๋ ์ค์ ์ ์ ์กํ ์ชฝ์ ๊ฐ์ฅ ์ค๋๋ ๋ฏธํ์ธ SETTINGS ํ๋ ์์ ๊ฐ์ด ์ ์ฉ๋์์์ ์ ๋ขฐํ ์ ์๋ค.
๋ฐ์ ์๊ฐ ํฉ๋ฆฌ์ ์ธ ์๊ฐ ๋ด์ ํ์ธ์ ๋ฐ์ง ๋ชปํ๋ฉด ์น์ 5.4.1์ ๊ท์ ๋ SETTINGS_TIMEOUT ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ MAY ์๋ค. ํ์์์์ ์ค์ ํ ๋ ํผ์ด์ ์ฒ๋ฆฌ ์ง์ฐ์ ๊ณ ๋ คํด์ผ ํ๋ค; ๋จ์ง ์๋ํฌ์ธํธ ๊ฐ ์๋ณต ์๊ฐ๋ง์ ๊ทผ๊ฑฐ๋ก ํ ํ์์์์ ์๋ชป๋ ์ค๋ฅ๋ฅผ ์ด๋ํ ์ ์๋ค.
6.6. PUSH_PROMISE
PUSH_PROMISE ํ๋ ์(type=0x05)์ ์ก์ ์๊ฐ ์์ํ ์๋๊ฐ ์๋ ์คํธ๋ฆผ์ ๋ฏธ๋ฆฌ ํผ์ด์๊ฒ ์๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. PUSH_PROMISE ํ๋ ์์ ์๋ํฌ์ธํธ๊ฐ ์์ฑํ ๊ณํ์ธ ์คํธ๋ฆผ์ ๋ถํธ ์๋ 31๋นํธ ์๋ณ์์ ํด๋น ์คํธ๋ฆผ์ ๋ํ ์ถ๊ฐ ๋ฌธ๋งฅ์ ์ ๊ณตํ๋ ํ๋ ์น์ ์ ํฌํจํ๋ค. PUSH_PROMISE ํ๋ ์์ ์ฌ์ฉ์ ๋ํ ์์ธํ ์ค๋ช ์ ์น์ 8.4์ ์๋ค.
PUSH_PROMISE Frame {
Length (24),
Type (8) = 0x05,
Unused Flags (4),
PADDED Flag (1),
END_HEADERS Flag (1),
Unused Flags (2),
Reserved (1),
Stream Identifier (31),
[Pad Length (8)],
Reserved (1),
Promised Stream ID (31),
Field Block Fragment (..),
Padding (..2040),
}
๊ทธ๋ฆผ 8: PUSH_PROMISE ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. PUSH_PROMISE ํ๋ ์ ํ์ด๋ก๋์๋ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ํ๋๊ฐ ์๋ค:
- Pad Length:
- ํ๋ ์ ํจ๋ฉ์ ๊ธธ์ด๋ฅผ ์ฅํ ๋จ์๋ก ๋ด๋ 8๋นํธ ํ๋์ด๋ค. ์ด ํ๋๋ PADDED ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์กด์ฌํ๋ค.
- Promised Stream ID:
- PUSH_PROMISE์ ์ํด ์์ฝ๋ ์คํธ๋ฆผ์ ์๋ณํ๋ ๋ถํธ ์๋ 31๋นํธ ์ ์์ด๋ค. ์ฝ์๋ ์คํธ๋ฆผ ์๋ณ์๋ ์ก์ ์๊ฐ ๋ค์์ ์ ์กํ ์ ์คํธ๋ฆผ์ ๋ํ ์ ํจํ ์ ํ์ด์ด์ผ ํ๋ค(์น์ 5.1.1์ "new stream identifier" ์ฐธ์กฐ)(MUST).
- Field Block Fragment:
- ์์ฒญ ์ ์ด ๋ฐ์ดํฐ์ ํค๋ ์น์ ์ ํฌํจํ๋ ํ๋ ๋ธ๋ก ์กฐ๊ฐ(์น์ 4.3).
- Padding:
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ฏธ๋ฅผ ๊ฐ์ง์ง ์๋ ํจ๋ฉ ์ฅํ ๋ค. ์ ์ก ์ ํจ๋ฉ ์ฅํ ์ MUST 0์ผ๋ก ์ค์ ๋์ด์ผ ํ๋ค. ์์ ์๋ ํจ๋ฉ์ ๊ฒ์ฆํ ์๋ฌด๋ ์์ง๋ง, ๋น์(้้ถ) ํจ๋ฉ์ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ MAY ์๋ค.
PUSH_PROMISE ํ๋ ์์ ๋ค์๊ณผ ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ ์ํ๋ค:
- PADDED (0x08):
-
์ค์ ๋๋ฉด PADDED ํ๋๊ทธ๋ Pad Length ํ๋์ ๊ทธ๊ฐ ์ค๋ช ํ๋ ํจ๋ฉ์ด ์กด์ฌํจ์ ๋ํ๋ธ๋ค.
- END_HEADERS (0x04):
-
์ค์ ๋๋ฉด END_HEADERS ํ๋๊ทธ๋ ์ด ํ๋ ์์ด ์ ์ฒด ํ๋ ๋ธ๋ก(์น์ 4.3)์ ํฌํจํ๋ฉฐ ๋ค๋ฐ๋ฅด๋ CONTINUATION ํ๋ ์์ด ์์์ ๋ํ๋ธ๋ค.END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ PUSH_PROMISE ํ๋ ์์ ๋์ผํ ์คํธ๋ฆผ์ ๋ํ CONTINUATION ํ๋ ์์ผ๋ก ๋ค๋ฐ๋ผ์ผ ํ๋ค(MUST). ์์ ์๋ ๋ค๋ฅธ ์ ํ์ ํ๋ ์์ด๋ ๋ค๋ฅธ ์คํธ๋ฆผ์ ํ๋ ์์ ์์ ํ๋ฉด ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
PUSH_PROMISE ํ๋ ์์ ๋ฐ๋์ ํผ์ด๊ฐ ์์ํ ์คํธ๋ฆผ์์๋ง ์ ์ก๋์ด์ผ ํ๋ฉฐ ํด๋น ์คํธ๋ฆผ์ "open" ๋๋ "half-closed (remote)" ์ํ์ฌ์ผ ํ๋ค(MUST). PUSH_PROMISE์ Stream Identifier ํ๋๋ ๊ทธ๊ฒ์ด ์ฐ๊ด๋ ์คํธ๋ฆผ์ ๋ํ๋ธ๋ค. Stream Identifier ํ๋๊ฐ 0x00์ ์ง์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
์ฝ์๋ ์คํธ๋ฆผ์ ์ฝ์๋ ์์๋๋ก ์ฌ์ฉ๋ ํ์๊ฐ ์๋ค. PUSH_PROMISE๋ ๋จ์ง ๋์ค์ ์ฌ์ฉํ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์์ฝํ ๋ฟ์ด๋ค.
SETTINGS ํ๋ ์์ ์๋ ํผ์ด์ SETTINGS_ENABLE_PUSH ์ค์ ์ด 0์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ PUSH_PROMISE๋ ์ ์ก๋์ด์๋ ์ ๋๋ค(MUST NOT). ์ด ์ค์ ์ 0์ผ๋ก ์ค์ ํ๊ณ ํ์ธ์ ๋ฐ์ ์๋ํฌ์ธํธ๋ PUSH_PROMISE ํ๋ ์์ ์์ ํ๋ฉด ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
PUSH_PROMISE ํ๋ ์์ ์์ ์๋ ์ฝ์๋ ์คํธ๋ฆผ์ ๊ฑฐ๋ถํ๊ธฐ ์ํด ํด๋น ์ฝ์๋ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๋ RST_STREAM์ ์ ์กํ ์ ์๋ค.
PUSH_PROMISE ํ๋ ์์ ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๋ค. ์ฒซ์งธ, ํ๋ ๋ธ๋ก์ ํฌํจ(์น์ 4.3)์ ํ๋ ์น์ ์์ถ์ ์ํด ์ ์ง๋๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ๋์งธ, PUSH_PROMISE๋ ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด ์คํธ๋ฆผ์ ์์ฝํ์ฌ ์ฝ์๋ ์คํธ๋ฆผ์ "reserved (local)" ๋๋ "reserved (remote)" ์ํ๋ก ๋ง๋ ๋ค. ์ก์ ์๋ ํด๋น ์คํธ๋ฆผ์ด "open" ๋๋ "half-closed (remote)" ์ํ์ธ ๊ฒฝ์ฐ์๋ง PUSH_PROMISE๋ฅผ ์ ์กํด์ผ ํ๋ฉฐ(MUST NOT), ์ฝ์๋ ์คํธ๋ฆผ์ด ์ ์คํธ๋ฆผ ์๋ณ์์ ๋ํ ์ ํจํ ์ ํ์ธ์ง ๋ณด์ฅํด์ผ ํ๋ค(์น์ 5.1.1)(์ฆ, ์ฝ์๋ ์คํธ๋ฆผ์ "idle" ์ํ์ฌ์ผ ํ๋ค)(MUST).
PUSH_PROMISE๋ ์คํธ๋ฆผ์ ์์ฝํ๋ฏ๋ก PUSH_PROMISE ํ๋ ์์ ๋ฌด์ํ๋ฉด ์คํธ๋ฆผ ์ํ๊ฐ ๋ถํ์ ์ํ๊ฐ ๋๋ค. ์์ ์๋ ์ฐ๊ด๋ ์คํธ๋ฆผ์ด "open"๋ ์๋๊ณ "half-closed (local)"๋ ์๋ ์คํธ๋ฆผ์์ PUSH_PROMISE๋ฅผ ์์ ํ๋ฉด ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST). ๋ค๋ง ์ฐ๊ด๋ ์คํธ๋ฆผ์์ RST_STREAM์ ์ ์กํ ์๋ํฌ์ธํธ๋ ํด๋น RST_STREAM ํ๋ ์์ด ์์ ๋๊ณ ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์์ฑ๋์์ ์ ์๋ PUSH_PROMISE ํ๋ ์์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์ฝ์๋ ์คํธ๋ฆผ ์๋ณ์๊ฐ ๋ถ๋ฒ์ ์ธ ๊ฒฝ์ฐ(์น์ 5.1.1), ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST). ๋ถ๋ฒ์ ์ธ ์คํธ๋ฆผ ์๋ณ์๋ ํ์ฌ "idle" ์ํ๊ฐ ์๋ ์คํธ๋ฆผ์ ์๋ณ์์ด๋ค.
ํจ๋ฉ ์ฅํ ์ ์ด ์๋ Pad Length ํ๋์ ๊ฐ์ผ๋ก ๊ฒฐ์ ๋๋ค. ํจ๋ฉ์ ๊ธธ์ด๊ฐ ํ๋ ์ ํ์ด๋ก๋์ ๊ธธ์ด ์ด์์ธ ๊ฒฝ์ฐ ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
6.7. PING
PING ํ๋ ์(type=0x06)์ ์ก์ ์๋ก๋ถํฐ ์ต์ ์๋ณต ์๊ฐ์ ์ธก์ ํ๊ณ ์ ํด ์ฐ๊ฒฐ์ด ์ฌ์ ํ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ค. PING ํ๋ ์์ ์ด๋ ์๋ํฌ์ธํธ์์๋ ๋ณด๋ผ ์ ์๋ค.
PING Frame {
Length (24) = 0x08,
Type (8) = 0x06,
Unused Flags (7),
ACK Flag (1),
Reserved (1),
Stream Identifier (31) = 0,
Opaque Data (64),
}
๊ทธ๋ฆผ 9: PING ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค.
ํ๋ ์ ํค๋ ์ธ์๋ PING ํ๋ ์์ ํ์ด๋ก๋์ 8 ์ฅํ ์ ๋ถํฌ๋ช ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํ๋ค(MUST). ์ก์ ์๋ ์์์ ๊ฐ์ ํฌํจํ ์ ์์ผ๋ฉฐ ๊ทธ ์ฅํ ๋ค์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ฌ์ฉํ ์ ์๋ค.
ACK ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ PING ํ๋ ์์ ์์ ํ ์์ ์๋ ๋์ผํ ํ๋ ์ ํ์ด๋ก๋๋ก ACK ํ๋๊ทธ๊ฐ ์ค์ ๋ PING ํ๋ ์์ ์๋ต์ผ๋ก ์ ์กํด์ผ ํ๋ค(MUST). PING ์๋ต์ ๋ค๋ฅธ ์ด๋ค ํ๋ ์๋ณด๋ค ๋์ ์ฐ์ ์์๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค(SHOULD).
PING ํ๋ ์์ ๋ค์๊ณผ ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ ์ํ๋ค:
- ACK (0x01):
- ์ค์ ๋๋ฉด ์ด PING ํ๋ ์์ด PING ์๋ต์์ ๋ํ๋ธ๋ค. ์๋ํฌ์ธํธ๋ PING ์๋ต์์ ์ด ํ๋๊ทธ๋ฅผ MUST ์ค์ ํด์ผ ํ๋ค. ๋ํ ์ด ํ๋๊ทธ๊ฐ ์ค์ ๋ PING ํ๋ ์์ ์๋ตํด์๋ ์ ๋๋ค(MUST NOT).
PING ํ๋ ์์ ์ด๋ค ๊ฐ๋ณ ์คํธ๋ฆผ๊ณผ๋ ์ฐ๊ด๋์ง ์๋๋ค. Stream Identifier ํ๋ ๊ฐ์ด 0x00์ด ์๋ PING ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
๊ธธ์ด๊ฐ 8์ด ์๋ PING ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ FRAME_SIZE_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
6.8. GOAWAY
GOAWAY ํ๋ ์(type=0x07)์ ์ฐ๊ฒฐ ์ข ๋ฃ๋ฅผ ์์ํ๊ฑฐ๋ ์ฌ๊ฐํ ์ค๋ฅ ์ํ๋ฅผ ์๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋๋ค. GOAWAY๋ ์๋ํฌ์ธํธ๊ฐ ์ ์คํธ๋ฆผ ์๋ฝ์ ์ ์ฐจ ์ค๋จํ๋ฉด์ ์ด์ ์ ์ค์ ๋ ์คํธ๋ฆผ์ ์ฒ๋ฆฌ๋ ์๋ฃํ ์ ์๊ฒ ํ๋ค. ์ด๋ ์๋ฒ ์ ์ง๋ณด์์ ๊ฐ์ ๊ด๋ฆฌ ์์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
์๋ํฌ์ธํธ๊ฐ ์ ์คํธ๋ฆผ์ ์์ํ๋ ๊ฒ๊ณผ ์๊ฒฉ ํผ์ด๊ฐ GOAWAY๋ฅผ ๋ณด๋ด๋ ๊ฒ ์ฌ์ด์๋ ๋ณธ์ง์ ์ธ ๊ฒฝ์ ์กฐ๊ฑด์ด ์๋ค. ์ด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด GOAWAY๋ ์ด ์ฐ๊ฒฐ์์ ์ก์ ์๊ฐ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์ ์์๋ ๋ง์ง๋ง ํผ์ด-์์ ์คํธ๋ฆผ์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ํฌํจํ๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ๊ฐ GOAWAY๋ฅผ ๋ณด๋ผ ๊ฒฝ์ฐ ์๋ณ๋ ์คํธ๋ฆผ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ํ ๊ฐ์ฅ ๋์ ๋ฒํธ์ ์คํธ๋ฆผ์ด๋ค.
GOAWAY๋ฅผ ๋ณด๋ธ ์ดํ ์ก์ ์๋ ํฌํจ๋ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ณด๋ค ๋์ ์๋ณ์๋ฅผ ๊ฐ์ง ์์ ์๊ฐ ์์ํ ์คํธ๋ฆผ์ ๋ํด ์ ์ก๋ ํ๋ ์์ ๋ฌด์ํ ๊ฒ์ด๋ค. GOAWAY ํ๋ ์์ ์์ ์๋ ์ฐ๊ฒฐ์์ ์ถ๊ฐ ์คํธ๋ฆผ์ ์ด์ด์๋ ์ ๋๋ค(MUST NOT), ๋ค๋ง ์ ์คํธ๋ฆผ์ ์ํด ์ ์ฐ๊ฒฐ์ ์ค์ ํ ์๋ ์๋ค.
GOAWAY ์์ ์๊ฐ GOAWAY์ ํ์๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์คํธ๋ฆผ ์๋ณ์์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๊ฒฝ์ฐ, ํด๋น ์คํธ๋ฆผ๋ค์ ์ฒ๋ฆฌ๋์ง ์์๊ฑฐ๋ ์ฒ๋ฆฌ๋์ง ์์ ๊ฒ์ด๋ค. GOAWAY ํ๋ ์์ ์์ ์๋ ํด๋น ์คํธ๋ฆผ๋ค์ ๋ง์น ์ ํ ์์ฑ๋์ง ์์๋ ๊ฒ์ฒ๋ผ ์ทจ๊ธํ๊ณ ๋์ค์ ์ ์ฐ๊ฒฐ์์ ์ฌ์๋ํ ์ ์๋ค.
์๋ํฌ์ธํธ๋ ์ฐ๊ฒฐ์ ๋ซ๊ธฐ ์ ์ ํญ์ GOAWAY ํ๋ ์์ ๋ณด๋ด์ด ์๊ฒฉ ํผ์ด๊ฐ ์คํธ๋ฆผ์ด ์ผ๋ถ๋ง ์ฒ๋ฆฌ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์๊ฒ ํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค(SHOULD). ์๋ฅผ ๋ค์ด HTTP ํด๋ผ์ด์ธํธ๊ฐ POST๋ฅผ ์ ์กํ ๋์์ ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ ๋ซ์ผ๋ฉด ์๋ฒ๊ฐ ์ด๋ค ์คํธ๋ฆผ์ ๋ํด ์์ ์ ์์ํ๋์ง ์๋ ค์ฃผ๋ GOAWAY๋ฅผ ๋ณด๋ด์ง ์์ผ๋ฉด ํด๋ผ์ด์ธํธ๋ ๊ทธ POST ์์ฒญ์ด ์ฒ๋ฆฌ๋์๋์ง ์ ์ ์๋ค.
์๋ํฌ์ธํธ๋ ๋ถ๋ ํผ์ด์ ๋ํด GOAWAY๋ฅผ ๋ณด๋ด์ง ์๊ณ ์ฐ๊ฒฐ์ ๋ซ๊ธฐ๋ก ์ ํํ ์ ์๋ค.
GOAWAY ํ๋ ์์ ํญ์ ์ฐ๊ฒฐ์ ๋ซ๊ธฐ ์ง์ ์ ์ ์ก๋ ํ์๋ ์๋ค; GOAWAY๋ฅผ ์์ ํ ์ชฝ์ด ์ฐ๊ฒฐ์ ๋ ์ด์ ํ์๋ก ํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๊ธฐ ์ ์ GOAWAY๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค(SHOULD).
GOAWAY Frame {
Length (24),
Type (8) = 0x07,
Unused Flags (8),
Reserved (1),
Stream Identifier (31) = 0,
Reserved (1),
Last-Stream-ID (31),
Error Code (32),
Additional Debug Data (..),
}
๊ทธ๋ฆผ 10: GOAWAY ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค.
GOAWAY ํ๋ ์์ ์ด๋ค ํ๋๊ทธ๋ ์ ์ํ์ง ์๋๋ค.
GOAWAY ํ๋ ์์ ํน์ ์คํธ๋ฆผ์ด ์๋๋ผ ์ฐ๊ฒฐ์ ์ ์ฉ๋๋ค. Stream Identifier๊ฐ 0x00์ด ์๋ GOAWAY ํ๋ ์์ ์์ ํ ์๋ํฌ์ธํธ๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
GOAWAY ํ๋ ์์ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ ์ก์ ์๊ฐ ์ด๋ค ์คํธ๋ฆผ์ ๋ํด ์ด๋ค ์กฐ์น๋ฅผ ์ทจํ๊ฑฐ๋ ์์ง ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ ๊ฐ์ฅ ๋์ ๋ฒํธ์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ํฌํจํ๋ค. ์๋ณ๋ ์คํธ๋ฆผ๊น์ง์ ๋ชจ๋ ์คํธ๋ฆผ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ฒ๋ฆฌ๋์์ ์ ์๋ค. ์ฒ๋ฆฌ๋ ์คํธ๋ฆผ์ด ์๋ค๋ฉด ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ 0์ผ๋ก ์ค์ ๋ ์ ์๋ค.
์ฐ๊ฒฐ์ด GOAWAY ์์ด ์ข ๋ฃ๋๋ฉด ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ ์ฌ์ค์ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋์ ์คํธ๋ฆผ ์๋ณ์๊ฐ ๋๋ค.
๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ฒํธ์ ์คํธ๋ฆผ์์ ์์ ํ ๋ซํ์ง ์์ ์์ ์ ์ฌ์๋ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค(์: ๋น๋ฉฑ๋ฑ ์์ ์ ์ธ). ๊ทธ๋ฌ๋ ๋ ๋์ ๋ฒํธ์ ์คํธ๋ฆผ์์์ ํ๋กํ ์ฝ ํ๋์ ์ ์ฐ๊ฒฐ์์ ์์ ํ๊ฒ ์ฌ์๋ํ ์ ์๋ค.
๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ณด๋ค ์์ ๋ฒํธ์ ์คํธ๋ฆผ์์์ ํ๋์ ์ฌ์ ํ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์ ์๋ค. GOAWAY๋ฅผ ๋ณด๋ธ ์ธก์ GOAWAY๋ฅผ ์ ์กํ ํ ์งํ ์ค์ธ ๋ชจ๋ ์คํธ๋ฆผ์ด ์๋ฃ๋ ๋๊น์ง ์ฐ๊ฒฐ์ "open" ์ํ๋ก ์ ์งํ์ฌ ์ฐ์ํ๊ฒ ์ข ๋ฃํ ์ ์๋ค.
์๋ํฌ์ธํธ๋ ์ํฉ ๋ณํ ์ ์ฌ๋ฌ GOAWAY ํ๋ ์์ ๋ณด๋ผ MAY ์๋ค. ์๋ฅผ ๋ค์ด, ์ฐ์ํ ์ข ๋ฃ ์ค NO_ERROR์ ํจ๊ป GOAWAY๋ฅผ ๋ณด๋๋ ์๋ํฌ์ธํธ๊ฐ ์ดํ ์ฆ์ ์ฐ๊ฒฐ์ ์ข ๋ฃํด์ผ ํ๋ ์กฐ๊ฑด์ ๋ง๋ ์ ์๋ค. ๋ง์ง๋ง์ผ๋ก ์์ ๋ GOAWAY์ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ ์ด๋ค ์คํธ๋ฆผ์ด ์ฒ๋ฆฌ๋์์ ์ ์๋์ง๋ฅผ ๋ํ๋ธ๋ค. ์๋ํฌ์ธํธ๋ ์ด๋ฏธ ๋ณด๋ธ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์์ ๊ฐ์ ์ฆ๊ฐ์์ผ์๋ ์ ๋๋ค(MUST NOT), ์๋ํ๋ฉด ํผ์ด๊ฐ ์ด๋ฏธ ์ฒ๋ฆฌ๋์ง ์์ ์์ฒญ์ ๋ค๋ฅธ ์ฐ๊ฒฐ์์ ์ฌ์๋ํ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์๋ํ ์ ์์ ๊ฒฝ์ฐ ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ ๋ซ์ ๋ ์ ์ก ์ค์ธ ๋ชจ๋ ์์ฒญ์ ์๊ฒ ๋๋ค. ์ด๋ ์ค๊ฐ์๊ฐ HTTP/2๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์๋น์ค๋ฅผ ์ ๊ณตํ ๋ ํนํ ํด๋น๋๋ค. ์๋ฒ๊ฐ ์ฐ์ํ๊ฒ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋ ค ํ๋ฉด ์ด๊ธฐ GOAWAY ํ๋ ์์ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ฅผ 231-1๋ก ์ค์ ํ๊ณ NO_ERROR ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์กํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค(SHOULD). ์ด๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ข ๋ฃ๊ฐ ์๋ฐํ์ผ๋ฏ๋ก ์ถ๊ฐ ์์ฒญ์ ์์ํด์๋ ์ ๋จ์ ์ ํธํ๋ค. ์ธํ๋ผ์ดํธ ์คํธ๋ฆผ ์์ฑ์ ์๊ฐ์ด ํ์ฉ๋ ํ(์ต์ ํ ์๋ณต ์๊ฐ) ์๋ฒ๋ ์ ๋ฐ์ดํธ๋ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ฅผ ๊ฐ์ง ๋ ๋ค๋ฅธ GOAWAY ํ๋ ์์ ์ ์กํ ์ ์๋ค. ์ด๋ ์์ฒญ์ ์์ง ์์ผ๋ฉด์ ๊นจ๋ํ๊ฒ ์ฐ๊ฒฐ์ ์ข ๋ฃํ ์ ์๊ฒ ํ๋ค.
GOAWAY๋ฅผ ๋ณด๋ธ ํ ์ก์ ์๋ ํฌํจ๋ ๋ง์ง๋ง ์คํธ๋ฆผ ์๋ณ์๋ณด๋ค ๋์ ์๋ณ์๋ฅผ ๊ฐ์ง ์์ ์์ ์ํด ์์๋ ์คํธ๋ฆผ์ ๋ํ ํ๋ ์์ ํ๊ธฐํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํ๋ ์์ ์์ ํ ๋ฌด์๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด HEADERS, PUSH_PROMISE, ๋ฐ CONTINUATION ํ๋ ์์ ํ๋ ์น์ ์์ถ์ ์ํ ์ํ๊ฐ ์ผ๊ด๋๋๋ก ์ต์ํ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(์์ธํ ๋ด์ฉ์ ์น์ 4.3 ์ฐธ์กฐ); ๋ง์ฐฌ๊ฐ์ง๋ก DATA ํ๋ ์์ ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ ๋ฐ์๋์ด์ผ ํ๋ค. ์ด๋ฌํ ํ๋ ์์ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ํ๋ฆ ์ ์ด๋ ํ๋ ์น์ ์์ถ ์ํ๊ฐ ๋น๋๊ธฐํ๋ ์ ์๋ค.
GOAWAY ํ๋ ์์ ๋ํ ์ฐ๊ฒฐ ์ข ๋ฃ ์ด์ ๋ฅผ ๋ด์ 32๋นํธ ์ค๋ฅ ์ฝ๋(์น์ 7)๋ฅผ ํฌํจํ๋ค.
์๋ํฌ์ธํธ๋ ์ด๋ค GOAWAY ํ๋ ์์ ํ์ด๋ก๋์ ๋ถํฌ๋ช ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ MAY ์๋ค. ์ถ๊ฐ ๋๋ฒ๊ทธ ๋ฐ์ดํฐ๋ ์ง๋จ ๋ชฉ์ ์ผ๋ก๋ง ์๋๋๋ฉฐ ์๋ฏธ๋ก ์ ๊ฐ์น๋ ๊ฐ์ง ์๋๋ค. ๋๋ฒ๊ทธ ์ ๋ณด์๋ ๋ณด์ ๋๋ ๊ฐ์ธ์ ๋ณด ๋ฏผ๊ฐ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ ์๋ค. ๊ธฐ๋ก๋๊ฑฐ๋ ์ง์์ ์ผ๋ก ์ ์ฅ๋๋ ๋๋ฒ๊ทธ ๋ฐ์ดํฐ๋ ๋ฌด๋จ ์ ๊ทผ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์ ์ ํ ๋ณดํธ ์กฐ์น๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค(MUST).
6.9. WINDOW_UPDATE
WINDOW_UPDATE ํ๋ ์(type=0x08)์ ํ๋ฆ ์ ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค; ๊ฐ์๋ ์น์ 5.2๋ฅผ ๋ณด๋ผ.
ํ๋ฆ ์ ์ด๋ ๋ ์์ค์์ ์๋ํ๋ค: ๊ฐ๋ณ ์คํธ๋ฆผ๋ณ๊ณผ ์ ์ฒด ์ฐ๊ฒฐ์ ๋ํด.
๋ ์ ํ์ ํ๋ฆ ์ ์ด๋ ํ ๋จ์์ด๋ฉฐ, ์ฆ ์ ์๋ํฌ์ธํธ ๊ฐ์์๋ง ์๋ํ๋ค. ์ค๊ฐ์๋ ์ข ์๋ ์ฐ๊ฒฐ๋ค ์ฌ์ด์์ WINDOW_UPDATE ํ๋ ์์ ์ ๋ฌํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ์์ ์์ ์ํ ๋ฐ์ดํฐ ์ ์ก ์ ํ์ ์๋ ์ก์ ์ ์ชฝ์ผ๋ก ํ๋ฆ ์ ์ด ์ ๋ณด์ ์ ํ๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ด๋ํ ์ ์๋ค.
ํ๋ฆ ์ ์ด๋ ํ๋ฆ ์ ์ด์ ๋์์ด ๋๋ ํ๋ ์์๋ง ์ ์ฉ๋๋ค. ์ด ๋ฌธ์์์ ์ ์๋ ํ๋ ์ ์ค์์๋ ์ค์ง DATA ํ๋ ์๋ง ํ๋ฆ ์ ์ด์ ๋์์ด๋ค. ํ๋ฆ ์ ์ด์์ ๋ฉด์ ๋ ํ๋ ์์ ์์ ๊ฐ๋ฅํ๊ณ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฉฐ(MUST), ์์ ์๊ฐ ํด๋น ํ๋ ์์ ์ฒ๋ฆฌํ ์์์ ํ ๋นํ ์ ์์ผ๋ฉด ์์ ์๋ ์น์ 5.4.2 ๋๋ ์น์ 5.4.1์ ๊ท์ ๋ FLOW_CONTROL_ERROR ์ ํ์ ์คํธ๋ฆผ ์ค๋ฅ๋ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํ MAY ์๋ค.
WINDOW_UPDATE Frame {
Length (24) = 0x04,
Type (8) = 0x08,
Unused Flags (8),
Reserved (1),
Stream Identifier (31),
Reserved (1),
Window Size Increment (31),
}
๊ทธ๋ฆผ 11: WINDOW_UPDATE ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. WINDOW_UPDATE ํ๋ ์์ ํ์ด๋ก๋๋ ํ๋์ ์์ฝ ๋นํธ์ ์ก์ ์๊ฐ ๊ธฐ์กด ํ๋ฆ ์ ์ด ์ฐฝ์ ์ถ๊ฐ๋ก ์ ์กํ ์ ์๋ ์ฅํ ์๋ฅผ ๋ํ๋ด๋ ๋ถํธ ์๋ 31๋นํธ ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ํ๋ฆ ์ ์ด ์ฐฝ์ ์ฆ๊ฐ๋์ ๋ํ ํฉ๋ฒ์ ๋ฒ์๋ 1๋ถํฐ 231-1(2,147,483,647) ์ฅํ ์ด๋ค.
WINDOW_UPDATE ํ๋ ์์ ์ด๋ค ํ๋๊ทธ๋ ์ ์ํ์ง ์๋๋ค.
WINDOW_UPDATE ํ๋ ์์ ํน์ ์คํธ๋ฆผ์ ์ ์ฉ๋ ์๋ ์๊ณ ์ ์ฒด ์ฐ๊ฒฐ์ ์ ์ฉ๋ ์๋ ์๋ค. ์ ์์ ๊ฒฝ์ฐ ํ๋ ์์ Stream Identifier๊ฐ ์ํฅ์ ๋ฐ๋ ์คํธ๋ฆผ์ ๋ํ๋ด๋ฉฐ, ํ์์ ๊ฒฝ์ฐ ๊ฐ "0"์ด ์ ์ฒด ์ฐ๊ฒฐ์ ์ฃผ์ ๋ก ํจ์ ๋ํ๋ธ๋ค.
์์ ์๋ ํ๋ฆ ์ ์ด ์ฐฝ ์ฆ๊ฐ๋์ด 0์ธ WINDOW_UPDATE ํ๋ ์์ ์์ ํ๋ฉด ์ด๋ฅผ ์น์ 5.4.2์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST); ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ ๋ํ ์ค๋ฅ๋ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(์น์ 5.4.1)(MUST).
WINDOW_UPDATE๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ ์ ์กํ ํผ์ด๊ฐ ๋ณด๋ผ ์ ์๋ค. ์ด๋ ์์ ์๊ฐ "half-closed (remote)" ๋๋ "closed" ์ํ์ ์คํธ๋ฆผ์์ WINDOW_UPDATE ํ๋ ์์ ๋ฐ์ ์ ์์์ ์๋ฏธํ๋ค. ์์ ์๋ ์ด๋ฅผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์๋ ์ ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 5.1 ์ฐธ์กฐ).
์์ ์๊ฐ ํ๋ฆ ์ ์ด ๋์ ํ๋ ์์ ์์ ํ๋ฉด, ์์ ์๋ ์ด๋ฅผ ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ ๋ํด ํญ์ ๋ฐ์ํ์ฌ ๊ณ์ฐํด์ผ ํ๋ค. ์ด๋ ํ๋ ์์ด ์ค๋ฅ์ธ ๊ฒฝ์ฐ์๋ ํ์ํ๋ค. ์ก์ ์๊ฐ ํ๋ ์์ ํ๋ฆ ์ ์ด ์ฐฝ์ ํฌํจํ์ฌ ๊ณ์ฐํ์ง๋ง ์์ ์๊ฐ ์ด๋ฅผ ๋ฐ์ํ์ง ์์ผ๋ฉด ์ก์ ์์ ์์ ์์ ํ๋ฆ ์ ์ด ์ฐฝ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
๊ธธ์ด๊ฐ 4 ์ฅํ ์ด ์๋ WINDOW_UPDATE ํ๋ ์์ ์น์ 5.4.1์ ๊ท์ ๋ FRAME_SIZE_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค(MUST).
6.9.1. ํ๋ฆ ์ ์ด ์ฐฝ
HTTP/2์ ํ๋ฆ ์ ์ด๋ ๊ฐ ์ก์ ์๊ฐ ๋ชจ๋ ์คํธ๋ฆผ์ ๋ํด ์ ์งํ๋ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ค. ํ๋ฆ ์ ์ด ์ฐฝ์ ์ก์ ์๊ฐ ์ ์กํ ์ ์๋ ์ฅํ ์๋ฅผ ๋ํ๋ด๋ ์ ์ ๊ฐ์ผ๋ก, ๊ทธ ํฌ๊ธฐ๋ ์์ ์์ ๋ฒํผ๋ง ์ฉ๋์ ์ธก์ ํ๋ค.
์ ์ฉ๋๋ ํ๋ฆ ์ ์ด ์ฐฝ์ ์คํธ๋ฆผ ํ๋ฆ ์ ์ด ์ฐฝ๊ณผ ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ ๋ ๊ฐ์ง๊ฐ ์๋ค. ์ก์ ์๋ ์์ ์๊ฐ ๊ด๊ณ ํ ์ด๋ ํ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ฌ์ ๊ณต๊ฐ์ ์ด๊ณผํ๋ ๊ธธ์ด์ ํ๋ฆ ์ ์ด ๋์ ํ๋ ์์ ์ ์กํด์๋ ์ ๋๋ค(MUST NOT). END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ธธ์ด 0 ํ๋ ์(์: ๋น DATA ํ๋ ์)์ ๋ ํ๋ฆ ์ ์ด ์ฐฝ ์ค ์ด๋ ์ชฝ์ ์ฌ์ ๊ณต๊ฐ์ด ์๋๋ผ๋ ์ ์กํ ์ ์๋ค(MAY).
ํ๋ฆ ์ ์ด ๊ณ์ฐ์์๋ 9 ์ฅํ ์ ํ๋ ์ ํค๋๋ ํฌํจ๋์ง ์๋๋ค.
์ก์ ์๋ ํ๋ฆ ์ ์ด ๋์ ํ๋ ์์ ์ ์กํ ํ ์ ์กํ ํ๋ ์์ ๊ธธ์ด๋งํผ ๋ ์ฐฝ์์ ์ด์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ๊ฐ์์ํจ๋ค.
ํ๋ ์์ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๊ณ ํ๋ฆ ์ ์ด ์ฐฝ์ ๊ณต๊ฐ์ ํ๋ณดํจ์ ๋ฐ๋ผ WINDOW_UPDATE ํ๋ ์์ ๋ณด๋ธ๋ค. ์คํธ๋ฆผ ๋ฐ ์ฐ๊ฒฐ ์์ค์ ํ๋ฆ ์ ์ด ์ฐฝ์ ๋ํด ๋ณ๋์ WINDOW_UPDATE ํ๋ ์์ด ์ ์ก๋๋ค. ์์ ์๋ ๋งค์ฐ ์์ ์ฆ๊ฐ๋์ WINDOW_UPDATE๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ํผํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ๋ง๋ จํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค(์์ธํ ๋ด์ฉ์ RFC 1122 ์น์ 4.2.3.3 ์ฐธ์กฐ).
์ก์ ์๋ WINDOW_UPDATE ํ๋ ์์ ์์ ํ๋ฉด ํด๋น ์ฐฝ์ ํ๋ ์์ ์ง์ ๋ ์๋งํผ ์ ๋ฐ์ดํธํ๋ค.
์ก์ ์๋ ํ๋ฆ ์ ์ด ์ฐฝ์ด 231-1 ์ฅํ ์ ์ด๊ณผํ๋๋ก ํ์ฉํด์๋ ์ ๋๋ค(MUST NOT). ์ก์ ์๊ฐ WINDOW_UPDATE๋ฅผ ์์ ํ์ฌ ํ๋ฆ ์ ์ด ์ฐฝ์ด ์ด ์ต๋๋ฅผ ์ด๊ณผํ๊ฒ ๋๋ฉด ์ก์ ์๋ ์ ์ ํ ์คํธ๋ฆผ์ด๋ ์ฐ๊ฒฐ์ ์ข ๋ฃํด์ผ ํ๋ฉฐ, ์คํธ๋ฆผ์ ๊ฒฝ์ฐ RST_STREAM์ FLOW_CONTROL_ERROR ์ค๋ฅ ์ฝ๋์ ํจ๊ป ์ ์กํ๊ณ , ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ GOAWAY๋ฅผ FLOW_CONTROL_ERROR ์ค๋ฅ ์ฝ๋์ ํจ๊ป ์ ์กํด์ผ ํ๋ค(MUST).
์ก์ ์์ ํ๋ฆ ์ ์ด ๋์ ํ๋ ์๊ณผ ์์ ์์ WINDOW_UPDATE ํ๋ ์์ ์๋ก ์์ ํ ๋น๋๊ธฐ์ ์ด๋ค. ์ด ํน์ฑ์ ์์ ์๊ฐ ์ก์ ์์ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๊ณต๊ฒฉ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ ์คํธ๋ฆผ์ด ์ ์ฒด๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๊ฒ ํ๋ค.
6.9.2. ์ด๊ธฐ ํ๋ฆ ์ ์ด ์ฐฝ ํฌ๊ธฐ
HTTP/2 ์ฐ๊ฒฐ์ด ์ฒ์ ์ค์ ๋ ๋ ์ ์คํธ๋ฆผ์ ์ด๊ธฐ ํ๋ฆ ์ ์ด ์ฐฝ ํฌ๊ธฐ 65,535 ์ฅํ ์ ๊ฐ๋๋ค. ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ๋ 65,535 ์ฅํ ์ด๋ค. ์์ชฝ ์๋ํฌ์ธํธ๋ SETTINGS_INITIAL_WINDOW_SIZE์ ๊ฐ์ ํฌํจํ์ฌ ์ ์คํธ๋ฆผ์ ์ด๊ธฐ ์ฐฝ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค. ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ WINDOW_UPDATE ํ๋ ์์ ์ฌ์ฉํด์๋ง ๋ณ๊ฒฝํ ์ ์๋ค.
SETTINGS ํ๋ ์์ ์์ ํ์ฌ SETTINGS_INITIAL_WINDOW_SIZE ๊ฐ์ ์ค์ ๋ฐ๊ธฐ ์ ๊น์ง ์๋ํฌ์ธํธ๋ ์ ์ก ์ ๊ธฐ๋ณธ ์ด๊ธฐ ์ฐฝ ํฌ๊ธฐ๋ง ์ฌ์ฉํ ์ ์๋ค. ์ ์ฌํ๊ฒ, ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ WINDOW_UPDATE ํ๋ ์์ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ณธ ์ด๊ธฐ ์ฐฝ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ค์ ๋๋ค.
ACTIVATED๋์ง ์์ ์คํธ๋ฆผ๋ค ๋ฟ๋ง ์๋๋ผ ํ์ฑํ๋ ํ๋ฆ ์ ์ด ์ฐฝ์ ๊ฐ์ง ์คํธ๋ฆผ๋ค(์ฆ "open" ๋๋ "half-closed (remote)" ์ํ)์ ๋ํด์๋ SETTINGS ํ๋ ์์ ์ด๊ธฐ ํ๋ฆ ์ ์ด ์ฐฝ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. SETTINGS_INITIAL_WINDOW_SIZE ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์์ ์๋ ์ ์งํ๋ ๋ชจ๋ ์คํธ๋ฆผ ํ๋ฆ ์ ์ด ์ฐฝ์ ํฌ๊ธฐ๋ฅผ ์ ๊ฐ๊ณผ ์ด์ ๊ฐ์ ์ฐจ์ด๋งํผ ์กฐ์ ํด์ผ ํ๋ค(MUST).
SETTINGS_INITIAL_WINDOW_SIZE์ ๋ณ๊ฒฝ์ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ด์ฉ ๊ฐ๋ฅ ๊ณต๊ฐ์ ์์๋ก ๋ง๋ค ์ ์๋ค. ์ก์ ์๋ ์์์ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ถ์ ํด์ผ ํ๋ฉฐ, WINDOW_UPDATE๊ฐ ์ฐฝ์ ์์๋ก ๋ง๋ค ๋๊น์ง ์๋ก์ด ํ๋ฆ ์ ์ด ๋์ ํ๋ ์์ ์ ์กํด์๋ ์ ๋๋ค(MUST NOT).
์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ ์๋ฆฝ ์งํ 60KB๋ฅผ ์ ์กํ๊ณ ์๋ฒ๊ฐ ์ด๊ธฐ ์ฐฝ ํฌ๊ธฐ๋ฅผ 16KB๋ก ์ค์ ํ๋ฉด, ํด๋ผ์ด์ธํธ๋ SETTINGS ํ๋ ์ ์์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฆ ์ ์ด ์ฐฝ์ -44KB๋ก ์ฌ๊ณ์ฐํ๋ค. ํด๋ผ์ด์ธํธ๋ WINDOW_UPDATE ํ๋ ์์ด ์ฐฝ์ ์์๋ก ๋ณต์ํ ๋๊น์ง ์์ ์ฐฝ์ ์ ์งํ๊ณ ์ดํ์ ์ ์ก์ ์ฌ๊ฐํ ์ ์๋ค.
SETTINGS ํ๋ ์์ ์ฐ๊ฒฐ ํ๋ฆ ์ ์ด ์ฐฝ์ ๋ณ๊ฒฝํ ์ ์๋ค.
SETTINGS_INITIAL_WINDOW_SIZE ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ด๋ค ํ๋ฆ ์ ์ด ์ฐฝ์ด๋ผ๋ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๊ฒ ๋๋ฉด ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ FLOW_CONTROL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
6.9.3. ์คํธ๋ฆผ ์ฐฝ ํฌ๊ธฐ ์ถ์
์์ ์๊ฐ ํ์ฌ ํฌ๊ธฐ๋ณด๋ค ์์ ํ๋ฆ ์ ์ด ์ฐฝ์ ์ฌ์ฉํ๋ ค๋ฉด ์๋ก์ด SETTINGS ํ๋ ์์ ๋ณด๋ผ ์ ์๋ค. ๊ทธ๋ฌ๋ ์์ ์๋ ์ก์ ์๊ฐ SETTINGS ํ๋ ์์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๊ทธ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ผ๋ฏ๋ก ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์ด๊ณผํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํ๋ค(MUST).
์ด๊ธฐ ํ๋ฆ ์ ์ด ์ฐฝ ํฌ๊ธฐ๋ฅผ ์ถ์ํ๋ SETTINGS ํ๋ ์์ ์ ์กํ ํ ์์ ์๋ ๊ทธ๋ณด๋ค ํฐ ์คํธ๋ฆผ๋ค์ ๊ณ์ ์ฒ๋ฆฌํ ์ ์๋ค(MAY). ์คํธ๋ฆผ์ ๊ณ์ ํ์ฉํ๋ฉด ํ๋ฆ ์ ์ด ์ฐฝ์ ์ฆ์ ์ค์ฌ์ ํ๋ณดํ ๊ณต๊ฐ์ ๊ฐ์์ํค๋ ๊ฒ์ ํ์ฉํ์ง ์๋๋ค. ์ด๋ฌํ ์คํธ๋ฆผ๋ค์ ์งํ์ WINDOW_UPDATE ํ๋ ์์ด ํ์ํ๋ฏ๋ก ์ ์ฒด๋ ์ ์๋ค. ์์ ์๋ ๋์ ์ํฅ์ ๋ฐ๋ ์คํธ๋ฆผ๋ค์ ๋ํด RST_STREAM์ FLOW_CONTROL_ERROR ์ค๋ฅ ์ฝ๋์ ํจ๊ป ์ ์กํ ์ ์๋ค(MAY).
6.10. CONTINUATION
CONTINUATION ํ๋ ์(type=0x09)์ ํ๋ ๋ธ๋ก ์กฐ๊ฐ๋ค์ ์ฐ์์ ๊ณ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค(์น์ 4.3). ์ด์ ํ๋ ์์ด ๋์ผํ ์คํธ๋ฆผ์ ์๊ณ END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ HEADERS, PUSH_PROMISE ๋๋ CONTINUATION ํ๋ ์์ธ ํ ์์์ ์์ CONTINUATION ํ๋ ์์ ์ ์กํ ์ ์๋ค.
CONTINUATION Frame {
Length (24),
Type (8) = 0x09,
Unused Flags (5),
END_HEADERS Flag (1),
Unused Flags (2),
Reserved (1),
Stream Identifier (31),
Field Block Fragment (..),
}
๊ทธ๋ฆผ 12: CONTINUATION ํ๋ ์ ํ์
Length, Type, Unused Flag(s), Reserved ๋ฐ Stream Identifier ํ๋๋ ์น์ 4์ ์ค๋ช ๋์ด ์๋ค. CONTINUATION ํ๋ ์ ํ์ด๋ก๋๋ ํ๋ ๋ธ๋ก ์กฐ๊ฐ(์น์ 4.3)์ ํฌํจํ๋ค.
CONTINUATION ํ๋ ์์ ๋ค์๊ณผ ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ ์ํ๋ค:
- END_HEADERS (0x04):
-
์ค์ ๋๋ฉด END_HEADERS ํ๋๊ทธ๋ ์ด ํ๋ ์์ด ํ๋ ๋ธ๋ก(์น์ 4.3)์ ์ข ๋ฃํจ์ ๋ํ๋ธ๋ค.END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ผ๋ฉด ์ด ํ๋ ์์ MUST ๋ค๋ฅธ CONTINUATION ํ๋ ์์ผ๋ก ์ด์ด์ ธ์ผ ํ๋ค. ์์ ์๋ ๋ค๋ฅธ ์ ํ์ ํ๋ ์์ด๋ ๋ค๋ฅธ ์คํธ๋ฆผ์ ํ๋ ์์ ์์ ํ๋ฉด ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค(MUST).
CONTINUATION ํ๋ ์์ ์น์ 4.3์ ์ ์๋ ๋ฐ์ ๊ฐ์ด ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
CONTINUATION ํ๋ ์์ ๋ฐ๋์ ์คํธ๋ฆผ๊ณผ ์ฐ๊ด๋์ด์ผ ํ๋ค. Stream Identifier ํ๋๊ฐ 0x00์ธ CONTINUATION ํ๋ ์์ ์์ ํ๋ฉด ์์ ์๋ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
CONTINUATION ํ๋ ์์ END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ HEADERS, PUSH_PROMISE ๋๋ CONTINUATION ํ๋ ์์ ์ํด ์ ํ๋์ด์ผ ํ๋ค. ์ด ๊ท์น ์๋ฐ์ ๊ด์ฐฐํ ์์ ์๋ ์ด๋ฅผ ์น์ 5.4.1์ ๊ท์ ๋ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์๋ตํด์ผ ํ๋ค(MUST).
7. ์ค๋ฅ ์ฝ๋
์ค๋ฅ ์ฝ๋๋ ์คํธ๋ฆผ ๋๋ ์ฐ๊ฒฐ ์ค๋ฅ์ ์ด์ ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด RST_STREAM ๋ฐ GOAWAY ํ๋ ์์์ ์ฌ์ฉ๋๋ 32๋นํธ ํ๋์ ๋๋ค.
์ค๋ฅ ์ฝ๋๋ ๊ณตํต ์ฝ๋ ๊ณต๊ฐ์ ๊ณต์ ํฉ๋๋ค. ์ผ๋ถ ์ค๋ฅ ์ฝ๋๋ ์คํธ๋ฆผ์๋ง ์ ์ฉ๋๊ฑฐ๋ ์ฐ๊ฒฐ ์ ์ฒด์๋ง ์ ์ฉ๋๋ฉฐ, ๋ค๋ฅธ ๋ฌธ๋งฅ์์๋ ์ ์๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ค์์ ์ค๋ฅ ์ฝ๋๋ค์ด ์ ์๋์ด ์์ต๋๋ค:
- NO_ERROR (0x00):
- ๊ด๋ จ๋ ์ํ๊ฐ ์ค๋ฅ์ ๊ฒฐ๊ณผ๊ฐ ์๋์ ๋ํ๋ ๋๋ค. ์๋ฅผ ๋ค์ด, GOAWAY๋ ์ฐ๊ฒฐ์ ์ ์ ์ข ๋ฃ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ด ์ฝ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
- PROTOCOL_ERROR (0x01):
- ์๋ํฌ์ธํธ๊ฐ ํน์ ํ์ง ์์ ํ๋กํ ์ฝ ์ค๋ฅ๋ฅผ ๊ฐ์งํ์์ ๋ํ๋ ๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ ์ฝ๋๊ฐ ์์ ๋ ์ฌ์ฉํ๋ ์ฝ๋์ ๋๋ค.
- INTERNAL_ERROR (0x02):
- ์๋ํฌ์ธํธ๊ฐ ์๊ธฐ์น ์์ ๋ด๋ถ ์ค๋ฅ๋ฅผ ๋ง๋ฌ์์ ๋ํ๋ ๋๋ค.
- FLOW_CONTROL_ERROR (0x03):
- ํผ์ด๊ฐ ํ๋ฆ ์ ์ด ํ๋กํ ์ฝ์ ์๋ฐํ์์ ์๋ํฌ์ธํธ๊ฐ ๊ฐ์งํ์์ ๋ํ๋ ๋๋ค.
- SETTINGS_TIMEOUT (0x04):
- ์๋ํฌ์ธํธ๊ฐ SETTINGS ํ๋ ์์ ๋ณด๋์ผ๋ ์ ์์ ์๋ต์ ๋ฐ์ง ๋ชปํ์์ ๋ํ๋ ๋๋ค. ์์ธํ ๋ด์ฉ์ ์น์ 6.5.3("Settings Synchronization")์ ๋ณด์ญ์์ค.
- STREAM_CLOSED (0x05):
- ์คํธ๋ฆผ์ด ๋ฐ๋ซํ(half-closed) ์ํ์ธ ํ์ ํ๋ ์์ ์์ ํ์์ ๋ํ๋ ๋๋ค.
- FRAME_SIZE_ERROR (0x06):
- ์ ํจํ์ง ์์ ํฌ๊ธฐ์ ํ๋ ์์ ์์ ํ์์ ๋ํ๋ ๋๋ค.
- REFUSED_STREAM (0x07):
- ์๋ํฌ์ธํธ๊ฐ ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ฒ๋ฆฌ๋ ์ํํ๊ธฐ ์ ์ ์คํธ๋ฆผ์ ๊ฑฐ๋ถํ์์ ๋ํ๋ ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.7 ์ฐธ์กฐ).
- CANCEL (0x08):
- ์คํธ๋ฆผ์ด ๋ ์ด์ ํ์ํ์ง ์์์ ๋ํ๋ด๊ธฐ ์ํด ์๋ํฌ์ธํธ๊ฐ ์ฌ์ฉํ๋ ์ค๋ฅ ์ฝ๋์ ๋๋ค.
- COMPRESSION_ERROR (0x09):
- ์ฐ๊ฒฐ์ ๋ํ ํ๋ ์น์ ์์ถ ์ปจํ ์คํธ๋ฅผ ์ ์งํ ์ ์์์ ์๋ํฌ์ธํธ๊ฐ ๋ํ๋ ๋๋ค.
- CONNECT_ERROR (0x0a):
- CONNECT ์์ฒญ(์น์ 8.5)์ ๋ํ ์๋ต์ผ๋ก ์ค์ ๋ ์ฐ๊ฒฐ์ด ์ฌ์ค์ ๋์๊ฑฐ๋ ๋น์ ์์ ์ผ๋ก ๋ซํ์์ ๋ํ๋ ๋๋ค.
- ENHANCE_YOUR_CALM (0x0b):
- ํผ์ด๊ฐ ๊ณผ๋ํ ๋ถํ๋ฅผ ์ ๋ฐํ ์ ์๋ ํ๋์ ๋ณด์ด๊ณ ์์์ ์๋ํฌ์ธํธ๊ฐ ๊ฐ์งํ์์ ๋ํ๋ ๋๋ค.
- INADEQUATE_SECURITY (0x0c):
- ๊ธฐ์ ์ ์ก ๊ณ์ธต์ด ์ต์ ๋ณด์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ์ง ์์์ ๋ํ๋ ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 9.2 ์ฐธ์กฐ).
- HTTP_1_1_REQUIRED (0x0d):
- ์๋ํฌ์ธํธ๊ฐ HTTP/2 ๋์ HTTP/1.1 ์ฌ์ฉ์ ์๊ตฌํจ์ ๋ํ๋ ๋๋ค.
์๋ ค์ง์ง ์์๊ฑฐ๋ ์ง์๋์ง ์๋ ์ค๋ฅ ์ฝ๋๋ ์ด๋ค ํน๋ณํ ๋์์ ์ ๋ฐํด์๋ MUST NOT ํฉ๋๋ค. ์ด๋ฌํ ์ฝ๋๋ค์ ๊ตฌํ์ฒด์์ INTERNAL_ERROR์ ๋๋ฑํ๊ฒ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค(MAY).
8. HTTP/2์์์ HTTP ์๋ฏธ ํํ
HTTP/2๋ HTTP ๋ฉ์์ง ์ถ์ํ์ ํ ๊ตฌ์ฒดํ์ ๋๋ค(RFC 9110 ์น์ 6 ์ฐธ์กฐ).
8.1. HTTP ๋ฉ์์ง ํ๋ ์ด๋ฐ
ํด๋ผ์ด์ธํธ๋ ์ ์คํธ๋ฆผ์์ ์ด์ ์ ์ฌ์ฉ๋์ง ์์ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ์ ์ ์กํฉ๋๋ค(์น์ 5.1.1 ์ฐธ์กฐ). ์๋ฒ๋ ๋์ผํ ์คํธ๋ฆผ์์ ํด๋น ์์ฒญ์ ๋ํ HTTP ์๋ต์ ์ ์กํฉ๋๋ค.
HTTP ๋ฉ์์ง(์์ฒญ ๋๋ ์๋ต)๋ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ํค๋ ์น์ ์ ํฌํจํ๋ ํ๋์ HEADERS ํ๋ ์(๊ทธ ๋ค์ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์์ด ์ฌ ์ ์์; ์์ธํ ๋ด์ฉ์ RFC 9110 ์น์ 6.3 ์ฐธ์กฐ),
- ๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ๋ 0๊ฐ ์ด์์ DATA ํ๋ ์(์์ธํ ๋ด์ฉ์ RFC 9110 ์น์ 6.4 ์ฐธ์กฐ),
- ์ ํ์ ์ผ๋ก, ํธ๋ ์ผ๋ฌ ์น์ ์ด ์๋ ๊ฒฝ์ฐ ํ๋์ HEADERS ํ๋ ์(๊ทธ ๋ค์ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์์ด ์ฌ ์ ์์).
์๋ต์ ๊ฒฝ์ฐ์ ํํด, ์๋ฒ๋ ์ต์ข ์๋ต์ ๋ด์ HEADERS ํ๋ ์ ์ ์ ์์์ ์์ ์ค๊ฐ ์๋ต(interim responses)์ ๋ณด๋ผ MAY ์์ต๋๋ค. ์ค๊ฐ ์๋ต์ ์์(1xx) HTTP ์๋ต์ ์ ์ด ๋ฐ์ดํฐ์ ํค๋ ์น์ ์ ํฌํจํ๋ HEADERS ํ๋ ์(๊ทธ ๋ค์ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์์ด ์ฌ ์ ์์)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ํ ์ฝ๋๊ฐ ์ ๋ณด ์ฝ๋(1xx)์ธ HEADERS ํ๋ ์์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ ์ด๋ ์๋ชป๋ ํ์์ ๋๋ค(์น์ 8.1.1 ์ฐธ์กฐ).
์ํ์ค์ ๋ง์ง๋ง ํ๋ ์์ END_STREAM ํ๋๊ทธ๋ฅผ ๊ฐ์ง๋ฉฐ, END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ HEADERS ํ๋ ์์ ๋จ์ ์๋ ํ๋ ๋ธ๋ก ์กฐ๊ฐ๋ค์ ์ ์กํ๋ CONTINUATION ํ๋ ์๋ค๋ก ๋ค๋ฐ๋ฅผ ์ ์์์ ๋ํ๋ ๋๋ค.
๋ค๋ฅธ ์คํธ๋ฆผ์ ํ๋ ์(์ด๋ค ์คํธ๋ฆผ์์๋ )์ HEADERS ํ๋ ์๊ณผ ๊ทธ์ ๋ค๋ฐ๋ฅด๋ CONTINUATION ํ๋ ์๋ค ์ฌ์ด์๋ ๋ฐ์ํด์๋ ์ ๋ฉ๋๋ค(MUST NOT).
HTTP/2๋ ๋ฉ์์ง ๋ณธ๋ฌธ์ ์ ์กํ๊ธฐ ์ํด DATA ํ๋ ์์ ์ฌ์ฉํฉ๋๋ค. chunked ์ ์ก ์ธ์ฝ๋ฉ(HTTP/1.1์ ์น์ 7.1)์ HTTP/2์์ ์ฌ์ฉํ ์ ์์ต๋๋ค; ๊ด๋ จ ๋ด์ฉ์ ์น์ 8.2.2๋ฅผ ๋ณด์ญ์์ค.
ํธ๋ ์ผ๋ฌ ํ๋๋ ์คํธ๋ฆผ์ ์ข ๋ฃ์ํค๋ ํ๋ ๋ธ๋ก์ผ๋ก ์ด๋ฐ๋ฉ๋๋ค. ์ฆ, ํธ๋ ์ผ๋ฌ๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ HEADERS ํ๋ ์์ผ๋ก ์์ํ๊ณ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์์ ๋ฐ๋ฅด๋ฉฐ, ํด๋น HEADERS ํ๋ ์์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋์ด์ผ ํฉ๋๋ค. ํธ๋ ์ผ๋ฌ์๋ ์์ฌ-ํค๋ ํ๋๋ค์ด ํฌํจ๋์ด์๋ ์ ๋ฉ๋๋ค(์น์ 8.3). ํธ๋ ์ผ๋ฌ์์ ์์ฌ-ํค๋ ํ๋๊ฐ ์์ ๋๋ฉด ํด๋น ์์ฒญ ๋๋ ์๋ต์ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
์์ฒญ์ ์ฌ๋ HEADERS ํ๋ ์์ ๋ฐ์ ํ์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ ๋ค๋ฅธ HEADERS ํ๋ ์์ ์์ ํ๋ฉด ํด๋น ์์ฒญ ๋๋ ์๋ต์ ์๋ชป๋ ํ์์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
HTTP ์์ฒญ/์๋ต ๊ตํ์ ๋จ์ผ ์คํธ๋ฆผ์ ์์ ํ ์๋นํฉ๋๋ค. ์์ฒญ์ ์คํธ๋ฆผ์ "open" ์ํ๋ก ๋ง๋๋ HEADERS ํ๋ ์์ผ๋ก ์์ํฉ๋๋ค. ์์ฒญ์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ผ๋ก ๋๋๋ฉฐ, ์ด๋ ํด๋ผ์ด์ธํธ์ ๋ํด ์คํธ๋ฆผ์ "half-closed (local)"๋ก, ์๋ฒ์ ๋ํด "half-closed (remote)"๋ก ๋ง๋ญ๋๋ค. ์๋ต ์คํธ๋ฆผ์ 0๊ฐ ์ด์์ ์ค๊ฐ ์๋ต(HEADERS ํ๋ ์)์ผ๋ก ์์ํ ๋ค ์ต์ข ์ํ ์ฝ๋๋ฅผ ํฌํจํ๋ HEADERS ํ๋ ์์ผ๋ก ๋๋ฉ๋๋ค.
์๋ฒ๊ฐ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ ์ ์กํ๊ฑฐ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฅผ ์์ ํ๋ฉด ์๋ต์ด ์๋ฃ๋ฉ๋๋ค(ํ์ํ CONTINUATION ํ๋ ์ ํฌํจ). ์๋ฒ๋ ์์ฒญ์ ์์ง ์ ์ก๋์ง ์์ ์ผ๋ถ์ ์์กดํ์ง ์๋ ๊ฒฝ์ฐ ์ ์ฒด ์๋ต์ ํด๋ผ์ด์ธํธ๊ฐ ์ ์ฒด ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ์ ์กํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์๋ฒ๋ ์์ ํ ์๋ต์ ์ ์กํ ํ ์์ฒญ์ ์ ์ก์ ์ค๋ฅ ์์ด ์ค๋จํ๋๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญํ๊ธฐ ์ํด RST_STREAM์ NO_ERROR ์ค๋ฅ ์ฝ๋๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฌํ RST_STREAM์ ์์ ํ๋ค๊ณ ํด์ ์๋ต์ ํ๊ธฐํด์๋ ์ ๋์ง๋ง, ๋ค๋ฅธ ์ด์ ๋ก ์๋ต์ ํ๊ธฐํ ์๋ ์์ต๋๋ค.
8.1.1. ์๋ชป๋ ํ์์ ๋ฉ์์ง
์๋ชป๋ ์์ฒญ ๋๋ ์๋ต์ด๋ HTTP/2 ํ๋ ์๋ค์ ์ ํจํ ์ฐ์์ด์ง๋ง ๋ถํ์ํ ํ๋ ์, ๊ธ์ง๋ ํ๋ ๋๋ ์์ฌ-ํค๋ ํ๋์ ์กด์ฌ, ํ์ ์์ฌ-ํค๋ ํ๋์ ๋ถ์ฌ, ๋๋ฌธ์ ํ๋ ์ด๋ฆ์ ํฌํจ, ๋๋ ํน์ ์ํฉ์์ ํ์ฉ๋์ง ์๋ ํ๋ ์ด๋ฆ/๊ฐ ๋ฑ์ผ๋ก ์ธํด ๋ฌดํจ๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํฉ๋๋ค(์์ธํ ๋ด์ฉ์ ์น์ 8.2 ์ฐธ์กฐ).
๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ๋ ์์ฒญ ๋๋ ์๋ต์ content-length ํค๋ ํ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ง์ฝ content-length ํค๋์ ๊ฐ์ด ์ค์ ๋ก ์ ์ก๋ DATA ํ๋ ์ ํ์ด๋ก๋์ ํฉ๊ณ์ ์ผ์นํ์ง ์์ผ๋ฉด(๋ฉ์์ง๊ฐ ๋ณธ๋ฌธ์ด ์๋๋ก ์ ์๋์ง ์์ ๊ฒฝ์ฐ) ๊ทธ ์์ฒญ ๋๋ ์๋ต์ ์๋ชป๋ ํ์์ ๋๋ค. ์๋ฅผ ๋ค์ด 204 ๋๋ 304 ์๋ต๊ณผ HEAD ์์ฒญ์ ์๋ต์ ๋ณธ๋ฌธ์ ํฌํจํ์ง ์์ต๋๋ค. ๋ณธ๋ฌธ์ด ์๋๋ก ์ ์๋ ์๋ต์ DATA ํ๋ ์์ ๋ด์ฉ์ด ํฌํจ๋์ง ์๋๋ผ๋ ๋น์(้้ถ) content-length ํค๋๋ฅผ ๊ฐ์ง MAY ์์ต๋๋ค.
HTTP ์์ฒญ ๋๋ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ค๊ฐ์(ํฐ๋๋ก ๋์ํ์ง ์๋ ์ค๊ฐ์)๋ ์๋ชป๋ ํ์์ ์์ฒญ์ด๋ ์๋ต์ ์ ๋ฌํด์๋ MUST NOT ํฉ๋๋ค. ๊ฐ์ง๋ ์๋ชป๋ ์์ฒญ ๋๋ ์๋ต์ ์คํธ๋ฆผ ์ค๋ฅ(์น์ 5.4.2)๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ์ค๋ฅ ์ ํ์ PROTOCOL_ERROR์ ๋๋ค(MUST).
์๋ชป๋ ํ์์ ์์ฒญ์ ๋ํด ์๋ฒ๋ ์คํธ๋ฆผ์ ๋ซ๊ฑฐ๋ ๋ฆฌ์ ํ๊ธฐ ์ ์ ์๋ต์ ๋ณด๋ผ MAY ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ชป๋ ํ์์ ์๋ต์ ์๋ฝํด์๋ MUST NOT ํฉ๋๋ค.
๋ฉ์์ง๋ฅผ ์ ์ง์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์๋ํฌ์ธํธ๋ ์๋ชป๋ ํ์์ผ๋ก ์๋ณํ๊ธฐ ์ ์ ์ผ๋ถ ์ฒ๋ฆฌ๋ฅผ ์ํํ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฒด ์์ฒญ์ ๋ฐ๊ธฐ ์ ์ ์ ๋ณด ์๋ต์ด๋ 404 ์ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ ์ฌํ๊ฒ, ์ค๊ฐ์๋ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ธฐ ์ ์ ๋ถ์์ ํ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ์๋ฒ๋ ์์ฒญ์ ๋๋จธ์ง ๋ถ๋ถ์ด ์ ํํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ฒด ์์ฒญ์ ์์ ํ๊ธฐ ์ ์ ์ต์ข ์๋ต์ ์์ฑํ MAY ์์ต๋๋ค.
์ด๋ฌํ ์๊ตฌ์ฌํญ์ HTTP์ ๋ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ, ๊ด๋ํ๊ฒ ์ฒ๋ฆฌํ๋ฉด ์ทจ์ฝ์ ์ ๋ ธ์ถํ ์ ์์ผ๋ฏ๋ก ์๊ฒฉํ๊ฒ ๊ท์ ๋์ด ์์ต๋๋ค.
8.2. HTTP ํ๋
HTTP ํ๋(RFC 9110 ์น์ 5)๋ HEADERS, CONTINUATION, PUSH_PROMISE ํ๋ ์์์ HPACK(HPACK)์ผ๋ก ์์ถ๋์ด ์ ์ก๋ฉ๋๋ค.
ํ๋ ์ด๋ฆ์ HTTP/2 ๋ฉ์์ง๋ฅผ ๊ตฌ์ฑํ ๋ ์๋ฌธ์๋ก ๋ณํ๋์ด์ผ ํฉ๋๋ค(MUST).
8.2.1. ํ๋ ์ ํจ์ฑ
HPACK์ด ์ ๋ฌํ ์ ์๋ ๋ฌธ์๋ฅผ HTTP์ ํ๋ ์ด๋ฆ๊ณผ ๊ฐ ์ ์๊ฐ ๊ธ์งํ ์ ์์ต๋๋ค. HTTP/2 ๊ตฌํ์ฒด๋ RFC 9110์ ํด๋น ์น์ (5.1 ๋ฐ 5.5)์ ๋ฐ๋ผ ํ๋ ์ด๋ฆ๊ณผ ๊ฐ์ ๊ฒ์ฆํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ๊ธ์ง๋ ๋ฌธ์๊ฐ ํฌํจ๋ ๋ฉ์์ง๋ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
ํ๋๋ฅผ ๊ฒ์ฆํ์ง ์์ผ๋ฉด ์์ฒญ ์ค๋จธ๊ธ๋ง(request smuggling) ๊ณต๊ฒฉ์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ํนํ, ๊ฒ์ฆ๋์ง ์์ ํ๋๋ HTTP/1.1๋ก ์ ๋ฌ๋ ๋ ๊ตฌ๋ถ์(CR, LF, COLON ๋ฑ)๋ฅผ ์ ์ฉํ๋ ๊ณต๊ฒฉ์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค. ๊ตฌํ์ฒด๋ ์ต์ํ ๋ค์๊ณผ ๊ฐ์ ํ๋ ์ด๋ฆ ๋ฐ ๊ฐ์ ๋ํ ๊ฒ์ฆ์ ์ํํด์ผ ํฉ๋๋ค:
- ํ๋ ์ด๋ฆ์ 0x00-0x20, 0x41-0x5a, ๋๋ 0x7f-0xff ๋ฒ์์ ๋ฌธ์๋ฅผ ํฌํจํด์๋ MUST NOT ํฉ๋๋ค(๋ชจ๋ ๋ฒ์ ํฌํจ). ์ด๋ ๋ชจ๋ ๋น๊ฐ์ ASCII ๋ฌธ์, ASCII ๊ณต๋ฐฑ(SP, 0x20), ๋ฐ ๋๋ฌธ์('A'~'Z', 0x41~0x5a)๋ฅผ ์ ์ธํฉ๋๋ค.
- ์์ฌ-ํค๋ ํ๋(์น์ 8.3)๋ฅผ ์ ์ธํ๊ณ , ํ๋ ์ด๋ฆ์ ์ฝ๋ก (ASCII COLON, 0x3a)์ ํฌํจํด์๋ MUST NOT ํฉ๋๋ค.
- ํ๋ ๊ฐ์ ์ด๋ค ์์น์๋ ๋ ๋ฌธ์(ASCII NUL, 0x00), ๋ผ์ธ ํผ๋(ASCII LF, 0x0a), ๋๋ ์บ๋ฆฌ์ง ๋ฆฌํด(ASCII CR, 0x0d)์ ํฌํจํด์๋ MUST NOT ํฉ๋๋ค.
- ํ๋ ๊ฐ์ ASCII ๊ณต๋ฐฑ ๋ฌธ์(ASCII SP ๋๋ HTAB, 0x20 ๋๋ 0x09)๋ก ์์ํ๊ฑฐ๋ ๋๋์๋ MUST NOT ํฉ๋๋ค.
์ ์กฐ๊ฑด์ ์๋ฐํ๋ ํ๋๋ฅผ ํฌํจํ๋ ์์ฒญ ๋๋ ์๋ต์ ์๋ชป๋ ํ์์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1). ํนํ, ํ๋๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ์ค๊ฐ์๋ ์์์ ๊ธ์ง๋ ๊ฐ์ ํฌํจํ๋ ํ๋๋ฅผ ์ ๋ฌํด์๋ MUST NOT ํฉ๋๋ค.
์์ฒญ ๋ฉ์์ง๊ฐ ์ด๋ฌํ ์๊ตฌ์ฌํญ์ ์๋ฐํ ๊ฒฝ์ฐ ๊ตฌํ์ฒด๋ ์ ์ ํ ๊ฒฝ์ฐ 400(Bad Request) ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค(RFC 9110 ์น์ 15.5.1 ์ฐธ์กฐ), ๋จ ๋ ์ ์ ํ ์ํ ์ฝ๋๊ฐ ์ ์๋์ด ์๊ฑฐ๋ ์ํ ์ฝ๋๋ฅผ ๋ณด๋ผ ์ ์๋ ๊ฒฝ์ฐ(์: ์ค๋ฅ๊ฐ ํธ๋ ์ผ๋ฌ ํ๋์์ ๋ฐ์ํ ๊ฒฝ์ฐ)์๋ ์์ธ์ ๋๋ค.
8.2.2. ์ฐ๊ฒฐ-ํน์ ํค๋ ํ๋
HTTP/2๋ ์ฐ๊ฒฐ-ํน์ ํค๋ ํ๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด Connection ํค๋ ํ๋๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค(RFC 9110 ์น์ 7.6.1 ์ฐธ์กฐ). ์ด ํ๋กํ ์ฝ์์๋ ์ฐ๊ฒฐ-ํน์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์๋จ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ์๋ํฌ์ธํธ๋ ์ฐ๊ฒฐ-ํน์ ํค๋ ํ๋๋ฅผ ํฌํจํ๋ HTTP/2 ๋ฉ์์ง๋ฅผ ์์ฑํด์๋ MUST NOT ํฉ๋๋ค. ์ฌ๊ธฐ์๋ Connection ํค๋ ํ๋์ RFC 9110 ์น์ 7.6.1์ ๋์ด๋ ์ฐ๊ฒฐ-ํน์ ์๋ฏธ๋ฅผ ๊ฐ์ง ํ๋๋ค(์: Proxy-Connection, Keep-Alive, Transfer-Encoding, Upgrade)์ด ํฌํจ๋ฉ๋๋ค. ์ฐ๊ฒฐ-ํน์ ํค๋ ํ๋๋ฅผ ํฌํจํ๋ ๋ชจ๋ ๋ฉ์์ง๋ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
์์ธ๋ TE ํค๋ ํ๋๋ฟ์ด๋ฉฐ, ์ด๋ HTTP/2 ์์ฒญ์ ํฌํจ๋ ์ MAY ์๊ณ ํฌํจ๋๋ ๊ฒฝ์ฐ "trailers" ์ด์ธ์ ๊ฐ์ ํฌํจํด์๋ MUST NOT ํฉ๋๋ค.
HTTP/1.x ๋ฉ์์ง๋ฅผ HTTP/2๋ก ๋ณํํ๋ ์ค๊ฐ์๋ ์ฐ๊ฒฐ-ํน์ ํค๋ ํ๋๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค(RFC 9110 ์น์ 7.6.1 ์ฐธ์กฐ), ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น ๋ฉ์์ง๋ ๋ค๋ฅธ HTTP/2 ์๋ํฌ์ธํธ์์ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ ๋๋ค(์น์ 8.1.1).
8.2.3. Cookie ํค๋ ํ๋์ ์์ถ
Cookie header field๋ ์ธ๋ฏธ์ฝ๋ก (" ; ")์ผ๋ก ์ฟ ํค-ํ์ด(๋๋ "crumbs")๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ด ํค๋ ํ๋๋ ์ฌ๋ฌ ๊ฐ์ ํฌํจํ์ง๋ง COMMA(",")๋ฅผ ๊ตฌ๋ถ์๋ก ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ฟ ํค-ํ์ด๋ค์ด ์ฌ๋ฌ ํ๋ ๋ผ์ธ์ผ๋ก ๋ถํ ๋์ด ์ ์ก๋์ง ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ฐ๋ณ ์ฟ ํค-ํ์ด์ ์ ๋ฐ์ดํธ๊ฐ HPACK ํ ์ด๋ธ์ ์ ์ฅ๋ ํ๋ ๋ผ์ธ์ ๋ฌดํจํํ์ฌ ์์ถ ํจ์จ์ด ํฌ๊ฒ ๊ฐ์ํ ์ ์์ต๋๋ค.
์์ถ ํจ์จ์ ๊ฐ์ ํ๊ธฐ ์ํด Cookie ํค๋ ํ๋๋ 1๊ฐ ์ด์์ ์ฟ ํค-ํ์ด๋ฅผ ํฌํจํ๋ ๋ณ๋์ ํค๋ ํ๋๋ค๋ก ๋ถํ ๋ ์ ์์ต๋๋ค(MAY). ๋ง์ฝ ๋ณต์ ํ์ ์ฌ๋ฌ ๊ฐ์ Cookie ํค๋ ํ๋๊ฐ ์กด์ฌํ๋ฉด, ์ด๋ฅผ HTTP/1.1 ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ๋น-HTTP/2 ์ปจํ ์คํธ๋ก ์ ๋ฌํ๊ธฐ ์ ์ 0x3b, 0x20(ASCII ๋ฌธ์์ด "; ")์ ๋ ์ฅํ ๊ตฌ๋ถ์๋ก ๋จ์ผ ์ฅํ ๋ฌธ์์ด๋ก ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค(MUST).
๋ฐ๋ผ์ ๋ค์ ๋ ๊ฐ์ง Cookie ํค๋ ๋ชฉ๋ก์ ์๋ฏธ์ ๋๋ฑํฉ๋๋ค.
cookie: a=b; c=d; e=f cookie: a=b cookie: c=d cookie: e=f
8.3. ์์ฌ-ํค๋ ํ๋(HTTP ์ ์ด ๋ฐ์ดํฐ)
HTTP/2๋ ๋ฉ์์ง ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ':' ๋ฌธ์(ASCII 0x3a)๋ก ์์ํ๋ ํน์ํ ์์ฌ-ํค๋ ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค(์์ธํ ๋ด์ฉ์ RFC 9110 ์น์ 6.2 ์ฐธ์กฐ).
์์ฌ-ํค๋ ํ๋๋ HTTP ํค๋ ํ๋๊ฐ ์๋๋๋ค. ์๋ํฌ์ธํธ๋ ์ด ๋ฌธ์์ ์ ์๋ ๊ฒ ์ด์ธ์ ์์ฌ-ํค๋ ํ๋๋ฅผ ์์ฑํด์๋ MUST NOT ํฉ๋๋ค. ํ์ฅ์ด ์ถ๊ฐ ์์ฌ-ํค๋ ํ๋ ์ฌ์ฉ์ ํ์ํ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์(์น์ 5.5).
์์ฌ-ํค๋ ํ๋๋ ์ ์๋ ๋ฌธ๋งฅ์์๋ง ์ ํจํฉ๋๋ค. ์์ฒญ์ ๋ํด ์ ์๋ ์์ฌ-ํค๋๋ ์๋ต์ ๋ํ๋์๋ MUST NOT ํ๋ฉฐ, ์๋ต์ ๋ํด ์ ์๋ ์์ฌ-ํค๋๋ ์์ฒญ์ ๋ํ๋์๋ MUST NOT ํฉ๋๋ค. ์์ฌ-ํค๋๋ ํธ๋ ์ผ๋ฌ ์น์ ์ ๋ํ๋์๋ MUST NOT ํฉ๋๋ค. ์ ์๋์ง ์์๊ฑฐ๋ ์ ํจํ์ง ์์ ์์ฌ-ํค๋ ํ๋๋ฅผ ํฌํจํ๋ ์์ฒญ ๋๋ ์๋ต์ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
๋ชจ๋ ์์ฌ-ํค๋ ํ๋๋ ์ผ๋ฐ ํ๋ ๋ผ์ธ๋ณด๋ค ๋จผ์ ํ๋ ๋ธ๋ก์ ๋ํ๋์ผ ํฉ๋๋ค. ์ผ๋ฐ ํ๋ ๋ผ์ธ ์ดํ์ ์์ฌ-ํค๋๊ฐ ๋ํ๋๋ ์์ฒญ ๋๋ ์๋ต์ ์๋ชป๋ ํ์์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
๋์ผํ ์์ฌ-ํค๋ ํ๋ ์ด๋ฆ์ด ํ๋์ ํ๋ ๋ธ๋ก์ ๋ ๋ฒ ์ด์ ๋ํ๋์๋ MUST NOT ํฉ๋๋ค. ์์ฒญ ๋๋ ์๋ต์ ํ๋ ๋ธ๋ก์ ์ค๋ณต๋ ์์ฌ-ํค๋ ํ๋ ์ด๋ฆ์ด ํฌํจ๋๋ฉด ํด๋น ๋ฉ์์ง๋ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(์น์ 8.1.1).
8.3.1. ์์ฒญ ์์ฌ-ํค๋ ํ๋
HTTP/2 ์์ฒญ์ ๋ํด ๋ค์์ ์์ฌ-ํค๋ ํ๋๋ค์ด ์ ์๋์ด ์์ต๋๋ค:
-
":method" ์์ฌ-ํค๋ ํ๋๋ HTTP ๋ฉ์๋๋ฅผ ํฌํจํฉ๋๋ค(RFC 9110 ์น์ 9 ์ฐธ์กฐ).
-
":scheme" ์์ฌ-ํค๋ ํ๋๋ ์์ฒญ ๋์์ ์คํด ๋ถ๋ถ์ ํฌํจํฉ๋๋ค. ์คํด์ ์์ฒญ์ ์ง์ ์์ฑํ ๋ ๋์ URI์์ ๊ฐ์ ธ์ค๊ฑฐ๋(์: RFC 3986 ์น์ 3.1) ๋ณํ๋ ์์ฒญ์ ์คํด์์ ๊ฐ์ ธ์ต๋๋ค. CONNECT ์์ฒญ์ ๊ฒฝ์ฐ ":scheme"๋ ์๋ต๋ฉ๋๋ค(์น์ 8.5).
":scheme"์ "http" ๋ฐ "https"์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ํ๋ก์๋ ๊ฒ์ดํธ์จ์ด๋ ๋น-HTTP ์คํด์ ๋ํ ์์ฒญ์ ๋ณํํ ์ ์์ต๋๋ค.
-
":authority" ์์ฌ-ํค๋ ํ๋๋ ๋์ URI์ ๊ถํ(authority) ๋ถ๋ถ์ ์ ํฉ๋๋ค. HTTP/2 ์์ฒญ์ ์์ ์๋ ":authority"๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ Host ํค๋ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์ URI๋ฅผ ๊ฒฐ์ ํด์๋ MUST NOT ํฉ๋๋ค.
์ง์ HTTP/2 ์์ฒญ์ ์์ฑํ๋ ํด๋ผ์ด์ธํธ๋ ๊ถํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ":authority"๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ(๊ถํ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์์ฑํด์๋ ์ ๋ฉ๋๋ค).
ํด๋ผ์ด์ธํธ๋ ":authority"์ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง Host ํ๋๋ฅผ ์์ฑํด์๋ MUST NOT ํฉ๋๋ค. ์๋ฒ๋ ":authority"์ ๋ค๋ฅธ Host ํ๋๋ฅผ ํฌํจํ ์์ฒญ์ ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ๋น๊ต๋ฅผ ์ํด ๊ฐ๋ค์ ์ ๊ทํ๋์ด์ผ ํฉ๋๋ค(์ ๊ทํ ๋ฐฉ๋ฒ ์ฐธ์กฐ: RFC 3986 ์น์ 6.2).
HTTP/2๋ก ์์ฒญ์ ์ ๋ฌํ๋ ์ค๊ฐ์๋ ์๋ ์์ฒญ์ ์ ์ด ๋ฐ์ดํฐ์์ ๊ถํ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ":authority"๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ฉฐ(์๋ ์์ฒญ์ ๊ถํ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ":authority"๋ฅผ ์์ฑํด์๋ ์ ๋ฉ๋๋ค).
์ค๊ฐ์๊ฐ HTTP/1.1 ์์ฒญ์ ๊ตฌ์ฑํ๊ธฐ ์ํด Host ํค๋ ํ๋๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ค๊ฐ์๋ ":authority"์ ๊ฐ์ Host ํ๋ ๊ฐ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ฉฐ(์์ฒญ ๋์์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ) ๊ธฐ์กด Host ํ๋๋ฅผ ๋์ฒดํด์ผ ํฉ๋๋ค.
์ค๊ฐ์๋ HTTP/2๋ก ์์ฒญ์ ์ ๋ฌํ๋ฉด์ ๊ธฐ์กด Host ํค๋ ํ๋๋ฅผ ์ ์งํ ์๋ ์์ต๋๋ค(MAY).
CONNECT ๋๋ ๋ณํ(asterisk) ํํ์ OPTIONS ์์ฒญ์ ์์ฒญ ๋์์๋ ๊ถํ ์ ๋ณด๊ฐ ํฌํจ๋์ง ์์ต๋๋ค.
":authority"๋ "http" ๋๋ "https" ์คํด์ ๋ํด ๋ ์ด์ ๊ถ์ฅ๋์ง ์๋ userinfo ํ์ ๊ตฌ์ฑ์์๋ฅผ ํฌํจํด์๋ MUST NOT ํฉ๋๋ค.
-
":path" ์์ฌ-ํค๋ ํ๋๋ ๋์ URI์ ๊ฒฝ๋ก ๋ฐ ์ฟผ๋ฆฌ ๋ถ๋ถ์ ํฌํจํฉ๋๋ค(absolute-path ๋ฐ ์ ํ์ '?'์ query). asterisk ํํ์ OPTIONS ์์ฒญ์ ":path"์ '*' ๊ฐ์ ํฌํจํฉ๋๋ค.
์ด ์์ฌ-ํค๋๋ "http" ๋๋ "https" URI์ ๋ํด ๋น์ด ์์ด์๋ MUST NOT ํ๋ฉฐ, ๊ฒฝ๋ก ๊ตฌ์ฑ์์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ '/'๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ์์ธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฒฝ๋ก ๊ตฌ์ฑ์์๊ฐ ์๋ "http" ๋๋ "https" URI์ ๋ํ OPTIONS ์์ฒญ์ ":path"์ '*' ๊ฐ์ ํฌํจํด์ผ ํฉ๋๋ค.
- CONNECT ์์ฒญ์ ๊ฒฝ์ฐ ":path" ์์ฌ-ํค๋๋ ์๋ต๋์ด์ผ ํฉ๋๋ค.
๋ชจ๋ HTTP/2 ์์ฒญ์ ":method", ":scheme", ๋ฐ ":path" ์์ฌ-ํค๋ ํ๋๋ฅผ ์ ํํ ํ๋์ฉ ํฌํจํด์ผ ํฉ๋๋ค(๋จ CONNECT ์์ฒญ์ ์์ธ). ์ด๋ฌํ ํ๋๋ฅผ ์๋ตํ ์์ฒญ์ ์๋ชป๋ ํ์์ ๋๋ค(์น์ 8.1.1).
๊ฐ๋ณ HTTP/2 ์์ฒญ์ ๋ช ์์ ์ธ ํ๋กํ ์ฝ ๋ฒ์ ํ์๋ฅผ ํฌํจํ์ง ์์ต๋๋ค. ๋ชจ๋ HTTP/2 ์์ฒญ์ ์๋ฌต์ ์ผ๋ก ํ๋กํ ์ฝ ๋ฒ์ "2.0"์ ๊ฐ์ต๋๋ค.
8.3.2. ์๋ต ์์ฌ-ํค๋ ํ๋
HTTP/2 ์๋ต์ ๋ํด์๋ ํ๋์ ":status" ์์ฌ-ํค๋ ํ๋๊ฐ ์ ์๋์ด ์์ผ๋ฉฐ, ์ด๋ HTTP ์ํ ์ฝ๋ ํ๋๋ฅผ ๋ด์ต๋๋ค. ์ด ์์ฌ-ํค๋๋ ์ค๊ฐ ์๋ต์ ํฌํจํ ๋ชจ๋ ์๋ต์ ํฌํจ๋์ด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ต์ ์๋ชป๋ ํ์์ ๋๋ค(์น์ 8.1.1).
HTTP/2 ์๋ต์ ์๋ฌต์ ์ผ๋ก ํ๋กํ ์ฝ ๋ฒ์ "2.0"์ ๊ฐ์ง๋๋ค.
8.4. ์๋ฒ ํธ์
HTTP/2๋ ์๋ฒ๊ฐ ์ด์ ์ ํด๋ผ์ด์ธํธ-์์ ์์ฒญ๊ณผ ๊ด๋ จํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ํด ์๋ต(๋ฐ ํด๋น "์ฝ์๋" ์์ฒญ)์ ์ฌ์ ์ ์ก(๋๋ "ํธ์")ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.
์๋ฒ ํธ์๋ ์๋ฒ๊ฐ ์์ ํ ์์ฒญ ์ดํ์ ๋ฐ๋ผ์ฌ ์์ฒญ์ ์์ธกํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋๋ผ๋ ์ฑ๋ฅ์ ๊ฐ์ ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด HTML ์์ฒญ์ ์ข ์ข ํด๋น ํ์ด์ง์ ์ฐธ์กฐ๋ ์คํ์ผ์ํธ๋ ์คํฌ๋ฆฝํธ ์์ฒญ์ ๋๋ฐํฉ๋๋ค. ์ด๋ฌํ ์์ฒญ๋ค์ ํธ์ํ๋ฉด ํด๋ผ์ด์ธํธ๋ HTML์์ ์ฐธ์กฐ๋ฅผ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ด ๊ฐ๋ณ ์์ฒญ์ ๋ํ ์๋ณต ์๊ฐ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ค๋ฌด์์๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์บ์ฑ ์ํ, ์ฝํ ์ธ ํ์ ๋ฐ ์ฌ์ฉ์ ๋์๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ถ๊ฐ๋ก ์์ฒญํ ์ ํํ ํญ๋ชฉ์ ์์ธกํด์ผ ํ๋ฏ๋ก ์๋ฒ ํธ์๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์์ธก ์คํจ๋ ์ถ๊ฐ ๋ฐ์ดํฐ ์ ์ก์ผ๋ก ์ธํ ๊ธฐํ๋น์ฉ ๋๋ฌธ์ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ํนํ ์๋นํ ์์ ๋ฐ์ดํฐ๋ฅผ ํธ์ํ๋ฉด ๋ ์ค์ํ ์๋ต๋ค๊ณผ ์์ ๊ฒฝ์์ ์ด๋ํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์๋ฒ ํธ์๋ฅผ ๋นํ์ฑํํ๋๋ก ์์ฒญํ ์ ์์ผ๋ฉฐ, ์ด๋ ํ(hop)๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ํ์๋ฉ๋๋ค. SETTINGS_ENABLE_PUSH ์ค์ ์ 0์ผ๋ก ์ค์ ํ๋ฉด ์๋ฒ ํธ์๊ฐ ๋นํ์ฑํ๋์์์ ๋ํ๋ ๋๋ค.
์ฝ์๋ ์์ฒญ์ ์์ (safe)ํ๊ณ ์บ์ ๊ฐ๋ฅ(cacheable)ํด์ผ ํฉ๋๋ค(๊ด๋ จ RFC ์น์ ์ฐธ์กฐ). ์ฝ์๋ ์์ฒญ์ ๋ณธ๋ฌธ์ด๋ ํธ๋ ์ผ๋ฌ ์น์ ์ ํฌํจํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์บ์ ๊ฐ๋ฅํ์ง ์๊ฑฐ๋ ์์ ํ์ง ์๊ฑฐ๋ ์์ฒญ ๋ณธ๋ฌธ์ด ์์์ ๋ํ๋ด๋ ์ฝ์๋ ์์ฒญ์ ์์ ํ๋ฉด ํด๋น ์ฝ์๋ ์คํธ๋ฆผ์ ์น์ 5.4.2์ ๋ฐ๋ผ RST_STREAM์ผ๋ก ์ฌ์ค์ ํ๊ณ ์ค๋ฅ ์ ํ์ผ๋ก PROTOCOL_ERROR๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์บ์ ๊ฐ๋ฅํ ํธ์๋ ์๋ต์ ํด๋ผ์ด์ธํธ๊ฐ HTTP ์บ์๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ ์ ์ฅ๋ ์ ์์ต๋๋ค. ํธ์๋ ์๋ต์ ์ฝ์๋ ์คํธ๋ฆผ ์๋ณ์์ ์ํด ์๋ณ๋๋ ์คํธ๋ฆผ์ด ์์ง ์ด๋ ค ์๋ ๋์ ์๋ณธ ์๋ฒ์์ ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ฆ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
์บ์ํ ์ ์๋ ํธ์๋ ์๋ต์ ์ด๋ค HTTP ์บ์์๋ ์ ์ฅ๋์ด์๋ MUST NOT ํฉ๋๋ค. ๋ค๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณ๋๋ก ์ ๊ณต๋ MAY ์์ต๋๋ค.
์๋ฒ๋ ":authority" ์์ฌ-ํค๋ ํ๋์ ์๋ฒ๊ฐ ๊ถํ์ ๊ฐ์ง ๊ฐ์ ํฌํจํด์ผ ํฉ๋๋ค(์น์ 10.1 ์ฐธ์กฐ). ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ๊ถํ์ด ์๋ ๋์์ ๋ํด PUSH_PROMISE๋ฅผ ๋ณด๋ธ ๊ฒฝ์ฐ ์ด๋ฅผ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค(์น์ 5.4.2), ์ค๋ฅ ์ ํ์ PROTOCOL_ERROR์ ๋๋ค.
์ค๊ฐ์๋ ์๋ฒ๋ก๋ถํฐ ํธ์๋ฅผ ์์ ํ๊ณ ์ด๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ์ง ์๊ธฐ๋ก ์ ํํ ์ ์์ต๋๋ค. ์ฆ, ํธ์๋ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ ์ง๋ ์ค๊ฐ์์ ์ ํ์ฌํญ์ ๋๋ค. ๋ํ ์ค๊ฐ์๋ ์๋ฒ์ ์ถ๊ฐ ๋์ ์์ด ํด๋ผ์ด์ธํธ์ ์ถ๊ฐ ํธ์๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๋ ํธ์๋ฅผ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฒ๋ PUSH_PROMISE ํ๋ ์์ ์์ ํ๋ ๊ฒ์ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)๋ก ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ค๋ฅ ์ ํ์ PROTOCOL_ERROR์ ๋๋ค. ๋ํ ์๋ฒ๋ SETTINGS_ENABLE_PUSH ์ค์ ์ 0 ์ด์ธ์ ๊ฐ์ผ๋ก ์ค์ ํด์๋ ์ ๋ฉ๋๋ค.
8.4.1. ํธ์ ์์ฒญ
์๋ฒ ํธ์๋ ์๋ฏธ์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ตํ๋ ๊ฒ๊ณผ ๋๋ฑํ์ง๋ง, ์ด ๊ฒฝ์ฐ ๊ทธ ์์ฒญ์ด ์๋ฒ์ ์ํด PUSH_PROMISE ํ๋ ์์ผ๋ก ์ ์ก๋๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
PUSH_PROMISE ํ๋ ์์ ์๋ฒ๊ฐ ํด๋น ์์ฒญ์ ๊ท์์ํค๋ ์ ์ด ๋ฐ์ดํฐ์ ์์ ํ ์์ฒญ ํค๋ ํ๋ ์งํฉ์ ํฌํจํ๋ ํ๋ ๋ธ๋ก์ ํฌํจํฉ๋๋ค. ๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ๋ ์์ฒญ์ผ๋ก๋ ์๋ต์ ํธ์ํ ์ ์์ต๋๋ค.
์ฝ์๋ ์์ฒญ์ ํญ์ ํด๋ผ์ด์ธํธ์ ๋ช ์์ ์์ฒญ๊ณผ ์ฐ๊ด๋ฉ๋๋ค. ์๋ฒ๊ฐ ์ ์กํ๋ PUSH_PROMISE ํ๋ ์๋ค์ ํด๋น ๋ช ์์ ์์ฒญ์ ์คํธ๋ฆผ์์ ์ ์ก๋ฉ๋๋ค. ๋ํ ์ฝ์๋ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ํฌํจํ๋ฉฐ, ์ด๋ ์๋ฒ๊ฐ ์ฌ์ฉํ ์ ์๋ ์คํธ๋ฆผ ์๋ณ์ ์ค์์ ์ ํ๋ฉ๋๋ค(์น์ 5.1.1 ์ฐธ์กฐ).
PUSH_PROMISE ๋ฐ ์ดํ์ CONTINUATION ํ๋ ์์ ํค๋ ํ๋๋ค์ ์์ ํ๊ณ ์ ํจํ ์์ฒญ ํค๋ ํ๋ ์งํฉ์ด์ด์ผ ํฉ๋๋ค(์น์ 8.3.1). ์๋ฒ๋ ":method" ์์ฌ-ํค๋์ ์์ ํ๊ณ ์บ์ ๊ฐ๋ฅํ ๋ฉ์๋๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ํจํ ํค๋ ์งํฉ์ ํฌํจํ์ง ์๊ฑฐ๋ ์์ ํ์ง ์์ ๋ฉ์๋๋ฅผ ์๋ณํ๋ PUSH_PROMISE๋ฅผ ์์ ํ๋ฉด, ํด๋น ์ฝ์๋ ์คํธ๋ฆผ์์ ์น์ 5.4.2์ ๋ฐ๋ผ RST_STREAM์ PROTOCOL_ERROR๋ก ์ ์กํด์ผ ํฉ๋๋ค.
์๋ฒ๋ ์ฝ์๋ ์๋ต์ ์ฐธ์กฐํ๋ ์ด๋ค ํ๋ ์์ ๋ณด๋ด๊ธฐ ์ ์ ๊ฐ๋ฅํ๋ฉด PUSH_PROMISE ํ๋ ์์ ๋จผ์ ๋ณด๋ด๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ PUSH_PROMISE ํ๋ ์์ ๋ฐ๊ธฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๊ฒฝํฉ์ ํผํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ๊ฐ ์ฌ๋ฌ ์ด๋ฏธ์ง ํ์ผ์ ๋ํ ๋งํฌ๋ฅผ ํฌํจํ๋ ๋ฌธ์ ์์ฒญ์ ๋ฐ์๊ณ ํด๋น ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๊ธฐ๋ก ์ ํํ ๊ฒฝ์ฐ, ์ด๋ฏธ์ง ๋งํฌ๋ฅผ ํฌํจํ๋ DATA ํ๋ ์์ ๋ณด๋ด๊ธฐ ์ ์ PUSH_PROMISE๋ฅผ ๋ณด๋ด๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฆฌ์์ค๊ฐ ํธ์๋ ๊ฒ์์ ๋ฐ๊ฒฌํ๊ธฐ ์ ์ ํด๋น ๋ฆฌ์์ค๋ฅผ ์์ฒญํ์ง ์๊ฒ ๋ฉ๋๋ค.
PUSH_PROMISE ํ๋ ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํด์๋ MUST NOT ํฉ๋๋ค.
PUSH_PROMISE ํ๋ ์์ ์๋ฒ๊ฐ ์ด๋ค ํด๋ผ์ด์ธํธ-์์ ์คํธ๋ฆผ์์๋ ๋ณด๋ผ ์ ์์ง๋ง, ํด๋น ์คํธ๋ฆผ์ ์๋ฒ ๊ด์ ์์ "open" ๋๋ "half-closed (remote)" ์ํ์ฌ์ผ ํฉ๋๋ค. ๋ํ PUSH_PROMISE๋ ํ๋์ ํ๋ ๋ธ๋ก์ ๊ตฌ์ฑํ๋ HEADERS ๋ฐ CONTINUATION ํ๋ ์ ์ฌ์ด์ ๋ผ์ด๋ค ์ ์์ต๋๋ค.
PUSH_PROMISE๋ฅผ ์ ์กํ๋ฉด ์๋ก์ด ์คํธ๋ฆผ์ด ์์ฑ๋๊ณ ์๋ฒ์๊ฒ๋ "reserved (local)", ํด๋ผ์ด์ธํธ์๊ฒ๋ "reserved (remote)" ์ํ๋ก ์ค์ ๋ฉ๋๋ค.
8.4.2. ํธ์ ์๋ต
PUSH_PROMISE ํ๋ ์์ ๋ณด๋ธ ํ, ์๋ฒ๋ ์ฝ์๋ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์๋ฒ-์์ ์คํธ๋ฆผ์์ ํธ์๋ ์๋ต์ ์ ์กํ๊ธฐ ์์ํ ์ ์์ต๋๋ค. ์๋ฒ๋ ์ด ์คํธ๋ฆผ์์ ์น์ 8.1์ ์ ์๋ ๊ฒ๊ณผ ๋์ผํ ์์์ ํ๋ ์์ ์ฌ์ฉํ์ฌ HTTP ์๋ต์ ์ ์กํฉ๋๋ค. ์ด ์คํธ๋ฆผ์ ์ด๊ธฐ HEADERS ํ๋ ์์ด ์ ์ก๋ ํ ํด๋ผ์ด์ธํธ์ ๋ํด "half-closed (local)" ์ํ๊ฐ ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ PUSH_PROMISE๋ฅผ ์์ ํ๊ณ ํธ์ ์๋ต์ ์๋ฝํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด, ์ฝ์๋ ์คํธ๋ฆผ์ด ๋ซํ ๋๊น์ง ํด๋น ์๋ต์ ๋ํ ์์ฒญ์ ๋ฐํํด์๋ SHOULD NOT ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์ด์ ๋ก ํธ์๋ ์๋ต์ ์ํ์ง ์๊ฑฐ๋ ์๋ฒ๊ฐ ์ฝ์๋ ์๋ต์ ๋ณด๋ด๊ธฐ ์์ํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ๋ RST_STREAM ํ๋ ์์ ๋ณด๋ด ํธ์๋ ์คํธ๋ฆผ์ ์ทจ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ CANCEL ๋๋ REFUSED_STREAM ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๋ SETTINGS_MAX_CONCURRENT_STREAMS ์ค์ ์ ์ฌ์ฉํ์ฌ ์๋ฒ๊ฐ ๋์์ ํธ์ํ ์ ์๋ ์๋ต ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ๊ฐ์ด 0์ด๋ฉด ์๋ฒ๊ฐ ์๋ต์ ํธ์ํ๋ ๋ฐ ํ์ํ ์คํธ๋ฆผ์ ์ด ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฝ๋ ์คํธ๋ฆผ์ ๋์ ์คํธ๋ฆผ ํ๋์ ํฌํจ๋์ง ์์ผ๋ฏ๋ก PUSH_PROMISE๋ก ์คํธ๋ฆผ์ ์์ฝํ๋ ๊ฒ์ ๋ฐฉ์งํ์ง๋ ๋ชปํฉ๋๋ค. ํธ์๋ ๋ฆฌ์์ค๋ฅผ ์ํ์ง ์๋ ํด๋ผ์ด์ธํธ๋ ์ํ์ง ์๋ ์์ฝ๋ ์คํธ๋ฆผ์ ๋ฆฌ์ ํ๊ฑฐ๋ SETTINGS_ENABLE_PUSH๋ฅผ 0์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
ํธ์๋ ์๋ต์ ๋ฐ๋ ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ๊ถํ์ด ์๋์ง(์น์ 10.1 ์ฐธ์กฐ) ๋๋ ํธ์๋ ์๋ต์ ์ ๊ณตํ ํ๋ก์๊ฐ ํด๋น ์์ฒญ์ ๋ํด ๊ตฌ์ฑ๋์ด ์๋์ง ๊ฒ์ฆํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์ธ์ฆ์๊ฐ example.com์๋ง ์ ํจํ ๊ฒฝ์ฐ์๋ https://www.example.org/doc์ ๋ํ ์๋ต์ ํธ์ํ ์ ์์ต๋๋ค.
PUSH_PROMISE ์คํธ๋ฆผ์ ๋ํ ์๋ต์ HEADERS ํ๋ ์์ผ๋ก ์์ํ์ฌ(์ด๋ก์จ ์๋ฒ ์ธก์์ ์คํธ๋ฆผ์ด "half-closed (remote)"๊ฐ ๋๊ณ ํด๋ผ์ด์ธํธ ์ธก์ "half-closed (local)"๊ฐ ๋จ) END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋ ์์ผ๋ก ๋๋๋ฉด ์คํธ๋ฆผ์ "closed" ์ํ๊ฐ ๋ฉ๋๋ค.
8.5. CONNECT ๋ฉ์๋
CONNECT ๋ฉ์๋(RFC 9110 ์น์ 9.3.6 ์ฐธ์กฐ)๋ HTTP ์ฐ๊ฒฐ์ ์๊ฒฉ ํธ์คํธ๋ก์ ํฐ๋๋ก ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. CONNECT๋ ์ฃผ๋ก ํ๋ก์์ ํจ๊ป ์ฌ์ฉ๋์ด ์๋ณธ ์๋ฒ์ TLS ์ธ์ ์ ์ค์ ํ๊ณ "https" ๋ฆฌ์์ค์ ์ํธ์์ฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
HTTP/2์์๋ CONNECT ๋ฉ์๋๊ฐ ์ ์ฒด ์ฐ๊ฒฐ์ ํฐ๋๋ก ์ ํํ๋ ๋์ ๋จ์ผ HTTP/2 ์คํธ๋ฆผ์ ํตํด ์๊ฒฉ ํธ์คํธ๋ก์ ํฐ๋์ ์ค์ ํฉ๋๋ค. CONNECT ํค๋ ์น์ ์ ์น์ 8.3.1์ ์ ์๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋๋ ๋ช ๊ฐ์ง ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก:
- ":method" ์์ฌ-ํค๋ ํ๋๋ CONNECT๋ก ์ค์ ๋ฉ๋๋ค.
- ":scheme" ๋ฐ ":path" ์์ฌ-ํค๋ ํ๋๋ MUST ์๋ต๋์ด์ผ ํฉ๋๋ค.
- ":authority" ์์ฌ-ํค๋ ํ๋๋ ์ฐ๊ฒฐํ ํธ์คํธ์ ํฌํธ๋ฅผ ํฌํจํฉ๋๋ค(์ด๋ CONNECT ์์ฒญ์ authority-form๊ณผ ๋๋ฑํฉ๋๋ค).
์ด ์ ํ์ ์ค์ํ์ง ์๋ CONNECT ์์ฒญ์ ์๋ชป๋ ํ์์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค(์น์ 8.1.1).
CONNECT๋ฅผ ์ง์ํ๋ ํ๋ก์๋ ":authority" ์์ฌ-ํค๋ ํ๋์ ์ง์ ๋ ํธ์คํธ์ ํฌํธ์ ๋ํด TCP ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค. ์ฐ๊ฒฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ค์ ๋๋ฉด ํ๋ก์๋ ํด๋ผ์ด์ธํธ์ 2xx ๊ณ์ด ์ํ ์ฝ๋๋ฅผ ํฌํจํ๋ HEADERS ํ๋ ์์ ๋ณด๋ ๋๋ค.
๊ฐ ํผ์ด๊ฐ ๋ณด๋ธ ์ด๊ธฐ HEADERS ํ๋ ์ ์ดํ์ ๋ชจ๋ ํ์ DATA ํ๋ ์์ TCP ์ฐ๊ฒฐ์์ ์ ์ก๋๋ ๋ฐ์ดํฐ์ ํด๋นํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ DATA ํ๋ ์์ ํ์ด๋ก๋๋ ํ๋ก์๊ฐ TCP ์๋ฒ๋ก ์ ์กํ๊ณ , TCP ์๋ฒ๋ก๋ถํฐ ์์ ๋ ๋ฐ์ดํฐ๋ ํ๋ก์๊ฐ DATA ํ๋ ์์ผ๋ก ์กฐ๋ฆฝํ์ฌ ์ ์กํฉ๋๋ค. ์ฐ๊ฒฐ๋ ์คํธ๋ฆผ์์ DATA ์ด์ธ์ ํ๋ ์ ์ ํ์ด๋ ์คํธ๋ฆผ ๊ด๋ฆฌ ํ๋ ์(RST_STREAM, WINDOW_UPDATE, PRIORITY) ์ด์ธ์ ํ๋ ์์ ์ ์กํด์๋ ์ ๋๋ฉฐ ์์ ์ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
TCP ์ฐ๊ฒฐ์ ์ด๋ ์ชฝ ํผ์ด์ ์ํด๋ ๋ซํ ์ ์์ต๋๋ค. DATA ํ๋ ์์ END_STREAM ํ๋๊ทธ๋ TCP FIN ๋นํธ์ ๋๋ฑํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ DATA ํ๋ ์์ ์์ ํ ํ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ DATA ํ๋ ์์ ์ ์กํ ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค. ํ๋ก์๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ DATA ํ๋ ์์ ๋ฐ์ผ๋ฉด ๋ง์ง๋ง TCP ์ธ๊ทธ๋จผํธ์ FIN ๋นํธ๋ฅผ ์ค์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , FIN ๋นํธ๋ฅผ ๊ฐ์ง TCP ์ธ๊ทธ๋จผํธ๋ฅผ ์์ ํ๋ฉด END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ DATA ํ๋ ์์ ์ ์กํฉ๋๋ค. ๋ง์ง๋ง TCP ์ธ๊ทธ๋จผํธ๋ DATA ํ๋ ์์ ๋น์ด์์ ์๋ ์์ต๋๋ค.
TCP ์ฐ๊ฒฐ ์ค๋ฅ๋ RST_STREAM์ผ๋ก ์ ํธ๋ฉ๋๋ค. ํ๋ก์๋ TCP ์ฐ๊ฒฐ์์์ ๋ชจ๋ ์ค๋ฅ(์: RST ๋นํธ๊ฐ ์ค์ ๋ TCP ์ธ๊ทธ๋จผํธ ์์ )๋ฅผ ์น์ 5.4.2์ ๋ฐ๋ผ CONNECT_ERROR ์ ํ์ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ๋ฐ๋๋ก ์คํธ๋ฆผ ๋๋ HTTP/2 ์ฐ๊ฒฐ์์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๋ฉด TCP RST ๋นํธ๋ฅผ ์ค์ ํ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ณด๋ด์ผ ํฉ๋๋ค.
8.6. ์ ๋ณด ์ํ ์๋ต(Upgrade ํค๋ ํ๋)
HTTP/2๋ 101 (Switching Protocols) ์ ๋ณด ์ํ ์ฝ๋๋ฅผ ์ง์ํ์ง ์์ต๋๋ค(RFC 9110 ์น์ 15.2.2 ์ฐธ์กฐ).
101์ ์๋ฏธ๋ ๋ค์คํ๋ ํ๋กํ ์ฝ์๋ ์ ์ฉ๋์ง ์์ต๋๋ค. ์ ์ฌํ ๊ธฐ๋ฅ์ ํ์ฅ๋ CONNECT(RFC8441)๋ฅผ ํตํด ์ ๊ณต๋ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ํ๋กํ ์ฝ๋ค๋ HTTP/2๊ฐ ์ฌ์ฉํ๋ ๋์ผํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ ํ์์ ํ ์ ์์ต๋๋ค(์์ ๋ฐฉ๋ฒ์ ์น์ 3 ์ฐธ์กฐ).
8.7. ์์ฒญ ์ ๋ขฐ์ฑ
์ผ๋ฐ์ ์ผ๋ก, HTTP ํด๋ผ์ด์ธํธ๋ ์ค๋ฅ ๋ฐ์ ์ ๋น๋ฉฑ๋ฑ(non-idempotent) ์์ฒญ์ ์ฌ์๋ํ ์ ์์ต๋๋ค. ์ด๋ ์ค๋ฅ์ ์ฑ๊ฒฉ์ ๊ฒฐ์ ํ ์ ์๋ ์๋จ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค๋ฅ ์ด์ ์ ์ผ๋ถ ์๋ฒ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ก์ ์ ์์ผ๋ฏ๋ก ์ฌ์๋ ์ ์์น ์๋ ๋ถ์์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
HTTP/2๋ ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ด ์ฒ๋ฆฌ๋์ง ์์์์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค:
- GOAWAY ํ๋ ์์ ์ฒ๋ฆฌ๋์์ ์ ์๋ ์ต๋ ์คํธ๋ฆผ ๋ฒํธ๋ฅผ ๋ํ๋ ๋๋ค. ๋ฐ๋ผ์ ๋ ๋์ ๋ฒํธ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ์์ ํ๊ฒ ์ฌ์๋ํ ์ ์์ต๋๋ค.
- REFUSED_STREAM ์ค๋ฅ ์ฝ๋๋ RST_STREAM ํ๋ ์์ ํฌํจ๋์ด ์คํธ๋ฆผ์ด ์ด๋ค ์ฒ๋ฆฌ๋ ์ด๋ฃจ์ด์ง๊ธฐ ์ ์ ๋ซํ์์ ๋ํ๋ผ ์ ์์ต๋๋ค. ๋ฆฌ์ ๋ ์คํธ๋ฆผ์์ ์ ์ก๋ ์์ฒญ์ ์์ ํ๊ฒ ์ฌ์๋ํ ์ ์์ต๋๋ค.
์ฒ๋ฆฌ๋์ง ์์ ์์ฒญ์ ์คํจํ ๊ฒ์ด ์๋๋ฏ๋ก, ํด๋ผ์ด์ธํธ๋ ์ด๋ฌํ ์์ฒญ์ ์๋์ผ๋ก ์ฌ์๋ํ MAY ์์ต๋๋ค(๋น๋ฉฑ๋ฑ ๋ฉ์๋๋ ํฌํจ).
์๋ฒ๋ ์คํธ๋ฆผ์ด ์ฒ๋ฆฌ๋์ง ์์์์ ๋ณด์ฅํ ์ ์๋ ๊ฒฝ์ฐ ํด๋น ์คํธ๋ฆผ์ ๋ํด ๊ทธ๋ฌํ ํ์๋ฅผ ํด์๋ MUST NOT ํฉ๋๋ค. ๋ง์ฝ ์ด๋ค ์คํธ๋ฆผ์ ๋ํด ํ๋ ์๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ ์ด์ด๋ก ์ ๋ฌ๋์๋ค๋ฉด, ๊ทธ ์คํธ๋ฆผ์ ๋ํด REFUSED_STREAM์ ์ฌ์ฉํด์๋ ์ ๋๋ฉฐ, ๋์ GOAWAY ํ๋ ์์ ํด๋น ์คํธ๋ฆผ ์๋ณ์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ํฌํจํด์ผ ํฉ๋๋ค.
์ด ๋ฉ์ปค๋์ฆ๋ค ์ธ์๋ PING ํ๋ ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ์ฝ๊ฒ ํ ์คํธํ ์ ์๊ฒ ํฉ๋๋ค. ์ ํด ์ํ์ ์ฐ๊ฒฐ์ ์ผ๋ถ ์ค๊ฐ ์ฅ์น(์: NAT ๋๋ ๋ก๋ ๋ฐธ๋ฐ์)๊ฐ ์ฐ๊ฒฐ ๋ฐ์ธ๋ฉ์ ์กฐ์ฉํ ์ ๊ฑฐํ ์ ์์ด ๋์ด์ง ์ ์์ต๋๋ค. PING ํ๋ ์์ ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ ์ฐ๊ฒฐ์ด ์ฌ์ ํ ํ์ฑ ์ํ์ธ์ง ์์ ํ๊ฒ ๊ฒ์ฌํ ์ ์๊ฒ ํด์ค๋๋ค.
8.8. ์์
์ด ์ ์์๋ ๋๋ฑํ HTTP/2 ์์ฒญ ๋ฐ ์๋ต์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด HTTP/1.1 ์์ฒญ๊ณผ ์๋ต์ ์์๋ก ์ ์ํฉ๋๋ค.
8.8.1. ๋จ์ ์์ฒญ
HTTP GET ์์ฒญ์ ์ ์ด ๋ฐ์ดํฐ์ ๋ฉ์์ง ๋ณธ๋ฌธ์ด ์๋ ์์ฒญ ํค๋๋ฅผ ํฌํจํ๋ฏ๋ก ๋จ์ผ HEADERS ํ๋ ์์ผ๋ก ์ ์ก๋๋ฉฐ, ์ง๋ ฌํ๋ ์์ฒญ ํค๋ ๋ธ๋ก์ ํฌํจํ๋ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์์ด ๋ค๋ฐ๋ฅผ ์ ์์ต๋๋ค. ์๋์ HEADERS ํ๋ ์์ END_HEADERS ๋ฐ END_STREAM ํ๋๊ทธ๊ฐ ๋ชจ๋ ์ค์ ๋์ด ์์ผ๋ฏ๋ก CONTINUATION ํ๋ ์์ ์ ์ก๋์ง ์์ต๋๋ค.
GET /resource HTTP/1.1 HEADERS
Host: example.org ==> + END_STREAM
Accept: image/jpeg + END_HEADERS
:method = GET
:scheme = https
:authority = example.org
:path = /resource
host = example.org
accept = image/jpeg
8.8.2. ๋จ์ ์๋ต
๋์ผํ๊ฒ, ์ ์ด ๋ฐ์ดํฐ์ ์๋ต ํค๋๋ง ํฌํจํ๋ ์๋ต์ ์ง๋ ฌํ๋ ์๋ต ํค๋ ๋ธ๋ก์ ํฌํจํ๋ HEADERS ํ๋ ์(๋ค์ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์ ๊ฐ๋ฅ)์ผ๋ก ์ ์ก๋ฉ๋๋ค.
HTTP/1.1 304 Not Modified HEADERS
ETag: "xyzzy" ==> + END_STREAM
Expires: Thu, 23 Jan ... + END_HEADERS
:status = 304
etag = "xyzzy"
expires = Thu, 23 Jan ...
8.8.3. ๋ณตํฉ ์์ฒญ
๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ๋ HTTP POST ์์ฒญ์ ํ๋์ HEADERS ํ๋ ์, ๊ทธ ๋ค๋ฅผ ๋ฐ๋ฅด๋ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์(์์ฒญ ํค๋), ๊ทธ๋ฆฌ๊ณ ํ๋ ์ด์์ DATA ํ๋ ์์ผ๋ก ์ ์ก๋ฉ๋๋ค. ๋ง์ง๋ง CONTINUATION(๋๋ HEADERS) ํ๋ ์์๋ END_HEADERS ํ๋๊ทธ๊ฐ ์ค์ ๋๊ณ ๋ง์ง๋ง DATA ํ๋ ์์๋ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ฉ๋๋ค.
POST /resource HTTP/1.1 HEADERS
Host: example.org ==> - END_STREAM
Content-Type: image/jpeg - END_HEADERS
Content-Length: 123 :method = POST
:authority = example.org
:path = /resource
{binary data} :scheme = https
CONTINUATION
+ END_HEADERS
content-type = image/jpeg
host = example.org
content-length = 123
DATA
+ END_STREAM
{binary data}
์ด๋ค ํ๋ ๋ผ์ธ์ ๊ธฐ์ฌํ๋ ๋ฐ์ดํฐ๋ ํ๋ ๋ธ๋ก ์กฐ๊ฐ๋ค ์ฌ์ด์ ๋ถ์ฐ๋ ์ ์์ต๋๋ค. ์ด ์์์ ํ๋ ๋ผ์ธ์ ํ๋ ์์ ํ ๋นํ ๋ฐฉ์์ ๋จ์ง ์์์ ๋๋ค.
8.8.4. ๋ณธ๋ฌธ์ ํฌํจํ ์๋ต
๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ๋ ์๋ต์ HEADERS ํ๋ ์(๋ฐ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์)์ผ๋ก ์์ํ๊ณ , ํ๋ ์ด์์ DATA ํ๋ ์์ด ๋ค๋ฐ๋ฅด๋ฉฐ, ์ํ์ค์ ๋ง์ง๋ง DATA ํ๋ ์์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋ฉ๋๋ค.
HTTP/1.1 200 OK HEADERS
Content-Type: image/jpeg ==> - END_STREAM
Content-Length: 123 + END_HEADERS
:status = 200
{binary data} content-type = image/jpeg
content-length = 123
DATA
+ END_STREAM
{binary data}
8.8.5. ์ ๋ณด ์๋ต
101์ ์ ์ธํ 1xx ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ์ ๋ณด ์๋ต์ HEADERS ํ๋ ์์ผ๋ก ์ ์ก๋๋ฉฐ ๋ค์ 0๊ฐ ์ด์์ CONTINUATION ํ๋ ์์ด ์ฌ ์ ์์ต๋๋ค.
ํธ๋ ์ผ๋ฌ ์น์ ์ ์์ฒญ ๋๋ ์๋ต ํ๋ ๋ธ๋ก๊ณผ ๋ชจ๋ DATA ํ๋ ์์ด ์ ์ก๋ ํ์ ํ๋ ๋ธ๋ก์ผ๋ก ์ ์ก๋ฉ๋๋ค. ํธ๋ ์ผ๋ฌ ์น์ ์ ์์ํ๋ HEADERS ํ๋ ์์ END_STREAM ํ๋๊ทธ๊ฐ ์ค์ ๋์ด์ผ ํฉ๋๋ค.
๋ค์ ์์๋ Expect ํค๋ ํ๋์ "100-continue" ํ ํฐ์ด ํฌํจ๋ ์์ฒญ์ ๋ํ 100 (Continue) ์ํ ์ฝ๋์ ํธ๋ ์ผ๋ฌ ์น์ ์ ๋ชจ๋ ํฌํจํฉ๋๋ค:
HTTP/1.1 100 Continue HEADERS
Extension-Field: bar ==> - END_STREAM
+ END_HEADERS
:status = 100
extension-field = bar
HTTP/1.1 200 OK HEADERS
Content-Type: image/jpeg ==> - END_STREAM
Transfer-Encoding: chunked + END_HEADERS
Trailer: Foo :status = 200
content-type = image/jpeg
123 trailer = Foo
{binary data}
0 DATA
Foo: bar - END_STREAM
{binary data}
HEADERS
+ END_STREAM
+ END_HEADERS
foo = bar
9. HTTP/2 ์ฐ๊ฒฐ
์ด ์น์ ์ ์ํธ์ด์ฉ์ฑ์ ํฅ์์ํค๊ณ , ์๋ ค์ง ๋ณด์ ์ทจ์ฝ์ ์ ๋ํ ๋ ธ์ถ์ ์ค์ด๋ฉฐ, ๊ตฌํ ์ฐจ์ด๋ฅผ ์ค์ด๊ธฐ ์ํ HTTP์ ํน์ฑ๋ค์ ๊ฐ๊ดํฉ๋๋ค.
9.1. ์ฐ๊ฒฐ ๊ด๋ฆฌ
HTTP/2 ์ฐ๊ฒฐ์ ์ง์์ ์ ๋๋ค. ์ต์ ์ ์ฑ๋ฅ์ ์ํด ํด๋ผ์ด์ธํธ๋ ์๋ฒ์์ ์ถ๊ฐ ํต์ ์ด ๋ถํ์ํ๋ค๊ณ ํ๋จ๋๊ฑฐ๋(์: ์ฌ์ฉ์๊ฐ ํน์ ์น ํ์ด์ง์์ ์ด๋ํ ๊ฒฝ์ฐ) ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ ๋ซ์ ๋๊น์ง ์ฐ๊ฒฐ์ ๋ซ์ง ์๋ ๊ฒ์ด ๊ธฐ๋๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ URI๋ก๋ถํฐ ํ์๋ ํธ์คํธ, ์ ํ๋ alternative service ๋๋ ๊ตฌ์ฑ๋ ํ๋ก์์ ๋ํด ์ฃผ์ด์ง ํธ์คํธ-ํฌํธ ์์ผ๋ก ํ๋ ์ด์์ HTTP/2 ์ฐ๊ฒฐ์ ์ด์ด์๋ ์ ๋ฉ๋๋ค(SHOULD NOT).
ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์คํธ๋ฆผ ์๋ณ์ ๊ณต๊ฐ์ด ๊ฑฐ์ ์์ง๋์ด ๋์ฒด ์ฐ๊ฒฐ์ ๋ง๋ค๊ฑฐ๋(์น์ 5.1.1), TLS ์ฐ๊ฒฐ์ ํค ์ฌ๋ฃ๋ฅผ ๊ฐฑ์ ํ๊ฑฐ๋, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ฐ๊ฒฐ์ ๋์ฒดํ๊ธฐ ์ํด ์ถ๊ฐ ์ฐ๊ฒฐ์ ์์ฑํ ์ ์์ต๋๋ค(์น์ 5.4.1).
ํด๋ผ์ด์ธํธ๋ ์๋ก ๋ค๋ฅธ Server Name Indication ๊ฐ์ด๋ ์๋ก ๋ค๋ฅธ TLS ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ IP ์ฃผ์์ TCP ํฌํธ์ ๋ํด ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ด ์ ์์ผ๋(MAY), ๋์ผํ ๊ตฌ์ฑ์ผ๋ก ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์์ฑํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค(SHOULD).
์๋ฒ๋ ๊ฐ๋ฅํ ํ ์ค๋ซ๋์ ์ด๋ฆฐ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๊ฒ์ด ๊ถ์ฅ๋์ง๋ง, ํ์ํ๋ฉด ์ ํด ์ฐ๊ฒฐ์ ์ข ๋ฃํ ์ ์์ต๋๋ค. ์ด๋ ์ชฝ ์๋ํฌ์ธํธ๋ ์ ์ก ๊ณ์ธต์ TCP ์ฐ๊ฒฐ์ ๋ซ๊ธฐ๋ก ์ ํํ ๋ ์ข ๋ฃํ๋ ์๋ํฌ์ธํธ๋ ๋จผ์ GOAWAY ํ๋ ์(์น์ 6.8)์ ๋ณด๋ด์ด ์์ชฝ ์๋ํฌ์ธํธ๊ฐ ์ด์ ์ ์ ์ก๋ ํ๋ ์์ด ์ฒ๋ฆฌ๋์๋์ง ์ ๋ขฐ์ฑ ์๊ฒ ํ๋จํ๊ณ ํ์ํ ์์ฌ ์์ ์ ์ฐ์ํ๊ฒ ์๋ฃํ๊ฑฐ๋ ์ข ๋ฃํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค(SHOULD).
9.1.1. ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ
CONNECT ๋ฉ์๋(์น์ 8.5)๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ๋๋ ํฐ๋์ ํตํด ์์ฑ๋ ์๋ณธ ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ ์๋ก ๋ค๋ฅธ URI authority ๊ตฌ์ฑ์์๋ฅผ ๊ฐ์ง ์์ฒญ๋ค์ ๋ํด ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค(MAY). ์๋ณธ ์๋ฒ๊ฐ ๊ถํ์ ๊ฐ์ง๊ณ ์๋ ํ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค(์น์ 10.1). TLS๊ฐ ์๋ TCP ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ์๋ ํธ์คํธ๊ฐ ๋์ผํ IP ์ฃผ์๋ก ํด๊ฒฐ(resolved)๋๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
"https" ์์์ ๋ํด์๋ ์ฐ๊ฒฐ ์ฌ์ฌ์ฉ์ด URI์ ํธ์คํธ์ ๋ํด ์ ํจํ ์ธ์ฆ์๋ฅผ ๊ฐ๊ณ ์๋์ง์๋ ์์กดํฉ๋๋ค. ์๋ฒ๊ฐ ์ ์ํ ์ธ์ฆ์๋ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ํธ์คํธ์ ๋ํด ์ TLS ์ฐ๊ฒฐ์ ํ์ฑํ ๋ ์ํํ๋ ๋ชจ๋ ๊ฒ์ฌ๋ฅผ ์ถฉ์กฑํด์ผ ํฉ๋๋ค(MUST). ๋จ์ผ ์ธ์ฆ์๋ ์ฌ๋ฌ ์ค๋ฆฌ์ง์ ๋ํ ๊ถํ์ ํ๋ฆฝํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์์ธํ ๊ถํ ํ๋จ ๋ฐฉ๋ฒ์ RFC 9110 ์น์ 4.3์ ์ค๋ช ๋์ด ์์ต๋๋ค.
์ผ๋ถ ๋ฐฐํฌ ํ๊ฒฝ์์๋ ์ฌ๋ฌ ์ค๋ฆฌ์ง์ ๋ํด ๋์ผํ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๋ฉด ์์ฒญ์ด ์๋ชป๋ ์๋ณธ ์๋ฒ๋ก ํฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, TLS ์ข ๋จ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฏธ๋ค๋ฐ์ค๊ฐ TLS์ Server Name Indication ํ์ฅ์ ์ฌ์ฉํด ์ค๋ฆฌ์ง ์๋ฒ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ ์ต๋๋ค. ์ด๋ก ์ธํด ํด๋ผ์ด์ธํธ๊ฐ ์๋ํ ๋์์ด ์๋ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๊ฐ๋ฅ์ฑ์ด ์๊ธธ ์ ์์ต๋๋ค(๊ทธ๋ผ์๋ ์๋ฒ๋ ๋ค๋ฅธ ๋ฉด์์ ๊ถํ์ด ์์ ์ ์์).
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ, ํด๋น ์์ฒญ์ ๋ํด ์์ ์ด ๊ถํ์ ๊ฐ์ง์ง ์์์ ๋ํ๋ด๊ธฐ ์ํด 421 (Misdirected Request) ์ํ ์ฝ๋๋ฅผ ์๋ต์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค(์์ธํ ๋ด์ฉ์ RFC 9110 ์น์ 15.5.20 ์ฐธ์กฐ).
ํ๋ก์ ์ฌ์ฉ์ ์ํด ๊ตฌ์ฑ๋ ํด๋ผ์ด์ธํธ๋ ํด๋น ํ๋ก์๋ก์ ์์ฒญ์ ๋จ์ผ ์ฐ๊ฒฐ์ ํตํด ๋ณด๋ ๋๋ค. ์ฆ, ํ๋ก์๋ฅผ ํตํด ์ ์ก๋๋ ๋ชจ๋ ์์ฒญ์ ํ๋ก์๋ก์ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
9.2. TLS ๊ธฐ๋ฅ์ ์ฌ์ฉ
HTTP/2 ๊ตฌํ์ฒด๋ TLS ์์์์ HTTP/2์ ๋ํด TLS version 1.2 ์ด์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค(MUST). TLS ์ผ๋ฐ ์ฌ์ฉ ์ง์นจ([TLSBCP])์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๊ถ์ฅ๋๋ฉฐ, HTTP/2์ ํนํ๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ํ์ด ์์ต๋๋ค(SHOULD).
TLS ๊ตฌํ์ฒด๋ TLS ํ์ฅ์ Server Name Indication (SNI)๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค(MUST). ์๋ฒ๊ฐ ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์๋ณ๋๋ ๊ฒฝ์ฐ(domain name) ํด๋ผ์ด์ธํธ๋ ๋์ ํธ์คํธ๋ฅผ ๋ํ๋ด๋ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ง ์๋ ํ server_name TLS ํ์ฅ์ ๋ฐ๋์ ์ ์กํด์ผ ํฉ๋๋ค(MUST).
TLS 1.3์ ํ์ํ๋ HTTP/2 ๋ฐฐํฌ์ ๋ํ ์๊ตฌ์ฌํญ์ ์น์ 9.2.3์ ํฌํจ๋์ด ์์ต๋๋ค. TLS 1.2 ๋ฐฐํฌ๋ 9.2.1 ๋ฐ 9.2.2์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ฆ ๋๋ค. ๊ตฌํ์ฒด๋ ์ค์๋ฅผ ๋ง์กฑํ๋ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๋ ๊ฒ์ด ๊ถ์ฅ๋์ง๋ง, ์ต์ข ์ ์ผ๋ก ๋ฐฐํฌ ํ๊ฒฝ์ด ์ค์ ์ฑ ์์ ์ง๋๋ค.
9.2.1. TLS 1.2 ๊ธฐ๋ฅ
์ด ์ ์ HTTP/2์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ TLS 1.2 ๊ธฐ๋ฅ ์งํฉ์ ๋ํ ์ ํ์ ์ค๋ช ํฉ๋๋ค. ๋ฐฐํฌ ์ ์ฝ์ผ๋ก ์ธํด ์ด๋ฌํ ์ ํ์ด ์ถฉ์กฑ๋์ง ์์ ๋ TLS ํ์์ ์คํจ์ํค์ง ๋ชปํ ์๋ ์์ต๋๋ค. ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ์ง ์๋ HTTP/2 ์ฐ๊ฒฐ์ ๋ํด ์๋ํฌ์ธํธ๋ ์ฆ์ ์ฐ๊ฒฐ์ ์ข ๋ฃํ ์ ์์ผ๋ฉฐ(MAY) ์ด ๊ฒฝ์ฐ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1) ์ ํ์ผ๋ก INADEQUATE_SECURITY๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
TLS 1.2 ์์ HTTP/2 ๋ฐฐํฌ๋ ์์ถ์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค(MUST). TLS ์์ถ์ ๋ ธ์ถ๋ ์ ์๋ ์ ๋ณด๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค([RFC3749]). ์ผ๋ฐ์ ์ธ ์์ถ์ HTTP/2๊ฐ ์ ๊ณตํ๋ ๋ฌธ๋งฅ ์ธ์ง ์์ถ ๊ธฐ๋ฅ์ ๋นํด ๋ถํ์ํ๋ฏ๋ก ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๋ค.
TLS 1.2 ์์ HTTP/2 ๋ฐฐํฌ๋ ์ฌํ์(renegotiation)์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค(MUST). ์๋ํฌ์ธํธ๋ TLS ์ฌํ์์ ํ๋กํ ์ฝ ์ค๋ฅ(PROTOCOL_ERROR) ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค(MUST). ๋จ, ์ฌํ์ ๋นํ์ฑํ๋ก ์ธํด ์ฅ๊ธฐ ์ฐ๊ฒฐ์ด ์ํธํ๋ ๋ฉ์์ง ์์ ํ๊ณ๋ก ์ธํด ์ฌ์ฉํ ์ ์๊ฒ ๋ ์ ์์ต๋๋ค.
์๋ํฌ์ธํธ๋ ํด๋ผ์ด์ธํธ ์๊ฒฉ์ฆ๋ช ๋ณดํธ๋ฅผ ์ํด ์ฌํ์์ ์ฌ์ฉํ ์ ์์ผ๋(MAY), ๋ชจ๋ ์ฌํ์์ ์ฐ๊ฒฐ ์ฌ์ (preface)์ ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ์ํด์ผ ํ๋ฉฐ(MUST) ์๋ฒ๋ ์ฐ๊ฒฐ ์งํ ์ฌํ์ ์์ฒญ์ด ๋ณด์ด๋ฉด ํด๋ผ์ด์ธํธ ์ธ์ฆ์๋ฅผ ์์ฒญํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค(SHOULD).
์ด๋ ํน์ ๋ณดํธ๋ ์์์ ๋ํ ์์ฒญ์ ์๋ตํ์ฌ ์ฌํ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ค์ ๋ฐฉ์งํฉ๋๋ค. ํฅํ ๋ช ์ธ๋ ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋๋ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ฌํ์์ ์ง์ํ๋ ํ๋กํ ์ฝ ์ฌ์ฉ์ ์์ฒญํ๊ธฐ ์ํด HTTP_1_1_REQUIRED ์ ํ์ ์ค๋ฅ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ตฌํ์ฒด๋ ์์ ํค ๊ตํ(ephemeral key exchange)์ ๋ํด DHE(์ ํ์ฒด Diffie-Hellman)๋ฅผ ์ฌ์ฉํ๋ ์ํธ ์ ํ๊ตฐ์ ๊ฒฝ์ฐ ์ต์ 2048๋นํธ, ECDHE(ํ์๊ณก์ Diffie-Hellman)๋ฅผ ์ฌ์ฉํ๋ ์ํธ ์ ํ๊ตฐ์ ๊ฒฝ์ฐ ์ต์ 224๋นํธ์ ํค ๊ตํ ํฌ๊ธฐ๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค(MUST). ํด๋ผ์ด์ธํธ๋ ์ต๋ 4096๋นํธ์ DHE ํฌ๊ธฐ๋ฅผ ๋ฐ์๋ค์ฌ์ผ ํฉ๋๋ค(MUST). ์๋ํฌ์ธํธ๋ ํํ๋ณด๋ค ์์ ํค ํฌ๊ธฐ ํ์์ INADEQUATE_SECURITY ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(MAY).
9.2.2. TLS 1.2 ์ํธ ์ ํ๊ตฐ
TLS 1.2 ์์ HTTP/2 ๋ฐฐํฌ๋ ๋ถ๋ก A(Prohibited TLS 1.2 Cipher Suites)์ ๋์ด๋ ๊ธ์ง๋ ์ํธ ์ ํ๊ตฐ์ ์ฌ์ฉํด์๋ SHOULD NOT ํฉ๋๋ค.
์๋ํฌ์ธํธ๋ ๊ธ์ง๋ ์ํธ ์ ํ๊ตฐ์ด ํ์๋ ๊ฒฝ์ฐ INADEQUATE_SECURITY ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ์์ฑํ๊ธฐ๋ก ์ ํํ ์ ์์ต๋๋ค(MAY). ๊ธ์ง๋ ์ํธ ์ ํ๊ตฐ์ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ ๋ฐฐํฌ๋ ํด๋น ์ํธ ์ ํ๊ตฐ์ ์๋ฝํ ๊ฒ์ผ๋ก ์๋ ค์ง ํผ์ด ์งํฉ๊ณผ๋ง ์ํธ์์ฉํ ๊ฒฝ์ฐ์๋ง ์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ํผํ ์ ์์ต๋๋ค.
๊ตฌํ์ฒด๋ ๊ธ์ง๋์ง ์์ ์ํธ ์ ํ๊ตฐ์ ํ์์ ๋ํด ์ด ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ์๋ ์ ๋ฉ๋๋ค(MUST NOT). ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ธ์ง๋์ง ์์ ์ํธ ์ ํ๊ตฐ์ ์ ์ํ๋ฉด, HTTP/2์์ ํด๋น ์ํธ ์ ํ๊ตฐ์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํฉ๋๋ค.
๊ธ์ง๋ ์ํธ ์ ํ๊ตฐ ๋ชฉ๋ก์๋ TLS 1.2๊ฐ ํ์๋ก ์๊ตฌํ๋ ์ํธ ์ ํ๊ตฐ๋ ํฌํจ๋์ด ์์ด, TLS 1.2 ๋ฐฐํฌ๊ฐ ํ์ฉ๋๋ ์ํธ ์ ํ๊ตฐ ์งํฉ์ด ์๋ก ๊ต์งํฉ์ด ์์ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด, TLS 1.2๋ฅผ ์ฌ์ฉํ๋ HTTP/2 ๋ฐฐํฌ๋ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256์ P-256 ํ์๊ณก์ ๊ณผ ํจ๊ป ๋ฐ๋์ ์ง์ํด์ผ ํฉ๋๋ค(MUST).
ํด๋ผ์ด์ธํธ๋ HTTP/2๋ฅผ ์ง์ํ์ง ์๋ ์๋ฒ์์ ์ฐ๊ฒฐ์ ํ์ฉํ๊ธฐ ์ํด ๊ธ์ง๋ ์ํธ ์ ํ๊ตฐ์ ๊ด๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ ์๋ฒ๊ฐ HTTP/1.1์ ์ ํํ๋๋ก ํจ์ผ๋ก์จ ์ฐ๊ฒฐ์ ํ์ฉํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ ์ฝ๊ณผ ์ํธ ์ ํ๊ตฐ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ ํ๋ ๊ฒฝ์ฐ ๊ธ์ง๋ ์ํธ ์ ํ๊ตฐ์ผ๋ก HTTP/2๊ฐ ํ์๋ ์ํ์ด ์์ต๋๋ค.
9.2.3. TLS 1.3 ๊ธฐ๋ฅ
TLS 1.3์๋ ์ด์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด ์ ์ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉ์ ๋ํด ๋ ผ์ํฉ๋๋ค.
HTTP/2 ์๋ฒ๋ ํธ๋์ ฐ์ดํฌ ์ดํ์ TLS 1.3 CertificateRequest ๋ฉ์์ง๋ฅผ ์ ์กํด์๋ ์ ๋ฉ๋๋ค(MUST NOT). HTTP/2 ํด๋ผ์ด์ธํธ๋ TLS ํธ๋์ ฐ์ดํฌ ์ดํ์ CertificateRequest ๋ฉ์์ง๋ฅผ PROTOCOL_ERROR ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค(MUST).
ํธ๋์ ฐ์ดํฌ ์ดํ ์ธ์ฆ(post-handshake authentication)์ ๋ํ ๊ธ์ง๋ ํด๋ผ์ด์ธํธ๊ฐ "post_handshake_auth" TLS ํ์ฅ์ ์ ๊ณตํ๋๋ผ๋ ์ ์ฉ๋ฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํ๋กํ ์ฝ์์ ์ฌ์ฉ๋ ์ ์๋๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๊ณ ๋ ์ ์์ผ๋, ํ์ฅ์ ํฌํจ์ด HTTP/2 ๋ด์์์ ์ง์์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
[TLS13]๋ NewSessionTicket ๋ฐ KeyUpdate์ ๊ฐ์ ๋ค๋ฅธ ํธ๋์ ฐ์ดํฌ ์ดํ ๋ฉ์์ง๋ฅผ ์ ์ํ๋ฉฐ, ์ด๋ค์ HTTP/2์ ์ง์ ์ํธ์์ฉํ์ง ์์ผ๋ฏ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. TLS ๋ฉ์์ง ์ ํ์ ์ฌ์ฉ์ด ์ ํ๋ฆฌ์ผ์ด์ -๋ ์ด์ด ํ๋กํ ์ฝ๊ณผ์ ์ํธ์์ฉ์ ์์กดํ์ง ์๋ ํ, ํด๋น TLS ๋ฉ์์ง๋ ํธ๋์ ฐ์ดํฌ ์๋ฃ ํ ์ ์ก๋ ์ ์์ต๋๋ค.
TLS early data๋ [RFC8470]์ ์ง์นจ์ ์ค์ํ๋ ํ ์์ฒญ ์ ์ก์ ์ฌ์ฉํ ์ ์์ต๋๋ค(MAY). ํด๋ผ์ด์ธํธ๋ ์ด๊ธฐ ์๋ฒ ์ค์ ๊ฐ์ ๊ฐ์ ํ์ฌ early data์์ ์์ฒญ์ ์ ์กํฉ๋๋ค.
10. ๋ณด์ ๊ณ ๋ ค์ฌํญ
TLS์ ์ฌ์ฉ์ ์ด ํ๋กํ ์ฝ์ ๋ง์ ๋ณด์ ์์ฑ์ ์ ๊ณตํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ด ์น์ ์ ๋ง์ ์ฃผ์ฅ๋ค์ Section 9.2์ ์ค๋ช ๋ ๋๋ก TLS๊ฐ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ์ฑ๋ฆฝํ์ง ์์ต๋๋ค.
10.2. ๊ต์ฐจ-ํ๋กํ ์ฝ ๊ณต๊ฒฉ
๊ต์ฐจ-ํ๋กํ ์ฝ ๊ณต๊ฒฉ์์ ๊ณต๊ฒฉ์๋ ํด๋ผ์ด์ธํธ๋ฅผ ๋ค๋ฅธ ํ๋กํ ์ฝ์ ์ดํดํ๋ ์๋ฒ๋ก ํธ๋์ญ์ ์ ์์ํ๊ฒ ๋ง๋ญ๋๋ค. ๊ณต๊ฒฉ์๋ ํด๋น ํธ๋์ญ์ ์ด ๋ ๋ฒ์งธ ํ๋กํ ์ฝ์์ ์ ํจํ ํธ๋์ญ์ ์ผ๋ก ๋ณด์ด๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์น ๋ฌธ๋งฅ์ ๊ธฐ๋ฅ๊ณผ ๊ฒฐํฉ๋๋ฉด, ์ด๋ ์ฌ์ค ๋คํธ์ํฌ์ ์ ์ ํ ๋ณดํธ๋์ง ์์ ์๋ฒ์ ์ํธ์์ฉํ๊ธฐ ์ํด ์ ์ฉ๋ ์ ์์ต๋๋ค.
ALPN ์๋ณ์๋ฅผ ์ฌ์ฉํ TLS ํธ๋์ ฐ์ดํฌ ์๋ฃ๋ ๊ต์ฐจ-ํ๋กํ ์ฝ ๊ณต๊ฒฉ์ ๋ํ ์ถฉ๋ถํ ๋ณดํธ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ALPN์ ์๋ฒ๊ฐ HTTP/2 ์งํ์ ๋์ํจ์ ๊ธ์ ์ ์ผ๋ก ํ์ํ์ฌ ๋ค๋ฅธ TLS ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ ๋ํ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
TLS์ ์ํธํ๋ ๊ณต๊ฒฉ์๊ฐ ํ๋ฌธ ํ๋กํ ์ฝ์ ๋ํ ๊ต์ฐจ-ํ๋กํ ์ฝ ๊ณต๊ฒฉ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ์ดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
ํ๋ฌธ ๋ฒ์ ์ HTTP/2๋ ๊ต์ฐจ-ํ๋กํ ์ฝ ๊ณต๊ฒฉ์ ๋ํด ์ต์ํ์ ๋ณดํธ๋ง ์ ๊ณตํฉ๋๋ค. ์ฐ๊ฒฐ ํ๋ฆฌํ์ด์ค(์น์ 3.4)์๋ HTTP/1.1 ์๋ฒ๋ฅผ ํผ๋์ํค๋๋ก ์ค๊ณ๋ ๋ฌธ์์ด์ด ํฌํจ๋์ด ์์ง๋ง, ๋ค๋ฅธ ํ๋กํ ์ฝ์ ๋ํ ํน๋ณํ ๋ณดํธ๋ ์ ๊ณต๋์ง ์์ต๋๋ค.
10.3. ์ค๊ฐ์ ์บก์ํ ๊ณต๊ฒฉ
HPACK์ ๋ค๋ฅธ HTTP ๋ฒ์ ์์ ๊ตฌ๋ถ์๋ก ์ฒ๋ฆฌ๋ ์ ์๋ ํ๋ ์ด๋ฆ๊ณผ ๊ฐ์ ์ธ์ฝ๋ฉํ ์ ์๊ฒ ํ์ฉํฉ๋๋ค. HTTP/2 ์์ฒญ ๋๋ ์๋ต์ ๋ณํํ๋ ์ค๊ฐ์๋ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ HTTP ๋ฒ์ ์ผ๋ก ๋ณํํ๊ธฐ ์ ์ ์น์ 8.2์ ๊ท์น์ ๋ฐ๋ผ ํ๋๋ฅผ ๊ฒ์ฆํด์ผ ํฉ๋๋ค(MUST). ์๋ชป๋ ๊ตฌ๋ถ์๋ฅผ ํฌํจํ ํ๋๋ฅผ ๋ณํํ๋ฉด ์์ ์๊ฐ ๋ฉ์์ง๋ฅผ ์๋ชป ํด์ํ๋๋ก ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ด๋ ๊ณต๊ฒฉ์์๊ฒ ์ ์ฉ๋ ์ ์์ต๋๋ค.
์น์ 8.2๋ ์์ฌ-ํค๋ ํ๋์ ๊ฒ์ฆ์ ๋ํ ๊ตฌ์ฒด์ ๊ท์น์ ํฌํจํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋ ๊ฐ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ถ๊ฐ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค. ํนํ ":scheme", ":authority" ๋ฐ ":path"๊ฐ ํ๋์ URI ๋ฌธ์์ด๋ก ๊ฒฐํฉ๋ ๋ ์ถ๊ฐ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค([RFC3986]). ์ ์ฌํ ๋ฌธ์ ๋ ํด๋น URI ๋๋ ":path"๊ฐ ":method"์ ๊ฒฐํฉ๋์ด ์์ฒญ ๋ผ์ธ์ ๊ตฌ์ฑํ ๋๋ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋จ์ ์ฐ๊ฒฐ์ ์ ๋ ฅ ๊ฐ์ด ์์ ํ ๊ฒ์ฆ๋์ง ์๋ ํ ์์ ํ์ง ์์ต๋๋ค.
์ค๊ฐ์๋ ํ๋ ์ด๋ฆ์ด๋ ๊ฐ์ด ์ ํจํ์ง ์์ ํ๋๋ฅผ ๋ค๋ฅธ ์ด์ ๋ก ๊ฑฐ๋ถํ ์ ์์ต๋๋ค โ ํนํ RFC 9110์ ์น์ 5์ ์ ์๋ HTTP ABNF ๋ฌธ๋ฒ์ ๋ถํฉํ์ง ์๋ ํ๋๋ค์ ๋๋ค. ์ต์ํ์ ๊ฒ์ฆ(์น์ 8.2)์ด ์ํ๋์ง ์๋ ์ค๊ฐ์๋ ์ ํจํ์ง ์์ ํ๋ ์ด๋ฆ ๋๋ ๊ฐ์ ํฌํจํ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ค๊ฐ์๋ ์ ๋ฌ ์ ์ ์ ๊ฑฐํด์ผ ํ๋ ํ๋๋ฅผ ์์ ํ๋ฉด(์: RFC 9110 ์น์ 7.6.1 ์ฐธ์กฐ) ํด๋น ํค๋ ํ๋๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋์ฒดํด์ผ ํฉ๋๋ค(MUST). ๋ํ ์ค๊ฐ์๋ Content-Length ํ๋๋ฅผ ํฌํจํ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ๋ ๋ฉ์์ง๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฑ๋์๋์ง ์ฃผ์ํด์ผ ํฉ๋๋ค(์น์ 8.1.1). ์ด๋ ๋ฉ์์ง๊ฐ ์ดํ HTTP/1.1๋ก ๋ณํ๋๋๋ผ๋ ํ๋ ์ด๋ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
10.4. ํธ์๋ ์๋ต์ ์บ์ ๊ฐ๋ฅ์ฑ
ํธ์๋ ์๋ต์ ํด๋ผ์ด์ธํธ์ ๋ช ์์ ์์ฒญ์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค; ์์ฒญ์ ์๋ฒ๊ฐ PUSH_PROMISE ํ๋ ์์์ ์ ๊ณตํฉ๋๋ค.
ํธ์๋ ์๋ต์ ์บ์ฑํ๋ ๊ฒ์ ์๋ณธ ์๋ฒ๊ฐ Cache-Control ํค๋ ํ๋๋ก ์ ๊ณตํ๋ ์ง์นจ์ ๋ฐ๋ผ ๊ฐ๋ฅํ์ง๋ง, ๋จ์ผ ์๋ฒ๊ฐ ์ฌ๋ฌ ํ ๋ํธ๋ฅผ ํธ์คํ ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ๋ ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ URI ๊ณต๊ฐ์ ์์ ๋ถ๋ถ์ ๊ฐ๊ฐ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ํ ๋ํธ๊ฐ ๋์ผ ์๋ฒ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ, ํด๋น ์๋ฒ๋ ํ ๋ํธ๊ฐ ์์ ์๊ฒ ๊ถํ์ด ์๋ ๋ฆฌ์์ค์ ํํ์ ํธ์ํ์ง ๋ชปํ๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค(MUST). ์ด๋ฅผ ๊ฐ์ ํ์ง ๋ชปํ๋ฉด ํ ๋ํธ๊ฐ ๊ถํ ์๋ ํ ๋ํธ๊ฐ ์ ๊ณตํ๋ ์ค์ ํํ์ ์บ์์์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
์๋ณธ ์๋ฒ๊ฐ ๊ถํ์ ๊ฐ์ง ์์ ํธ์๋ ์๋ต์ ์ฌ์ฉ๋๊ฑฐ๋ ์บ์๋์ด์๋ ์ ๋ฉ๋๋ค(MUST NOT).
10.5. ์๋น์ค ๊ฑฐ๋ถ ๊ณ ๋ ค์ฌํญ
HTTP/2 ์ฐ๊ฒฐ์ HTTP/1.1 ์ฐ๊ฒฐ๋ณด๋ค ๋ ๋ง์ ์์ ํ ๋น์ ์๊ตฌํ ์ ์์ต๋๋ค. ํ๋ ์น์ ์์ถ๊ณผ ํ๋ฆ ์ ์ด๋ ๋ ๋ง์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ฉฐ, ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ค์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฝ์์ ์๊ฒฉํ ์ ํํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
PUSH_PROMISE ํ๋ ์์ ์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ์ฝ๋์ง ์์ต๋๋ค. ์๋ฒ ํธ์๋ฅผ ์์ฉํ๋ ํด๋ผ์ด์ธํธ๋ "reserved (remote)" ์ํ๋ก ํ์ฉ๋๋ ์คํธ๋ฆผ ์๋ฅผ ์ ํํด์ผ ํฉ๋๋ค(SHOULD). ๊ณผ๋ํ ์์ ์๋ฒ ํธ์ ์คํธ๋ฆผ์ ์น์ 5.4.2์ ENHANCE_YOUR_CALM ์ ํ์ ์คํธ๋ฆผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ฌ๋ฌ HTTP/2 ๊ตฌํ์ด ์๋น์ค ๊ฑฐ๋ถ ์ทจ์ฝ์ ์ด ์์์ด ๋ฐ๊ฒฌ๋์์ต๋๋ค([NFLX-2019-002]). ์๋๋ ๊ตฌํ์ฒด๊ฐ ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ ์ทจ์ฝํด์ง ์ ์๋ ์๋ ค์ง ๋ฐฉ์๋ค์ ๋ชฉ๋ก์ ๋๋ค:
-
์์๋ฐ์ด๋ ๋๊ธฐ ํ๋ ์์ ๋นํจ์จ์ ์ผ๋ก ์ถ์ ํ๋ฉด ๊ณต๊ฒฉ์๊ฐ ๋๋์ ํ๋ ์์ ์ก์ ๋๊ธฐ์ด์ ์์ด๊ฒ ํ์ฌ ๊ณผ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ํผ์ด๋ ์ฌ๋ฌ ๊ธฐ๋ฒ์ผ๋ก ๋๋์ ํ๋ ์ ์์ฑ์ ์ ๋ฐํ ์ ์์ต๋๋ค:
- WINDOW_UPDATE ํ๋ ์์ ์์ ์ฆ๊ฐ๋์ ์ ๊ณตํ๋ฉด ์ก์ ์๊ฐ ๋ง์ ์์ DATA ํ๋ ์์ ์์ฑํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ์๋ํฌ์ธํธ๋ PING ํ๋ ์์ ์๋ตํด์ผ ํฉ๋๋ค.
- ๊ฐ SETTINGS ํ๋ ์์ ํ์ธ ์๋ต์ ํ์๋ก ํฉ๋๋ค.
- ์๋ชป๋ ์์ฒญ(๋๋ ์๋ฒ ํธ์)์ ํผ์ด๊ฐ RST_STREAM ํ๋ ์์ ์๋ต์ผ๋ก ๋ณด๋ด๊ฒ ํ ์ ์์ต๋๋ค.
- ๊ณต๊ฒฉ์๊ฐ HTTP/2 ๊ณ์ธต์์ ๋ง์ ์์ ํ๋ฆ ์ ์ด ํฌ๋ ๋ง์ ์ ๊ณตํ์ง๋ง TCP ๊ณ์ธต์์๋ ํฌ๋ ๋ง์ ๋ณด๋ฅํจ์ผ๋ก์จ ํ๋ ์ ์ ์ก์ ๋ง์ ์ ์์ต๋๋ค. TCP ํ๊ณ๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ํ๋ ์์ ์์ฑํ๊ณ ๋ณด๊ดํ๋ ์๋ํฌ์ธํธ๋ ์์ ์์ง์ ์ทจ์ฝํ ์ ์์ต๋๋ค.
- ์๊ฑฐ๋ ๋น์ด ์๋ ๋ง์ ์์ ํ๋ ์์ ํผ์ด๊ฐ ํ๋ ์ ํค๋ ์ฒ๋ฆฌ์ ๋ง์ ์๊ฐ์ ์๋นํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค๋ง ์คํธ๋ฆผ ์ข ๋ฃ ์ ๋ณด๋ผ ์ ์๋ ๋น DATA ๋๋ CONTINUATION ํ๋ ์๊ณผ ๊ฐ์ด ์์ ํ๋ ์์ ์ผ๋ถ ์ฌ์ฉ์ ์ ๋นํ ์ ์์ต๋๋ค.
- SETTINGS ํ๋ ์์ ํผ์ด๊ฐ ์ถ๊ฐ ์ฒ๋ฆฌ ์๊ฐ์ ์๋นํ๋๋ก ์ ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ์ค์ ์ ์ธ๋ฐ์์ด ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฌ๋ฌ ์ ์๋์ง ์์ ์ค์ ์ ๋ณด๋ด๊ฑฐ๋ ๋์ผํ ์ค์ ์ ํ ํ๋ ์ ๋ด์์ ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝํจ์ผ๋ก์จ ๋ฐ์ํ ์ ์์ต๋๋ค.
- PRIORITY ํ๋ ์์ผ๋ก ์ฌ์ฐ์ ์์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ ์๋นํ ์ฒ๋ฆฌ ์๊ฐ์ ํ์๋ก ํ๋ฉฐ ๋ง์ PRIORITY ํ๋ ์์ด ์ ์ก๋๋ฉด ๊ณผ๋ถํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ํ๋ ์น์ ์์ถ์ ๊ณต๊ฒฉ์๊ฐ ์ฒ๋ฆฌ ์์์ ๋ญ๋นํ๋๋ก ํ๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค; ์ ์ฌ์ ๋จ์ฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ HPACK ๋ช ์ธ([COMPRESSION])๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- SETTINGS์์์ ์ ํ์ ์ฆ์ ์ค์ผ ์ ์์ผ๋ฏ๋ก ์๋ํฌ์ธํธ๋ ํผ์ด์ ๋์์ผ๋ก ์ธํด ์ ์ ํ์ ์ด๊ณผํ ์ํ์ ๋ ธ์ถ๋ฉ๋๋ค. ํนํ ์ฐ๊ฒฐ์ ์ค์ ํ ์งํ์๋ ์๋ฒ๊ฐ ์ค์ ํ ์ ํ์ ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ์์ด ์ฝ๊ฒ ์ด๊ณผ๋ ์ ์์ต๋๋ค.
์๋น์ค ๊ฑฐ๋ถ์ ์ ์ฉ๋ ์ ์๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ โ ์๋ฅผ ๋ค์ด SETTINGS ๋ณ๊ฒฝ, ์์ ํ๋ ์, ํ๋ ์น์ ์์ถ โ ์ ์ ๋นํ ์ฌ์ฉ ์ฌ๋ก๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ๋ถํ์ํ๊ฑฐ๋ ๊ณผ๋ํ๊ฒ ์ฌ์ฉ๋ ๋๋ง ๋ถ๋ด์ด ๋ฉ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๋ชจ๋ํฐ๋งํ์ง ์๋ ์๋ํฌ์ธํธ๋ ์๋น์ค ๊ฑฐ๋ถ ์ํ์ ๋ ธ์ถ๋ฉ๋๋ค. ๊ตฌํ์ฒด๋ ์ด๋ฌํ ๊ธฐ๋ฅ ์ฌ์ฉ์ ์ถ์ ํ๊ณ ์ฌ์ฉ ํ๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค(SHOULD). ์์ฌ์ค๋ฌ์ด ํ๋์ ENHANCE_YOUR_CALM ์ ํ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(MAY).
10.5.1. ํ๋ ๋ธ๋ก ํฌ๊ธฐ ์ ํ
ํฐ ํ๋ ๋ธ๋ก(์น์ 4.3)์ ๊ตฌํ์ฒด๊ฐ ๋ง์ ์์ ์ํ๋ฅผ ํ ๋นํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ผ์ฐํ ์ ์ค์ํ ํ๋ ๋ผ์ธ์ ํ๋ ๋ธ๋ก์ ๋์ ๋ํ๋ ์ ์์ด ํ๋๋ฅผ ์ต์ข ๋ชฉ์ ์ง๋ก ์คํธ๋ฆฌ๋ฐํ๋ ๊ฒ์ ๋ฐฉํดํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์์ ์บ์ ์ ํฉ์ฑ ๋ณด์ฅ ๋ฑ์ ์ด์ ๋ก ์๋ํฌ์ธํธ๋ ์ ์ฒด ํ๋ ๋ธ๋ก์ ๋ฒํผ๋งํ ํ์๊ฐ ์์ ์ ์์ต๋๋ค. ํ๋ ๋ธ๋ก์ ํฌ๊ธฐ์ ๋ํ ํ๋ํ ํ๊ณ๊ฐ ์์ผ๋ฏ๋ก ์ผ๋ถ ์๋ํฌ์ธํธ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ ๋ธ๋ก์ ํ ๋นํด์ผ ํ ์ ์์ต๋๋ค.
์๋ํฌ์ธํธ๋ SETTINGS_MAX_HEADER_LIST_SIZE๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ด์๊ฒ ๋น์์ถ ํ๋ ๋ธ๋ก ํฌ๊ธฐ์ ์ ์ฉ๋ ์ ์๋ ํ๋๋ฅผ ์๋ฆด ์ ์์ต๋๋ค. ์ด ์ค์ ์ ๊ถ๊ณ ์ (advisory)์ด๋ฏ๋ก ์๋ํฌ์ธํธ๋ ์ด ํ๋๋ฅผ ์ด๊ณผํ๋ ํ๋ ๋ธ๋ก์ ๋ณด๋ผ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ์์ฒญ ๋๋ ์๋ต์ด ์๋ชป๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๋ ์ํ์ ๊ฐ์ํ ์ ์์ต๋๋ค. ์ด ์ค์ ์ ์ฐ๊ฒฐ๋ณ์ด๋ฏ๋ก ์ด๋ค ์์ฒญ์ด๋ ์๋ต์ด ๋ ๋ฎ์ ์ ์ ์๋ ํ๋๋ฅผ ๊ฐ์ง ํ์ ๋ง๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ค๊ฐ์๋ ์๋ก ๋ค๋ฅธ ํผ์ด๊ฐ ์ ์ํ ๊ฐ์ ์ ๋ฌํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํํผํ๋ ค ์๋ํ ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ ์๋ฌด๋ ์์ต๋๋ค.
์๋ฒ๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ๋ณด๋ค ํฐ ํ๋ ๋ธ๋ก์ ์์ ํ๋ฉด HTTP 431(ํค๋ ํ๋๊ฐ ๋๋ฌด ํผ) ์ํ ์ฝ๋๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค([RFC6585]). ํด๋ผ์ด์ธํธ๋ ์ฒ๋ฆฌํ ์ ์๋ ์๋ต์ ํ๊ธฐํ ์ ์์ต๋๋ค. ํ๋ ๋ธ๋ก์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๊ธฐ ์ํด ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค(MUST), ๋จ ์ฐ๊ฒฐ์ด ๋ซํ๋ ๊ฒฝ์ฐ๋ ์ ์ธ์ ๋๋ค.
10.5.2. CONNECT ๊ด๋ จ ๋ฌธ์
CONNECT ๋ฉ์๋๋ ํ๋ก์์ ๋ถ๊ท ํ์ ์ธ ๋ถํ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์คํธ๋ฆผ ์์ฑ์ TCP ์ฐ๊ฒฐ์ ์์ฑ ๋ฐ ์ ์ง์ ๋นํด ์๋์ ์ผ๋ก ๋น์ฉ์ด ์ ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ํ๋ก์๋ CONNECT ์์ฒญ์ ์ด๋ฐํ ์คํธ๋ฆผ์ด ๋ซํ ์ดํ์๋ ์์๊ณ ์ TCP ์ฐ๊ฒฐ์ ์ํด ์์์ ์ ์งํ ์ ์์ผ๋ฉฐ, ์ด๋ ํด๋น ์ฐ๊ฒฐ์ด TIME_WAIT ์ํ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ํ๋ก์๋ SETTINGS_MAX_CONCURRENT_STREAMS๋ง์ผ๋ก CONNECT ์์ฒญ์ด ์๋นํ๋ ์์์ ์ ํํ ์ ์์ต๋๋ค.
10.6. ์์ถ ์ฌ์ฉ
์์ถ์ ๊ณต๊ฒฉ์๊ฐ ๋์ผํ ๋ฌธ๋งฅ์์ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ๋ฐ์ดํฐ์ ๋น๋ฐ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์์ถํ ๋ ๋น๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค. HTTP/2๋ ํ๋ ๋ผ์ธ(์น์ 4.3)์ ์์ถ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ๋ค์์ ์ฐ๋ ค์ฌํญ์ HTTP ์์ถ๋ ์ฝํ ์ธ ์ธ์ฝ๋ฉ์ ์ฌ์ฉ์๋ ์ ์ฉ๋ฉ๋๋ค.
์น์ ํน์ฑ์ ์ ์ฉํ๋ ์์ถ ๊ณต๊ฒฉ(์: [BREACH])์ด ์ ์ฆ๋์ด ์์ต๋๋ค. ๊ณต๊ฒฉ์๋ ๋ค์ํ ํ๋ฌธ์ ํฌํจํ๋ ์ฌ๋ฌ ์์ฒญ์ ์ ๋ํ๊ณ ๊ฒฐ๊ณผ ์ํธ๋ฌธ ๊ธธ์ด๋ฅผ ๊ด์ฐฐํ์ฌ, ๋น๋ฐ์ ๋ํ ์ถ์ธก์ด ๋ง์ ๋ ๊ธธ์ด๊ฐ ์งง์์ง๋ ๊ฒ์ ์ด์ฉํฉ๋๋ค.
๋ณด์ ์ฑ๋๋ก ํต์ ํ๋ ๊ตฌํ์ฒด๋ ๊ธฐ๋ฐ ๋ฐ์ดํฐ์ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ ์์ถ ์ปจํ ์คํธ์์ ์์ถํ์ง ์์์ผ ํฉ๋๋ค(MUST NOT), ๋๋ ๊ฐ ๋ฐ์ดํฐ ์์ฒ์ ๋ํด ๋ณ๋์ ์์ถ ์ฌ์ (dictionary)์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ์ ์ถ์ฒ๋ฅผ ์ ๋ขฐ์ฑ ์๊ฒ ํ๋จํ ์ ์๋ ๊ฒฝ์ฐ ์์ถ์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. TLS๊ฐ ์ ๊ณตํ๋ ์ผ๋ฐ์ ์ธ ์คํธ๋ฆผ ์์ถ์ HTTP/2์์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค (์น์ 9.2 ์ฐธ์กฐ).
ํค๋ ํ๋ ์์ถ์ ๋ํ ์ถ๊ฐ ๊ณ ๋ ค์ฌํญ์ HPACK ๋ช ์ธ([COMPRESSION])์ ์ค๋ช ๋์ด ์์ต๋๋ค.
10.7. ํจ๋ฉ ์ฌ์ฉ
HTTP/2 ๋ด์ ํจ๋ฉ์ TLS์ ๊ฐ์ ์ผ๋ฐ ๋ชฉ์ ํจ๋ฉ์ ๋์ฒดํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋๋ค([TLS13]). ์ค๋ณต๋ ํจ๋ฉ์ ์คํ๋ ค ์ญํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ ์ฉ์ ํจ๋ฉ๋๋ ๋ฐ์ดํฐ์ ๋ํ ๊ตฌ์ฒด์ ์ง์์ ํ์๋ก ํ ์ ์์ต๋๋ค.
์์ถ์ ์์กดํ๋ ๊ณต๊ฒฉ์ ์ํํ๊ธฐ ์ํด์๋ ํจ๋ฉ๋ณด๋ค ์์ถ์ ๋นํ์ฑํํ๊ฑฐ๋ ์ ํํ๋ ๊ฒ์ด ๋ ๋ฐ๋์งํ ์ ์์ต๋๋ค.
ํจ๋ฉ์ ํ๋ ์ ๋ด์ฉ์ ์ ํํ ํฌ๊ธฐ๋ฅผ ํ๋ฆฌ๊ฒ ํ์ฌ HTTP ๋ด์ ํน์ ๊ณต๊ฒฉ(์: ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ํ๋ฌธ๊ณผ ๋น๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ์์ถ๋ ์ฝํ ์ธ ์ ๋ํ ๊ณต๊ฒฉ)์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
ํจ๋ฉ์ ์ฌ์ฉ์ ์ฆ์ ๋ช ํํ๊ฒ ๋ณด์ด๋ ๋งํผ์ ๋ณดํธ๋ฅผ ์ ๊ณตํ์ง ์์ ์ ์์ต๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ ํจ๋ฉ์ ๊ณต๊ฒฉ์๊ฐ ๊ด์ฐฐํด์ผ ํ๋ ํ๋ ์ ์๋ฅผ ์ฆ๊ฐ์์ผ ๊ธธ์ด ์ ๋ณด๋ฅผ ์ถ๋ก ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ๋ฟ์ ๋๋ค. ์๋ชป ๊ตฌํ๋ ํจ๋ฉ ์คํด์ ์ฝ๊ฒ ์ฐํ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ธก ๊ฐ๋ฅํ ๋ถํฌ๋ฅผ ๊ฐ์ง ๋ฌด์์ ํจ๋ฉ์ ๊ฑฐ์ ๋ณดํธ๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉฐ, ํ๋ ์ ํ์ด๋ก๋๋ฅผ ๊ณ ์ ํฌ๊ธฐ๋ก ํจ๋ฉํ๋ฉด ํฌ๊ธฐ๊ฐ ๊ณ ์ ๊ฒฝ๊ณ๋ฅผ ๋์ ๋ ์ ๋ณด๊ฐ ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
์ค๊ฐ์๋ DATA ํ๋ ์์ ํจ๋ฉ์ ์ ์งํ๋ ๊ฒ์ด ๊ถ์ฅ๋์ง๋ง(SHOULD), HEADERS ๋ฐ PUSH_PROMISE ํ๋ ์์ ํจ๋ฉ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค(MAY). ์ค๊ฐ์๊ฐ ํ๋ ์์ ํจ๋ฉ ์์ ๋ณ๊ฒฝํ๋ ํฉ๋นํ ์ด์ ๋ ํจ๋ฉ์ด ์ ๊ณตํ๋ ๋ณดํธ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํจ์ผ ์ ์์ต๋๋ค.
10.8. ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ณ ๋ ค์ฌํญ
HTTP/2์ ์ฌ๋ฌ ํน์ฑ์ ๊ด์ฐฐ์์๊ฒ ๋จ์ผ ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ๋์์ ์๊ฐ์ ๋ฐ๋ผ ์๊ด๊ด๊ณ๋ก ์ฐ๊ฒฐํ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ ๊ฐ, ํ๋ฆ ์ ์ด ์ฐฝ ๊ด๋ฆฌ ๋ฐฉ์, ์คํธ๋ฆผ์ ๋ํ ์ฐ์ ์์ ํ ๋น ๋ฐฉ์, ์๊ทน์ ๋ํ ๋ฐ์์ ํ์ด๋ฐ, ์ค์ ์ผ๋ก ์ ์ด๋๋ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌ ๋ฐฉ์ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
์ด๋ฌํ ํน์ฑ๋ค์ด ํ๋์์ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ฐจ์ด๋ฅผ ๋ง๋ค๋ฉด, ์ด๋ ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ง๋ฌธ(fingerprinting)์ ๊ทผ๊ฑฐ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค(RFC 6973 ์น์ 3.2 ์ฐธ์กฐ).
HTTP/2๊ฐ ๋จ์ผ TCP ์ฐ๊ฒฐ ์ฌ์ฉ์ ์ ํธํ๋ ๊ฒ์ ์ฌ์ดํธ์์ ์ฌ์ฉ์์ ํ๋์ ์ฐ๊ด์ํค๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์ค๋ฆฌ์ง์ ๋ํด ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๋ฉด ์ค๋ฆฌ์ง ๊ฐ ์ถ์ ์ด ๊ฐ๋ฅํด์ง๋๋ค.
PING ๋ฐ SETTINGS ํ๋ ์์ ์ฆ๊ฐ์ ์ธ ์๋ต์ ์๊ตฌํ๋ฏ๋ก, ์ด๋ค์ ์๋ํฌ์ธํธ๊ฐ ํผ์ด์ ๋ํ ์ง์ฐ(latency)์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ํน์ ์๋๋ฆฌ์ค์์ ํ๋ผ์ด๋ฒ์์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
10.9. ์๊ฒฉ ํ์ด๋ฐ ๊ณต๊ฒฉ
์๊ฒฉ ํ์ด๋ฐ ๊ณต๊ฒฉ์ ์๋ฒ๊ฐ ๋น๋ฐ์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ์์ ์๊ฐ์ ๋ณ๋์ ๊ด์ฐฐํ์ฌ ๋น๋ฐ์ ์ถ์ถํฉ๋๋ค. HTTP/2๋ ๋์ ์์ฒญ ์์ฑ ๋ฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์์ฒญ ์ฒ๋ฆฌ ์์ ์์ ์ ๋ ์ ์ ์ดํ ์ ์๊ฒ ํฉ๋๋ค. ์ฌ๋ฌ HTTP/2 ์์ฒญ์ ๋์ผํ IP ํจํท์ด๋ TLS ๋ ์ฝ๋์ ํฌํจ๋ ์ ์์ผ๋ฏ๋ก, HTTP/2๋ ์์ฒญ ์ ๋ฌ์ ๋ณ๋์ฑ์ ์ ๊ฑฐํ์ฌ ์๊ฒฉ ํ์ด๋ฐ ๊ณต๊ฒฉ์ ๋ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
ํ์ด๋ฐ ๊ณต๊ฒฉ์ ๋ํ ์ต์ ์ ๋ฐฉ์ด๋ ์ฒ๋ฆฌ ์๊ฐ์ด ๋น๋ฐ ๊ฐ์ ์์กดํ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
11. IANA ๊ณ ๋ ค์ฌํญ
์ด HTTP/2 ๊ฐ์ ํ์ HTTP2-Settings ํค๋ ํ๋์ h2c ์ ๊ทธ๋ ์ด๋ ํ ํฐ(๋ ๋ค [RFC7540]์์ ์ ์๋จ)์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ผ๋ก ์ง์ ํฉ๋๋ค.
์น์ 11์ [RFC7540]์์ PRI HTTP ๋ฉ์๋์ ํจ๊ป h2 ๋ฐ h2c ALPN ์๋ณ์๋ฅผ ๋ฑ๋กํ์ต๋๋ค. RFC 7540๋ ๋ํ ํ๋ ์ ์ ํ, ์ค์ ๋ฐ ์ค๋ฅ ์ฝ๋์ ๋ํ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ํ๋ฆฝํ์ต๋๋ค. ์ด๋ฌํ ๋ฑ๋ก ๋ฐ ๋ ์ง์คํธ๋ฆฌ๋ HTTP/2์ ์ ์ฉ๋๋ฉฐ, ์ด ๋ฌธ์์์ ์ฌ์ ์๋์ง๋ ์์ต๋๋ค.
IANA๋ ๋ค์ ๋ ์ง์คํธ๋ฆฌ๋ค์์ RFC 7540์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ด ๋ฌธ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค: "TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs", "HTTP/2 Frame Type", "HTTP/2 Settings", "HTTP/2 Error Code", ๋ฐ "HTTP Method Registry". PRI ๋ฉ์๋์ ๋ฑ๋ก์ ์น์ 3.4๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธ๋์์ผ๋ฉฐ; ๋ค๋ฅธ ๋ชจ๋ ์น์ ๋ฒํธ๋ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค.
IANA๋ RFC 7540์์ ์คํ์ ์ฌ์ฉ(Experimental Use)์ผ๋ก ์์ฝ๋์๋ "HTTP/2 Frame Type" ๋ฐ "HTTP/2 Settings" ๋ ์ง์คํธ๋ฆฌ์ ํด๋น ๋ถ๋ถ์ ๋ํ ์ ์ฑ ์ ๋ณ๊ฒฝํ์ต๋๋ค. ์ด๋ค ๋ ์ง์คํธ๋ฆฌ ๋ถ๋ถ์ ๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋์ผํ ์ ์ฑ ์ผ๋ก ์ด์๋ฉ๋๋ค.
11.1. HTTP2-Settings ํค๋ ํ๋ ๋ฑ๋ก
์ด ์น์ ์ ์น์ 11.5์์ [RFC7540]์ ์ํด "Hypertext Transfer Protocol (HTTP) Field Name Registry"์ ๋ฑ๋ก๋ HTTP2-Settings ํค๋ ํ๋๋ฅผ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ผ๋ก ํ์ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ ๊ฑฐ๋์์ต๋๋ค: ์น์ 3.1์ ์ฐธ์กฐํ์ธ์. ๋ฑ๋ก์ RFC 9110 ์น์ 18.4์์ ์๊ตฌํ๋ ์ธ๋ถ์ฌํญ์ ํฌํจํ๋๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค:
- ํ๋ ์ด๋ฆ:
- HTTP2-Settings
- ์ํ:
- ์ฌ์ฉ ์ค๋จ๋จ
- ์ฐธ์กฐ:
- ์น์ 3.2.1 of [RFC7540]
- ์ฃผ์:
- ๋ ์ด์ ์ฌ์ฉ๋์ง ์์; ์ด ๋ฌธ์์ ์น์ 11.1์ ์ฐธ์กฐํ์ธ์.
11.2. h2c ์ ๊ทธ๋ ์ด๋ ํ ํฐ
์ด ์น์ ์ ์น์ 11.8์์ [RFC7540]์ ์ํด "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry"์ ๋ฑ๋ก๋ h2c ์ ๊ทธ๋ ์ด๋ ํ ํฐ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ผ๋ก ๊ธฐ๋กํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ ๊ฑฐ๋์์ต๋๋ค: ์น์ 3.1์ ์ฐธ์กฐํ์ธ์. ๋ฑ๋ก์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค:
- ๊ฐ:
- h2c
- ์ค๋ช :
- (๋ ์ด์ ์ฌ์ฉ๋์ง ์์) Hypertext Transfer Protocol version 2 (HTTP/2)
- ์์ ๋ฒ์ ํ ํฐ:
- ์์
- ์ฐธ์กฐ:
- ์น์ 3.1 of this document
12. ์ฐธ๊ณ ๋ฌธํ
12.1. ๊ท๋ฒ์ ์ฐธ์กฐ
- [CACHING]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., โHTTP Cachingโ, STD 98, RFC 9111, DOI 10.17487/RFC9111, June 2022, <https://www.rfc-editor.org/info/rfc9111>.
- [COMPRESSION]
- Peon, R. and H. Ruellan, โHPACK: Header Compression for HTTP/2โ, RFC 7541, DOI 10.17487/RFC7541, May 2015, <https://www.rfc-editor.org/info/rfc7541>.
- [COOKIE]
- Barth, A., โHTTP State Management Mechanismโ, RFC 6265, DOI 10.17487/RFC6265, April 2011, <https://www.rfc-editor.org/info/rfc6265>.
- [HTTP]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., โHTTP Semanticsโ, STD 97, RFC 9110, DOI 10.17487/RFC9110, June 2022, <https://www.rfc-editor.org/info/rfc9110>.
- [QUIC]
- Iyengar, J., Ed. and M. Thomson, Ed., โQUIC: A UDP-Based Multiplexed and Secure Transportโ, RFC 9000, DOI 10.17487/RFC9000, May 2021, <https://www.rfc-editor.org/info/rfc9000>.
- [RFC2119]
- Bradner, S., โKey words for use in RFCs to Indicate Requirement Levelsโ, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
- [RFC3986]
- Berners-Lee, T., Fielding, R., and L. Masinter, โUniform Resource Identifier (URI): Generic Syntaxโ, STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, <https://www.rfc-editor.org/info/rfc3986>.
- [RFC8174]
- Leiba, B., โAmbiguity of Uppercase vs Lowercase in RFC 2119 Key Wordsโ, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.
- [RFC8422]
- Nir, Y., Josefsson, S., and M. Pegourie-Gonnard, โElliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlierโ, RFC 8422, DOI 10.17487/RFC8422, August 2018, <https://www.rfc-editor.org/info/rfc8422>.
- [RFC8470]
- Thomson, M., Nottingham, M., and W. Tarreau, โUsing Early Data in HTTPโ, RFC 8470, DOI 10.17487/RFC8470, September 2018, <https://www.rfc-editor.org/info/rfc8470>.
- [TCP]
- Postel, J., โTransmission Control Protocolโ, STD 7, RFC 793, DOI 10.17487/RFC0793, September 1981, <https://www.rfc-editor.org/info/rfc793>.
- [TLS-ALPN]
- Friedl, S., Popov, A., Langley, A., and E. Stephan, โTransport Layer Security (TLS) Application-Layer Protocol Negotiation Extensionโ, RFC 7301, DOI 10.17487/RFC7301, July 2014, <https://www.rfc-editor.org/info/rfc7301>.
- [TLS-ECDHE]
- Rescorla, E., โTLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois Counter Mode (GCM)โ, RFC 5289, DOI 10.17487/RFC5289, August 2008, <https://www.rfc-editor.org/info/rfc5289>.
- [TLS-EXT]
- Eastlake 3rd, D., โTransport Layer Security (TLS) Extensions: Extension Definitionsโ, RFC 6066, DOI 10.17487/RFC6066, January 2011, <https://www.rfc-editor.org/info/rfc6066>.
- [TLS12]
- Dierks, T. and E. Rescorla, โThe Transport Layer Security (TLS) Protocol Version 1.2โ, RFC 5246, DOI 10.17487/RFC5246, August 2008, <https://www.rfc-editor.org/info/rfc5246>.
- [TLS13]
- Rescorla, E., โThe Transport Layer Security (TLS) Protocol Version 1.3โ, RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.
- [TLSBCP]
- Sheffer, Y., Holz, R., and P. Saint-Andre, โRecommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)โ, BCP 195, RFC 7525, DOI 10.17487/RFC7525, May 2015, <https://www.rfc-editor.org/info/rfc7525>.
12.2. ์ฐธ๊ณ ์๋ฃ
- [ALT-SVC]
- Nottingham, M., McManus, P., and J. Reschke, โHTTP Alternative Servicesโ, RFC 7838, DOI 10.17487/RFC7838, April 2016, <https://www.rfc-editor.org/info/rfc7838>.
- [BREACH]
- Gluck, Y., Harris, N., and A. Prado, โBREACH: Reviving the CRIME Attackโ, July 2013, <https://breachattack.com/resources/BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>.
- [DNS-TERMS]
- Hoffman, P., Sullivan, A., and K. Fujiwara, โDNS Terminologyโ, BCP 219, RFC 8499, DOI 10.17487/RFC8499, January 2019, <https://www.rfc-editor.org/info/rfc8499>.
- [HTTP-PRIORITY]
- Oku, K. and L. Pardue, โExtensible Prioritization Scheme for HTTPโ, RFC 9218, DOI 10.17487/RFC9218, June 2022, <https://www.rfc-editor.org/info/rfc9218>.
- [HTTP/1.1]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., โHTTP/1.1โ, STD 99, RFC 9112, DOI 10.17487/RFC9112, June 2022, <https://www.rfc-editor.org/info/rfc9112>.
- [NFLX-2019-002]
- Netflix, โHTTP/2 Denial of Service Advisoryโ, August 2019, <https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md>.
- [PRIVACY]
- Cooper, A., Tschofenig, H., Aboba, B., Peterson, J., Morris, J., Hansen, M., and R. Smith, โPrivacy Considerations for Internet Protocolsโ, RFC 6973, DOI 10.17487/RFC6973, July 2013, <https://www.rfc-editor.org/info/rfc6973>.
- [RFC1122]
- Braden, R., Ed., โRequirements for Internet Hosts - Communication Layersโ, STD 3, RFC 1122, DOI 10.17487/RFC1122, October 1989, <https://www.rfc-editor.org/info/rfc1122>.
- [RFC3749]
- Hollenbeck, S., โTransport Layer Security Protocol Compression Methodsโ, RFC 3749, DOI 10.17487/RFC3749, May 2004, <https://www.rfc-editor.org/info/rfc3749>.
- [RFC6125]
- Saint-Andre, P. and J. Hodges, โRepresentation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)โ, RFC 6125, DOI 10.17487/RFC6125, March 2011, <https://www.rfc-editor.org/info/rfc6125>.
- [RFC6585]
- Nottingham, M. and R. Fielding, โAdditional HTTP Status Codesโ, RFC 6585, DOI 10.17487/RFC6585, April 2012, <https://www.rfc-editor.org/info/rfc6585>.
- [RFC7323]
- Borman, D., Braden, B., Jacobson, V., and R. Scheffenegger, Ed., โTCP Extensions for High Performanceโ, RFC 7323, DOI 10.17487/RFC7323, September 2014, <https://www.rfc-editor.org/info/rfc7323>.
- [RFC7540]
- Belshe, M., Peon, R., and M. Thomson, Ed., โHypertext Transfer Protocol Version 2 (HTTP/2)โ, RFC 7540, DOI 10.17487/RFC7540, May 2015, <https://www.rfc-editor.org/info/rfc7540>.
- [RFC8441]
- McManus, P., โBootstrapping WebSockets with HTTP/2โ, RFC 8441, DOI 10.17487/RFC8441, September 2018, <https://www.rfc-editor.org/info/rfc8441>.
- [RFC8740]
- Benjamin, D., โUsing TLS 1.3 with HTTP/2โ, RFC 8740, DOI 10.17487/RFC8740, February 2020, <https://www.rfc-editor.org/info/rfc8740>.
- [TALKING]
- Huang, L., Chen, E., Barth, A., Rescorla, E., and C. Jackson, โTalking to Yourself for Fun and Profitโ, 2011, <https://www.adambarth.com/papers/2011/huang-chen-barth-rescorla-jackson.pdf>.
๋ถ๋ก A. ๊ธ์ง๋ TLS 1.2 Cipher Suites
HTTP/2 ๊ตฌํ์ MAY ๋ค์์ ์ํธ ๋ชจ์๋ค ์ค ์ด๋ ํ๋๊ฐ TLS 1.2๋ก ํ์๋๋ ๊ฒ์ ์ฐ๊ฒฐ ์ค๋ฅ(์น์ 5.4.1)์ ์ ํ INADEQUATE_SECURITY๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค:
- TLS_NULL_WITH_NULL_NULL
- TLS_RSA_WITH_NULL_MD5
- TLS_RSA_WITH_NULL_SHA
- TLS_RSA_EXPORT_WITH_RC4_40_MD5
- TLS_RSA_WITH_RC4_128_MD5
- TLS_RSA_WITH_RC4_128_SHA
- TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
- TLS_RSA_WITH_IDEA_CBC_SHA
- TLS_RSA_EXPORT_WITH_DES40_CBC_SHA
- TLS_RSA_WITH_DES_CBC_SHA
- TLS_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA
- TLS_DH_DSS_WITH_DES_CBC_SHA
- TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA
- TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA
- TLS_DH_RSA_WITH_DES_CBC_SHA
- TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
- TLS_DHE_DSS_WITH_DES_CBC_SHA
- TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
- TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
- TLS_DHE_RSA_WITH_DES_CBC_SHA
- TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_DH_anon_EXPORT_WITH_RC4_40_MD5
- TLS_DH_anon_WITH_RC4_128_MD5
- TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA
- TLS_DH_anon_WITH_DES_CBC_SHA
- TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
- TLS_KRB5_WITH_DES_CBC_SHA
- TLS_KRB5_WITH_3DES_EDE_CBC_SHA
- TLS_KRB5_WITH_RC4_128_SHA
- TLS_KRB5_WITH_IDEA_CBC_SHA
- TLS_KRB5_WITH_DES_CBC_MD5
- TLS_KRB5_WITH_3DES_EDE_CBC_MD5
- TLS_KRB5_WITH_RC4_128_MD5
- TLS_KRB5_WITH_IDEA_CBC_MD5
- TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
- TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA
- TLS_KRB5_EXPORT_WITH_RC4_40_SHA
- TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
- TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5
- TLS_KRB5_EXPORT_WITH_RC4_40_MD5
- TLS_PSK_WITH_NULL_SHA
- TLS_DHE_PSK_WITH_NULL_SHA
- TLS_RSA_PSK_WITH_NULL_SHA
- TLS_RSA_WITH_AES_128_CBC_SHA
- TLS_DH_DSS_WITH_AES_128_CBC_SHA
- TLS_DH_RSA_WITH_AES_128_CBC_SHA
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA
- TLS_DHE_RSA_WITH_AES_128_CBC_SHA
- TLS_DH_anon_WITH_AES_128_CBC_SHA
- TLS_RSA_WITH_AES_256_CBC_SHA
- TLS_DH_DSS_WITH_AES_256_CBC_SHA
- TLS_DH_RSA_WITH_AES_256_CBC_SHA
- TLS_DHE_DSS_WITH_AES_256_CBC_SHA
- TLS_DHE_RSA_WITH_AES_256_CBC_SHA
- TLS_DH_anon_WITH_AES_256_CBC_SHA
- TLS_RSA_WITH_NULL_SHA256
- TLS_RSA_WITH_AES_128_CBC_SHA256
- TLS_RSA_WITH_AES_256_CBC_SHA256
- TLS_DH_DSS_WITH_AES_128_CBC_SHA256
- TLS_DH_RSA_WITH_AES_128_CBC_SHA256
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
- TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
- TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA
- TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA
- TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA
- TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
- TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA
- TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_DH_DSS_WITH_AES_256_CBC_SHA256
- TLS_DH_RSA_WITH_AES_256_CBC_SHA256
- TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
- TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
- TLS_DH_anon_WITH_AES_128_CBC_SHA256
- TLS_DH_anon_WITH_AES_256_CBC_SHA256
- TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
- TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA
- TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA
- TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA
- TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
- TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA
- TLS_PSK_WITH_RC4_128_SHA
- TLS_PSK_WITH_3DES_EDE_CBC_SHA
- TLS_PSK_WITH_AES_128_CBC_SHA
- TLS_PSK_WITH_AES_256_CBC_SHA
- TLS_DHE_PSK_WITH_RC4_128_SHA
- TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
- TLS_DHE_PSK_WITH_AES_128_CBC_SHA
- TLS_DHE_PSK_WITH_AES_256_CBC_SHA
- TLS_RSA_PSK_WITH_RC4_128_SHA
- TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
- TLS_RSA_PSK_WITH_AES_128_CBC_SHA
- TLS_RSA_PSK_WITH_AES_256_CBC_SHA
- TLS_RSA_WITH_SEED_CBC_SHA
- TLS_DH_DSS_WITH_SEED_CBC_SHA
- TLS_DH_RSA_WITH_SEED_CBC_SHA
- TLS_DHE_DSS_WITH_SEED_CBC_SHA
- TLS_DHE_RSA_WITH_SEED_CBC_SHA
- TLS_DH_anon_WITH_SEED_CBC_SHA
- TLS_RSA_WITH_AES_128_GCM_SHA256
- TLS_RSA_WITH_AES_256_GCM_SHA384
- TLS_DH_RSA_WITH_AES_128_GCM_SHA256
- TLS_DH_RSA_WITH_AES_256_GCM_SHA384
- TLS_DH_DSS_WITH_AES_128_GCM_SHA256
- TLS_DH_DSS_WITH_AES_256_GCM_SHA384
- TLS_DH_anon_WITH_AES_128_GCM_SHA256
- TLS_DH_anon_WITH_AES_256_GCM_SHA384
- TLS_PSK_WITH_AES_128_GCM_SHA256
- TLS_PSK_WITH_AES_256_GCM_SHA384
- TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
- TLS_RSA_PSK_WITH_AES_256_GCM_SHA384
- TLS_PSK_WITH_AES_128_CBC_SHA256
- TLS_PSK_WITH_AES_256_CBC_SHA384
- TLS_PSK_WITH_NULL_SHA256
- TLS_PSK_WITH_NULL_SHA384
- TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
- TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
- TLS_DHE_PSK_WITH_NULL_SHA256
- TLS_DHE_PSK_WITH_NULL_SHA384
- TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
- TLS_RSA_PSK_WITH_AES_256_CBC_SHA384
- TLS_RSA_PSK_WITH_NULL_SHA256
- TLS_RSA_PSK_WITH_NULL_SHA384
- TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256
- TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256
- TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256
- TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
- TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256
- TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256
- TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256
- TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
- TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256
- TLS_EMPTY_RENEGOTIATION_INFO_SCSV
- TLS_ECDH_ECDSA_WITH_NULL_SHA
- TLS_ECDH_ECDSA_WITH_RC4_128_SHA
- TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
- TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_NULL_SHA
- TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
- TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDH_RSA_WITH_NULL_SHA
- TLS_ECDH_RSA_WITH_RC4_128_SHA
- TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
- TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_RSA_WITH_NULL_SHA
- TLS_ECDHE_RSA_WITH_RC4_128_SHA
- TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
- TLS_ECDH_anon_WITH_NULL_SHA
- TLS_ECDH_anon_WITH_RC4_128_SHA
- TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
- TLS_ECDH_anon_WITH_AES_128_CBC_SHA
- TLS_ECDH_anon_WITH_AES_256_CBC_SHA
- TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA
- TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA
- TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA
- TLS_SRP_SHA_WITH_AES_128_CBC_SHA
- TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA
- TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA
- TLS_SRP_SHA_WITH_AES_256_CBC_SHA
- TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA
- TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_PSK_WITH_RC4_128_SHA
- TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
- TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
- TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
- TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_PSK_WITH_NULL_SHA
- TLS_ECDHE_PSK_WITH_NULL_SHA256
- TLS_ECDHE_PSK_WITH_NULL_SHA384
- TLS_RSA_WITH_ARIA_128_CBC_SHA256
- TLS_RSA_WITH_ARIA_256_CBC_SHA384
- TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256
- TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384
- TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256
- TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384
- TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256
- TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384
- TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256
- TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384
- TLS_DH_anon_WITH_ARIA_128_CBC_SHA256
- TLS_DH_anon_WITH_ARIA_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384
- TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256
- TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384
- TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256
- TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384
- TLS_RSA_WITH_ARIA_128_GCM_SHA256
- TLS_RSA_WITH_ARIA_256_GCM_SHA384
- TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256
- TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384
- TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256
- TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384
- TLS_DH_anon_WITH_ARIA_128_GCM_SHA256
- TLS_DH_anon_WITH_ARIA_256_GCM_SHA384
- TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256
- TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384
- TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256
- TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384
- TLS_PSK_WITH_ARIA_128_CBC_SHA256
- TLS_PSK_WITH_ARIA_256_CBC_SHA384
- TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256
- TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384
- TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256
- TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384
- TLS_PSK_WITH_ARIA_128_GCM_SHA256
- TLS_PSK_WITH_ARIA_256_GCM_SHA384
- TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256
- TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384
- TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256
- TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
- TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384
- TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256
- TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384
- TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256
- TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384
- TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256
- TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384
- TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256
- TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384
- TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256
- TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384
- TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
- TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
- TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256
- TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384
- TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256
- TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384
- TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256
- TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384
- TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256
- TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384
- TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
- TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
- TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256
- TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384
- TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
- TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
- TLS_RSA_WITH_AES_128_CCM
- TLS_RSA_WITH_AES_256_CCM
- TLS_RSA_WITH_AES_128_CCM_8
- TLS_RSA_WITH_AES_256_CCM_8
- TLS_PSK_WITH_AES_128_CCM
- TLS_PSK_WITH_AES_256_CCM
- TLS_PSK_WITH_AES_128_CCM_8
- TLS_PSK_WITH_AES_256_CCM_8
์์ธํ ๋ด์ฉ์ ์น์ 9.2.2๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ถ๋ก B. RFC 7540๋ก๋ถํฐ์ ๋ณ๊ฒฝ ์ฌํญ
์ด ๊ฐ์ ํ์๋ ๋ค์๊ณผ ๊ฐ์ ์ค์ง์ ์ธ ๋ณ๊ฒฝ์ฌํญ์ด ํฌํจ๋์ด ์์ต๋๋ค:
- TLS 1.3์ ์ฌ์ฉ์ [RFC8740]์ ๋ฐ๋ผ ์ ์๋์์ผ๋ฉฐ, ์ด ๋ฌธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋์ฒดํฉ๋๋ค.
- RFC 7540์์ ์ ์ํ ์ฐ์ ์์(priority) ์ฒด๊ณ๋ ๋ ์ด์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. PRIORITY ํ๋ ์์ ํ์๊ณผ HEADERS ํ๋ ์์ ์ฐ์ ์์ ํ๋์ ๋ํ ์ ์๋ ์ ์ง๋์๊ณ , PRIORITY ํ๋ ์์ ์ก์์ ํ ์ ์๋ ์์ ์ ๋ํ ๊ท์น๋ ์ ์ง๋์์ง๋ง, ์ด๋ฌํ ํ๋์ ์๋ฏธ๋ก (semantics)์ RFC 7540์๋ง ๊ธฐ์ ๋์ด ์์ต๋๋ค. RFC 7540์ ์ฐ์ ์์ ์ ํธ ๋ฐฉ์์ ์ฑ๊ณต์ ์ด์ง ๋ชปํ์ต๋๋ค. ๋์ [HTTP-PRIORITY]์ ๋จ์ํ๋ ์ ํธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
- HTTP/1.1์ Upgrade ๋ฉ์ปค๋์ฆ์ ๊ถ๊ณ ๋์ง ์์ผ๋ฉฐ ์ด ๋ฌธ์์์ ๋ ์ด์ ๋ช ์ธ๋์ง ์์ต๋๋ค. ์ด๋ ๋๋ฆฌ ๋ฐฐํฌ๋์ง ์์๊ณ , ํ๋ฌธ HTTP/2 ์ฌ์ฉ์๋ ๋์ prior-knowledge ๊ตฌํ์ ์ฌ์ฉํ๋ ์ชฝ์ ์ ํํ์ต๋๋ค.
- ํ๋ ์ด๋ฆ๊ณผ ๊ฐ์ ๋ํ ๊ฒ์ฆ์ด ์ขํ์ก์ต๋๋ค. ์ค๊ฐ์(intermediaries)์ ๋ํด ํ์์ ์ธ ๊ฒ์ฆ์ด ์ ํํ๊ฒ ์ ์๋์๊ณ , ์์ฒญ์ ๋ํ ์ค๋ฅ ๋ณด๊ณ ๋ 400๋ฒ๋ ์ํ ์ฝ๋๋ฅผ ์ ์กํ๋๋ก ๊ถ์ฅ๋๋๋ก ์์ ๋์์ต๋๋ค.
- ์คํ์ฉ(Experimental Use)์ผ๋ก ์์ฝ๋์๋ ์ค์ ๋ฐ ํ๋ ์ ์ ํ์ ์ฝ๋ํฌ์ธํธ ๋ฒ์๊ฐ ์ด์ ์ผ๋ฐ ์ฌ์ฉ์ ์ํด ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค.
- ๊ธ์ง๋ ์ฐ๊ฒฐ ์ ์ฉ ํค๋ ํ๋(connection-specific header fields)๊ฐ ๋ณด๋ค ์ ํํ๊ณ ํฌ๊ด์ ์ผ๋ก ์๋ณ๋์์ต๋๋ค.
- Host์ ":authority"๊ฐ ์๋ก ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ์ค์ ๋ณ๊ฒฝ ์ดํ ๋์ ํ ์ด๋ธ ํฌ๊ธฐ ์ ๋ฐ์ดํธ(Dynamic Table Size Update) ์ง์๋ฅผ ์ ์กํ๋ ๊ท์น์ด ์น์ 4.3.1์์ ๋ช ํํด์ก์ต๋๋ค.
ํธ์ง์์ ๋ณ๊ฒฝ๋ ํฌํจ๋์ด ์์ต๋๋ค. ํนํ, ์ฉ์ด์ ๋ฌธ์ ๊ตฌ์กฐ์ ๋ณ๊ฒฝ์ ํต์ฌ HTTP ์๋ฏธ๋ก ([HTTP])์ ์ ๋ฐ์ดํธ์ ๋ํ ์๋ต์ผ๋ก ์ด๋ฃจ์ด์ก์ต๋๋ค. ์ด๋ค ๋ฌธ์๋ ์ด์ RFC 7540์์ ์ฒ์ ์ ์๋ ์ผ๋ถ ๊ฐ๋ ๋ค(์: 421 ์ํ ์ฝ๋ ๋๋ ์ฐ๊ฒฐ ๋ณํฉ(connection coalescing))์ ํฌํจํฉ๋๋ค.
๊ฐ์ฌ์ ๊ธ
์ด ๋ฌธ์์ ๋นํ๋ฒํ ๊ธฐ์ฌ๋ฅผ ํ ๋ง์ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌ๋ฅผ ํํฉ๋๋ค. [RFC7540]์๋ ๊ธฐ์ฌ์ ๋ชฉ๋ก์ด ๋ ๊ด๋ฒ์ํ๊ฒ ์๋ก๋์ด ์์ต๋๋ค.
๊ธฐ์ฌ์
Mike Belshe์ Roberto Peon์ด ์ด ๋ฌธ์์ ๊ธฐ๋ฐ์ด ๋ ํ ์คํธ๋ฅผ ์ ์ ํ์ต๋๋ค.