HTTP/2.0

HTTP/1.1의 λ©”μ‹œμ§€ 포맷은 κ΅¬ν˜„μ˜ λ‹¨μˆœμ„±κ³Ό 접근성에 μ΄ˆμ μ„ λ§žμΆ”μ–΄ μ„€κ³„λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ„±λŠ₯μƒμ˜ λ¬Έμ œκ°€ λ°œμƒν•˜κ²Œ 됐닀. 컀λ„₯μ…˜ ν•˜λ‚˜λ‹Ή ν•˜λ‚˜μ˜ μš”μ²­κ³Ό μ‘λ‹΅λ§Œ μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ—, μš”μ²­κ³Ό 응닡이 λ§Žμ•„μ§€λŠ” 경우 νšŒμ „ 지연(latency)κ°€ μ»€μ§€κ²Œ 됐고, 병렬 컀λ„₯μ…˜μ΄λ‚˜ νŒŒμ΄ν”„λΌμΈ 컀λ„₯μ…˜μ΄ λ„μž…λ˜μ—ˆμ§€λ§Œ 근본적 해결책은 λ˜μ§€ λͺ»ν–ˆλ‹€. λ•Œλ¬Έμ— νš¨μœ¨μ„± 츑면의 ν–₯상을 μœ„ν•΄ HTTP/2.0이 λ“±μž₯ν–ˆλ‹€.

κ°œμš”

  1. HTTP/2.0 μ—­μ‹œ TCP 컀λ„₯μ…˜ μœ„μ—μ„œ λ™μž‘

  2. μš”μ²­κ³Ό 응닡 방식

    • 길이가 μ •μ˜λœ ν•œ 개 μ΄μƒμ˜ ν”„λ ˆμž„μ— λ‹΄κΈ°λ©°, ν—€λ”λŠ” μ••μΆ•λ˜μ–΄ 전솑

    • μ΄λŸ¬ν•œ ν”„λ ˆμž„λ“€μ„ μŠ€νŠΈλ¦Όμ„ 톡해 전솑

    • ν•˜λ‚˜μ˜ μŠ€νŠΈλ¦Όμ€ ν•œ 쌍의 μš”μ²­κ³Ό 응닡을 처리

    • ν•˜λ‚˜μ˜ 컀λ„₯μ…˜ μœ„μ— μ—¬λŸ¬ 개의 슀트림이 λ™μ‹œμ— 생성 κ°€λŠ₯ν•˜μ—¬, μ—¬λŸ¬ 개의 μš”μ²­κ³Ό 응닡을 λ™μ‹œμ— 처리 κ°€λŠ₯(μš°μ„  μˆœμœ„ λΆ€μ—¬ κΈ°λŠ₯도 제곡)

  3. μ„œλ²„ ν‘Έμ‹œ κΈ°λŠ₯

    • ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ λ¦¬μ†ŒμŠ€ 외에도 μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보낼 수 μžˆλŠ” κΈ°λŠ₯

  4. HTTP/1.1 ν˜Έν™˜μ„±

    • κΈ°μ‘΄ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ“€κ³Ό ν˜Έν™˜μ„±μ„ μ΅œλŒ€ν•œ μœ μ§€ν•˜κΈ° μš”μ²­/응닡 λ©”μ‹œμ§€μ˜ 의미λ₯Ό μ΅œλŒ€ν•œ 같도둝 μœ μ§€

HTTP/1.1과의 차이점

ν”„λ ˆμž„

HTTP/2.0μ—μ„œ λͺ¨λ“  λ©”μ‹œμ§€λŠ” ν”„λ ˆμž„μ— 담겨 μ „μ†‘ν•˜λ©° κ΅¬μ‘°λŠ” μ•„λž˜μ™€ κ°™λ‹€.

