10. HTTP/2.0

이 책은 8번째 μ΄ˆμ•ˆμ„ 기반으둜 μž‘μ„±λ˜μ—ˆμŒ

λ“±μž₯ λ°°κ²½

http/1.1 : κ΅¬ν˜„μ˜ λ‹¨μˆœμ„±κ³Ό μ ‘κ·Όμ„± μœ„μ£Ό

문제 : νšŒμ „ μ§€μ—°

응닡을 λ°›μ•„μ•Όλ§Œ μš”μ²­μ„ 보낼 수 있음

(우회적인) ν•΄κ²° 방법

  • 병렬 컀λ„₯μ…˜

  • νŒŒμ΄ν”„λΌμΈ 컀λ„₯μ…˜

λŒ€μ•ˆ : μƒˆλ‘œμš΄ ν”„λ‘œν† μ½œ

WAKA

Microsoft S+M (Speed + Mobility)

SPDY (2.0의 기반)

SPDY의 νŠΉμ§•

  • 헀더 μ••μΆ• β†’ λŒ€μ—­ν­ μ ˆμ•½

  • 1 TCP 닀쀑 컀λ„₯μ…˜ (νšŒμ „μ§€μ—° μ€„μž„)

  • μ„œλ²„ ν‘Έμ‹œ

SPDY에 κΈ°λ°˜ν•œ HTTP 2.0

ν”„λ ˆμž„

λͺ¨λ“  λ©”μ‹œμ§€λ₯Ό λ‹΄λŠ” μˆ˜λ‹¨.

μš”μ²­ λ˜λŠ” 응닡이 담겨 있음.

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

  • 데이터 (DATA)

  • 헀더 (HEADERS)

  • μš°μ„ μˆœμœ„ (PRIORITY)

  • 슀트림 리셋 (RST_STREAM)

  • SETTINGS, PUSH_PROMISE, ... λ“± 총 10κ°€μ§€

슀트림

ν•œ 쌍의 HTTP μš”μ²­κ³Ό 응닡을 μ²˜λ¦¬ν•˜λŠ” λ‹¨μœ„.

  • ν”„λ ˆμž„λ“€μ˜ λ…λ¦½λœ μ–‘λ°©ν–₯ μ‹œν€ΈμŠ€.

  • ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ— μ—¬λŸ¬ 개의 슀트림이 μžˆμ„ 수 μžˆμœΌλ―€λ‘œ μ—¬λŸ¬ 개의 TCP 컀λ„₯μ…˜μ„ λ§Œλ“œλŠ” 효과.

  • μ—¬λŸ¬ μš”μ²­μ΄ λ™μ‹œμ— λ³΄λ‚΄μ§ˆ 수 있고 μš°μ„ μˆœμœ„λ„ κ°€μ§ˆ 수 μžˆλ‹€.

  • μ—¬λŸ¬ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ λΈ”λ‘λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ νλ¦„μ œμ–΄ 기법을 μ‚¬μš©.

슀트림 μ‹λ³„μž

ν•œ TCP 컀λ„₯μ…˜μ—μ„œ μŠ€νŠΈλ¦Όμ„ μ‹λ³„ν•˜λŠ” 31λΉ„νŠΈ ν•„λ“œ

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ λ§Œλ“€λ©΄ : ν™€μˆ˜

  • μ„œλ²„κ°€ λ§Œλ“€λ©΄ : 짝수

  • 슀트림 μ‹λ³„μžλŠ” 점점 μ¦κ°€ν•΄μ•Όλ§Œ ν•œλ‹€.

    • κ·œμΉ™μ„ μ–΄κΈ°λ©΄ PROTOCOL_ERROR (컀λ„₯μ…˜ μ—λŸ¬)

  • μ‹λ³„μžλŠ” μ„œλ²„μ™€ 클라가 ν˜‘μƒ 없이 λ…λ¦½μ μœΌλ‘œ λ§Œλ“¦

  • ν•œ 번 μ‚¬μš©ν•œ μ‹λ³„μž μž¬μ‚¬μš© λΆˆκ°€

  • μ‹λ³„μžκ°€ 고갈되면 λ‹€μ‹œ 컀λ„₯μ…˜ 맺음

헀더 μ••μΆ•

HPACK λͺ…세에 따라 μ••μΆ•ν•œ λ’€ 청크둜 전솑

λ°›λŠ” μͺ½μ—μ„œλŠ” 항상 압좕을 ν’€μ–΄μ•Όλ§Œ ν•œλ‹€.

μ••μΆ• μ½˜ν…μŠ€νŠΈ

HPACK은 압좕을 ν•˜κ³ , ν•΄μ œν•  λ•Œ μ••μΆ• μ½˜ν…μŠ€νŠΈλΌλŠ” 것이 λ³€κ²½ 됨.

  • 각 ν”Όμ–΄μ—μ„œ 압좕을 ν•΄μ œν•œλ‹€κ³  κΈ°λŒ€ν•˜κ³  있음.

  • κ·ΈλŸ¬λ―€λ‘œ 헀더λ₯Ό μ“°μ§€ μ•Šκ³  버린닀고 ν•˜λ”λΌλ„ 무쑰건 압좕을 ν•΄μ œν•΄μ•Ό 함.

  • 그럴 수 μ—†λ‹€λ©΄ COMPRESSION_ERROR (컀λ„₯μ…˜ μ—λŸ¬, μ’…λ£Œ)

μ„œλ²„ ν‘Έμ‹œ

μ–΄λ–€ HTML νŒŒμΌμ„ μš”μ²­ν•  λ•Œ μ„œλ²„μ—μ„œ 이 파일이 λ§ν¬ν•˜κ³  μžˆλŠ” CSS, JS, 이미지 등을 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μš”μ²­ν•˜κΈ° 전에 같이 λ°˜ν™˜ 해쀄 수 있음.