+-----------------------------------------------+
| R |       Length(14)      | Type(8) | Flag(8) |
+---------------+-------------------------------+
|R|   Stream Identifier(31)                     |
+-----------------------------------------------+
| Stream Payload                                |
+-----------------------------------------------+
  • R: μ˜ˆμ•½λœ 2λΉ„νŠΈ ν•„λ“œ

    • κ°’μ˜ μ˜λ―Έκ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠμŒ

    • λ°˜λ“œμ‹œ 0으둜 μ„€μ •

    • λ°›λŠ” μͺ½μ—μ„œλŠ” 이 값을 λ¬΄μ‹œ

  • Length: ν”„λ ˆμž„ νŽ˜μ΄λ‘œλ“œμ˜ 길이λ₯Ό λ‚˜νƒ€λƒ„

    • 14λΉ„νŠΈ λ¬΄λΆ€ν˜Έ μ •μˆ˜(unsigned integer)둜 ν‘œν˜„

    • ν‘œν˜„λœ 길이에 ν”„λ ˆμž„ ν—€λ”λŠ” 미포함

  • Type: ν”„λ ˆμž„μ˜ μ’…λ₯˜

  • Flag: ν”„λ ˆμž„μ˜ νŠΉμ„±μ„ λ‚˜νƒ€λ‚΄λŠ” 8λΉ„νŠΈ ν•„λ“œ

    • 각 ν”„λ ˆμž„λ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” ν”Œλž˜κ·Έμ˜ μ’…λ₯˜κ°€ 닀름

  • R: μ˜ˆμ•½λœ 1λΉ„νŠΈ ν•„λ“œ

    • 첫 번째 Rκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ κ°’μ˜ μ˜λ―Έκ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠμŒ

    • λ°˜λ“œμ‹œ 0으둜 μ„€μ •

    • λ°›λŠ” μͺ½μ—μ„œλŠ” 이 값을 λ¬΄μ‹œ

  • Stream Identifier: 31λΉ„νŠΈ 슀트림 μ‹λ³„μž

    • 0은 νŠΉλ³„ν•˜κ²Œ 컀λ„₯μ…˜ 전체와 μ—°κ΄€λœ ν”„λ ˆμž„μ„ 의미

μœ„ ν”„λ ˆμž„μ„ μ•„λž˜ 총 10κ°€μ§€λ‘œ μ •μ˜ν•˜κ³  있으며, νŽ˜μ΄λ‘œλ“œμ˜ ν˜•μ‹μ΄λ‚˜ λ‚΄μš©μ€ ν”„λ ˆμž„μ˜ μ’…λ₯˜μ— 따라 달라진닀. (DATA, HEADERS, PRIORITY, RST_STREAM, SETTINGS, PUSH_PROMISE, PING, GOAWAY, WINDOW_UPDATE, CONTINUATION)

슀트림과 λ©€ν‹°ν”Œλ ‰μ‹±

μŠ€νŠΈλ¦Όμ΄λž€ ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ„ 톡해 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ—μ„œ κ΅ν™˜λ˜λŠ” ν”„λ ˆμž„λ“€μ˜ λ…λ¦½λœ μ–‘λ°©ν–₯ μ‹œν€€μŠ€λ‘œ, ν•œ 쌍의 μš”μ²­κ³Ό 응닡은 ν•˜λ‚˜μ˜ μŠ€νŠΈλ¦Όμ„ 톡해 μ΄λ£¨μ–΄μ§€κ²Œλœλ‹€. μŠ€νŠΈλ¦Όμ„ ν†΅ν•œ 톡신은 μ•„λž˜μ™€ 같이 μ§„ν–‰λœλ‹€.

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ μŠ€νŠΈλ¦Όμ„ 생성

  2. ν•΄λ‹Ή μŠ€νŠΈλ¦Όμ„ 톡해 HTTP μš”μ²­ 전솑

  3. μš”μ²­μ„ 받은 μ„œλ²„κ°€ 같은 μŠ€νŠΈλ¦Όμ„ 톡해 HTTP 응닡 전솑

  4. 슀트림 λ‹«νž˜

HTTP/1.1μ—μ„œλŠ” ν•œ TCP 컀λ„₯μ…˜μ„ 톡해 μš”μ²­μ„ λ³΄λƒˆμ„ λ•Œ 응닡이 도착해야 같은 TCP 컀λ„₯μ…˜μœΌλ‘œ λ‹€μŒ μš”μ²­μ„ 보낼 수 μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ HTTP/2.0μ—μ„œλŠ” ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ— μ—¬λŸ¬ 개의 슀트림이 λ™μ‹œμ— 열릴 수 있기 λ•Œλ¬Έμ—, ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μœΌλ‘œ μ—¬λŸ¬ 개의 μš”μ²­κ³Ό 응닡을 λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ‹€. μΆ”κ°€μ μœΌλ‘œ 슀트림 사이에 μš°μ„  μˆœμœ„λ₯Ό λΆ€μ—¬ν•  수 있기 λ•Œλ¬Έμ—, μ€‘μš”ν•œ μš”μ²­μ— 더 높은 μš°μ„  μˆœμœ„λ₯Ό λΆ€μ—¬ν•˜μ—¬ 더 λΉ λ₯΄κ²Œ 응닡을 받을 수 μžˆλ‹€.

헀더 μ••μΆ•

HTTP/1.1μ—μ„œλŠ” 헀더λ₯Ό μ••μΆ• 없이 λ³΄λƒˆμœΌλ‚˜, HTTP/2.0μ—μ„œλŠ” 헀더λ₯Ό μ••μΆ•ν•˜μ—¬ μ „μ†‘ν•œλ‹€. ν˜„λŒ€ μ›ΉνŽ˜μ΄μ§€μ—μ„œλŠ” ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 개의 λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜κ²Œ λ˜λŠ”λ°, 이 λ•Œ 헀더λ₯Ό μ••μΆ•ν•˜μ§€ μ•ŠμœΌλ©΄ λ§Žμ€ μ–‘μ˜ 데이터가 μ „μ†‘λ˜κ²Œ λœλ‹€.

λ³΄μ•ˆ 이슈

μ€‘κ°œμž μΊ‘μŠν™” 곡격(Intermediary Encapsulation Attack)

HTTP/2.0 λ©”μ‹œμ§€λ₯Ό 쀑간에 ν”„λ½μ‹œ(μ€‘κ°œμž)κ°€ HTTP/1.1 λ©”μ‹œμ§€λ‘œ λ³€ν™˜ν•  λ•Œ λ©”μ‹œμ§€μ˜ μ˜λ―Έκ°€ λ³€μ§ˆλœ κ°€λŠ₯성이 μžˆλ‹€. HTTP/2.0은 헀더 ν•„λ“œμ˜ 이름과 값을 λ°”μ΄λ„ˆλ¦¬λ‘œ μΈμ½”λ”©ν•˜κ²Œ λ˜λŠ”λ°, μ΄λŠ” HTTP/2.0 헀더 ν•„λ“œλ‘œ μ–΄λ–€ λ¬Έμžμ—΄μ΄λ“  λ“€μ–΄μ˜¬ 수 있게 λ˜μ–΄ λΆˆλ²•μ μ΄κ±°λ‚˜ μœ„μ‘°λœ HTTP/1.1 λ©”μ‹œμ§€λ‘œ λ²ˆμ—­λ  κ°€λŠ₯성이 μžˆλ‹€. λ°˜λŒ€λ‘œ HTTP/1.1 λ©”μ‹œμ§€λ₯Ό HTTP/2.0 λ©”μ‹œμ§€λ‘œ λ³€ν™˜ν•  λ•ŒλŠ” ν•΄λ‹Ή λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

κΈ΄ 컀λ„₯μ…˜ μœ μ§€λ‘œ μΈν•œ κ°œμΈμ •λ³΄ λˆ„μΆœ

λ‹¨μˆœνžˆ HTTP/2.0을 μ‚¬μš©ν•˜κ²Œ 되면, 컀λ„₯μ…˜μ„ 였래 μœ μ§€ν•˜κ²Œ λ˜μ–΄ κ°œμΈμ •λ³΄ λˆ„μΆœμ˜ μœ„ν—˜μ΄ μžˆλ‹€.

참고자료

Last updated