PUSH_PROMISE

μ„œλ²„ ν‘Έμ‹œλ₯Ό μ›ν•˜κ³ μž ν•  λ•Œ 클라의 원 μš”μ²­μ„ μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μŠ€νŠΈλ¦Όμ— μ „μ†‘ν•˜λŠ” ν”„λ ˆμž„

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„ ν‘Έμ‹œν•˜κ³ μž ν•˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜κΈ° 전에 미리 보내야 함

  • 이 ν”„λ ˆμž„μ„ λ°›μœΌλ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” ν•΄λ‹Ή μŠ€νŠΈλ¦Όμ„ μ˜ˆμ•½λ¨ μƒνƒœλ‘œ λ§Œλ“¦.

  • ν•΄λ‹Ή 슀트림이 λ‹«νžˆκΈ° μ „κΉŒμ§€ μ„œλ²„ν‘Έμ‹œ λŒ€μƒμΈ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜λ©΄ μ•ˆ 됨.

RST_STREAM

PUSH_PROMISE ν”„λ ˆμž„μ„ 받은 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„ ν‘Έμ‹œλ₯Ό μ›μΉ˜ μ•Šμ„ λ•Œ λ³΄λ‚΄λŠ” ν”„λ ˆμž„

  • λ°”λ‘œ PUSH_PROMISE ν”„λ ˆμž„μœΌλ‘œ λΆ€ν„° μ˜ˆμ•½λœ 슀트림이 λ‹«νžˆκ²Œ 됨.

주의점

  • μ€‘κ°„μ˜ ν”„λ‘μ‹œκ°€ μ„œλ²„ ν‘Έμ‹œμ˜ μ˜λ„μ™€λŠ” λ³„κ°œλ‘œ μ›μΉ˜ μ•ŠλŠ” 전솑 / μ›μΉ˜ μ•ŠλŠ” 미전솑이 μ΄λ£¨μ–΄μ§ˆ 수 있음

  • μ•ˆμ „ν•˜κ³  μΊμ‹œ κ°€λŠ₯ν•˜κ³  본문을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” μš”μ²­μ— λŒ€ν•΄μ„œλ§Œ ν‘Έμ‹œ κ°€λŠ₯

  • ν‘Έμ‹œν•  λ¦¬μ†ŒμŠ€λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λͺ…μ‹œμ μœΌλ‘œ 보낸 것과 연관이 μžˆμ–΄μ•Όλ§Œ 함

  • ν΄λΌλŠ” μ„œλ²„κ°€ ν‘Έμ‹œν•œ λ¦¬μ†ŒμŠ€λ₯Ό CORS에 따라 검사해야 함. = λ‹€λ₯Έ origin μ—μ„œ 온 λ¦¬μ†ŒμŠ€λŠ” κ±°λΆ€ν•΄μ•Ό 함.

  • μ„œλ²„ ν‘Έμ‹œλ₯Ό 끄고 μ‹Άλ‹€λ©΄ SETTING_ENABLE_PUSH = 0 으둜 μ„€μ •

μ•Œλ €μ§„ λ³΄μ•ˆ 이슈

μ€‘κ°œμž μΊ‘μŠν™” 곡격

Intermediary Encapsulation Attacks

2.0 λ©”μ‹œμ§€λ₯Ό ν”„λ‘μ‹œκ°€ 1.1 λ©”μ‹œμ§€λ‘œ λ³€ν™˜ν•  λ•Œ 의미 λ³€μ§ˆ κ°€λŠ₯성이 μžˆλ‹€.

  • 2.0 λ©”μ‹œμ§€λŠ” 헀더 ν•„λ“œμ˜ 이름과 값을 λ°”μ΄λ„ˆλ¦¬λ‘œ 인코딩

    • 이둜써 μ–΄λ–€ λ¬Έμžμ—΄μ΄λ“  헀더 ν•„λ“œλ‘œ μž‘μ„±ν•  수 μžˆλ‹€

    • 정상적인 2.0 μš”μ²­/응닡을 λΆˆλ²•μ μΈ 1.1 λ©”μ‹œμ§€λ‘œ λ²ˆμ—­λ˜κ²Œ ν•  수 있음

    • κ·ΈλŸ¬λ‚˜ λ°˜λŒ€λ‘œ 1.1λ©”μ‹œμ§€λŠ” 이λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λΆˆκ°€λŠ₯

κΈ΄ 컀λ„₯μ…˜ μœ μ§€ = κ°œμΈμ •λ³΄ λˆ„μΆœ 우렀

일반적으둜, ν•œ 컀λ„₯μ…˜μ΄ 슀트림 μ‹λ³„μžκ°€ κ³ κ°ˆλ˜κ±°λ‚˜ ν•œ μͺ½μ—μ„œ κ°•μ œλ‘œ 끊기 μ „μ—λŠ” 계속 μœ μ§€λ¨.

RTT κ°€ μ€„μ–΄λ“œλŠ” λŒ€μ‹  짧은 컀λ„₯μ…˜μ΄ μ•„λ‹Œ 경우 (길게 계속 μœ μ§€λ˜λŠ” 경우) λ³΄μ•ˆ λ¬Έμ œκ°€ λ°œμƒν•  수 있음

  • 같은 λΈŒλΌμš°μ € λ‚΄μ—μ„œ, 이전 μ‚¬μš©μžκ°€ 무엇을 ν–ˆλŠ”μ§€ μ•Œμ•„λ‚Ό μˆ˜λ„ 있음.

Last updated