WebTransport API์ ๋ํ ์ฌ์ธต ๋ถ์์ผ๋ก, ํฅ์๋ ์น ํต์ ์ ์ํ ๊ธฐ๋ฅ, ์ด์ ๋ฐ ์ปค์คํ ํ๋กํ ์ฝ์ ์ค์ ๊ตฌํ ๋ฐฉ๋ฒ์ ํ์ํฉ๋๋ค.
WebTransport API: ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ปค์คํ ํ๋กํ ์ฝ ๊ตฌํ
WebTransport API๋ ์น ํต์ ์ ์ค์ํ ๋ฐ์ ์ ์๋ฏธํ๋ฉฐ, ์ค์๊ฐ ๋ฐ ์๋ฐฉํฅ ๋ฐ์ดํฐ ์ ์ก์ ์ํด ๊ธฐ์กด์ ์น์์ผ(WebSockets) ๋ฐ HTTP/1.1/2์ ๋ํ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋์์ ์ ๊ณตํฉ๋๋ค. QUIC ํ๋กํ ์ฝ(HTTP/3์ ๊ธฐ๋ฐ) ์์ ๊ตฌ์ถ๋ WebTransport๋ ๋ฎ์ ์ง์ฐ ์๊ฐ, ์ ๋ขฐ์ฑ ๋ฐ ๋น์ ๋ขฐ์ฑ ๋ฐ์ดํฐ ์ฑ๋์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ํฅ์๋ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ ๊ตํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ด ๊ธ์์๋ WebTransport์ ํต์ฌ ๊ฐ๋ , ์ด์ ๋ฐ ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌํํ์ฌ ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ด ๋๋ค.
WebTransport๋ ๋ฌด์์ธ๊ฐ?
WebTransport๋ ์น ๋ธ๋ผ์ฐ์ (๋๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ)์ ์๋ฒ ๊ฐ์ ์๋ฐฉํฅ, ๋ค์คํ, ๊ทธ๋ฆฌ๊ณ ์ ํ์ ์ผ๋ก ๋น์ ๋ขฐ์ฑ ๋ฐ์ดํฐ ์ ์ก์ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ์น API์ ๋๋ค. ๋จ์ผ TCP ์ฐ๊ฒฐ์ ์ค์ ํ๋ ์น์์ผ๊ณผ ๋ฌ๋ฆฌ, WebTransport๋ QUIC ํ๋กํ ์ฝ์ ํ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๋ค์คํ(Multiplexing): QUIC๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ด์์ ์ฌ๋ฌ ๋ ๋ฆฝ์ ์ธ ์คํธ๋ฆผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ฌ HOL(Head-of-Line) ๋ธ๋กํน์ ์ค์ด๊ณ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ด๋ฅผ ํตํด ์ํธ ์์กด์ฑ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ก์์ ํ ์ ์์ต๋๋ค.
- ์ ๋ขฐ์ฑ ๋ฐ ๋น์ ๋ขฐ์ฑ ์ ์ก: WebTransport๋ ์ ๋ขฐ์ฑ ์๋(์์ ๋ณด์ฅ, ์ ๋ฌ ๋ณด์ฅ) ์ฑ๋๊ณผ ๋น์ ๋ขฐ์ฑ(์์ ๋ฏธ๋ณด์ฅ, ์ต์ ๋ ธ๋ ฅ ์ ๋ฌ) ์ฑ๋์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค. ๋น์ ๋ขฐ์ฑ ์ ์ก์ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ๋๊ฐ๋ก ๊ฐ๋ ๋ฐ์ํ๋ ํจํท ์์ค์ด ํ์ฉ๋๋ ๊ฒ์ ์คํธ๋ฆฌ๋ฐ์ด๋ ํ์ ํ์์ ๊ฐ์ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ ์ฉํฉ๋๋ค.
- ํฅ์๋ ๋ณด์: QUIC๋ ๊ฐ๋ ฅํ ์ํธํ๋ฅผ ์ ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- HTTP/3 ํตํฉ: WebTransport๋ HTTP/3์ ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋์ด ๋์ผํ ๊ธฐ๋ณธ ์ ์ก ํ๋กํ ์ฝ์ ๊ณต์ ํ๋ฏ๋ก ๊ธฐ์กด ์น ์ธํ๋ผ์์ ์ํํ ํตํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ง์ฐ ์๊ฐ ๊ฐ์: QUIC์ ์ฐ๊ฒฐ ์ค์ ๋ฐ ํผ์ก ์ ์ด ๋ฉ์ปค๋์ฆ์ TCP ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ ๋นํด ๋ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ๊ธฐ์ฌํฉ๋๋ค.
WebTransport ์ฌ์ฉ์ ์ด์
WebTransport๋ ๊ธฐ์กด ์น ํต์ ๊ธฐ์ ์ ๋นํด ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ ์ด์ ์ ์ ๊ณตํ์ฌ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ์ ํ์ด ๋ฉ๋๋ค:
- ํฅ์๋ ์ค์๊ฐ ํต์ : ๋ฎ์ ์ง์ฐ ์๊ฐ, ๋ค์คํ, ๋น์ ๋ขฐ์ฑ ์ ์ก์ ์กฐํฉ์ WebTransport๋ฅผ ์จ๋ผ์ธ ๊ฒ์, ๋ํํ ์๋ฎฌ๋ ์ด์ , ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ๊ณผ ๊ฐ์ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ผ๋ก ๋ง๋ญ๋๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋ฌธ์๋ฅผ ํธ์งํ ์ ์๋ ํ์ ๋์์ธ ๋๊ตฌ๋ฅผ ์์ํด ๋ณด์ญ์์ค. WebTransport์ ๋ฎ์ ์ง์ฐ ์๊ฐ ๋๋ถ์ ํธ์ง ๋ด์ฉ์ด ๊ฑฐ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
- ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ํฅ์: ๊ธ์ต ๊ฑฐ๋ ํ๋ซํผ์ด๋ ๊ณผํ ๋ฐ์ดํฐ ์๊ฐํ ๋๊ตฌ์ ๊ฐ์ด ๋น๋ฒํ ๋ฐ์ดํฐ ์ ์ก์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ WebTransport์ ๋ค์คํ ๋ฐ ํจ์จ์ ์ธ ํผ์ก ์ ์ด๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ฑฐ๋ ํ๋ซํผ์ด ์ค์๊ฐ ์์ฅ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. WebTransport์ ์ฌ๋ฌ ์คํธ๋ฆผ์ ๋์์ ์ฒ๋ฆฌํ๋ ๋ฅ๋ ฅ์ ํ๋ซํผ์ด ๋จ์ผ ์ฐ๊ฒฐ์ ์ํด ๋ณ๋ชฉ ํ์์ ๊ฒช์ง ์๊ณ ๋ค์ํ ์์ค๋ก๋ถํฐ์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์ปค์คํ ํ๋กํ ์ฝ์ ์ ์ฐ์ฑ: WebTransport๋ ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ณธ QUIC ์ ์ก ์์ ์์ ๋ง์ ์ปค์คํ ํ๋กํ ์ฝ์ ์ ์ํ๊ณ ๊ตฌํํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ํต์ ์ ์กฐ์ ํ ์ ์๋ ํ์ํ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ ํ์ฌ๋ ๋ฏผ๊ฐํ ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํ ๋ ์ ํ๋กํ ์ฝ์ ๋ง๋ค์ด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ธฐ๋ฐ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ๊ธฐ์กด ์น ์ธํ๋ผ์์ ์ํํ ํตํฉ: WebTransport๋ HTTP/3 ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์น ์๋ฒ ๋ฐ ์ธํ๋ผ์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค. ์ด๋ ๋ฐฐํฌ๋ฅผ ๋จ์ํํ๊ณ ์๋นํ ์ธํ๋ผ ๋ณ๊ฒฝ์ ํ์์ฑ์ ์ค์ฌ์ค๋๋ค.
- ๋ฏธ๋ ๋๋น: HTTP/3๊ฐ ๋์ฑ ๋๋ฆฌ ์ฑํ๋จ์ ๋ฐ๋ผ WebTransport๋ ์ค์๊ฐ ๋ฐ ์๋ฐฉํฅ ์น ํต์ ์ ์ํ ์ง๋ฐฐ์ ์ธ ๊ธฐ์ ์ด ๋ ๊ฒ์ ๋๋ค. ์ง๊ธ WebTransport๋ฅผ ์ฑํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฏธ๋์ ์ฑ๊ณต์ ์ํด ์ ๋ฆฌํ ์์น๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
ํต์ฌ ๊ฐ๋ ์ดํดํ๊ธฐ
WebTransport๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ํต์ฌ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- WebTransportSession: ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋จ์ผ WebTransport ์ฐ๊ฒฐ์ ๋ํ๋ ๋๋ค. ๋ชจ๋ WebTransport ํต์ ์ ์ง์ ์ ์ ๋๋ค.
- ReadableStream ๋ฐ WritableStream: WebTransport๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Streams API๋ฅผ ์ฌ์ฉํฉ๋๋ค. ReadableStream์ ๋ฐ์ดํฐ ์์ ์ ์ฌ์ฉ๋๊ณ WritableStream์ ๋ฐ์ดํฐ ์ก์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํจ์จ์ ์ด๊ณ ๋น๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋จ๋ฐฉํฅ ์คํธ๋ฆผ(Unidirectional Streams): ํ ๋ฐฉํฅ์ผ๋ก๋ง(ํด๋ผ์ด์ธํธ์์ ์๋ฒ ๋๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก) ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์คํธ๋ฆผ์ ๋๋ค. ๊ฐ๋ณ ๋ฉ์์ง๋ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ณด๋ด๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- ์๋ฐฉํฅ ์คํธ๋ฆผ(Bidirectional Streams): ์๋ฐฉํฅ์ผ๋ก ๋์์ ๋ฐ์ดํฐ๊ฐ ํ๋ฅผ ์ ์๋ ์คํธ๋ฆผ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์์ผ ํ๋ ๋ํํ ํต์ ์ ์ด์์ ์ ๋๋ค.
- ๋ฐ์ดํฐ๊ทธ๋จ(Datagrams): QUIC ์ฐ๊ฒฐ์ ํตํด ์ง์ ์ ์ก๋๋ ๋น์ ๋ขฐ์ฑ, ๋น์์ ๋ฉ์์ง์ ๋๋ค. ๊ฐ๋ ํจํท ์์ค์ด ํ์ฉ๋๋ ์ค์๊ฐ ๋ฐ์ดํฐ์ ์ ์ฉํฉ๋๋ค.
WebTransport๋ก ์ปค์คํ ํ๋กํ ์ฝ ๊ตฌํํ๊ธฐ
WebTransport์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ ๊ทธ ์์ ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌํํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ํต์ ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ๋ค์์ ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๋จ๊ณ๋ณ ๊ฐ์ด๋์ ๋๋ค:
1. ํ๋กํ ์ฝ ์ ์ํ๊ธฐ
์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌ์กฐ์ ์๋ฏธ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๋ฉ์์ง ํ์: ๋ฉ์์ง๋ ์ด๋ป๊ฒ ์ธ์ฝ๋ฉ๋ ๊น์? ์ผ๋ฐ์ ์ธ ์ต์ ์๋ JSON, ํ๋กํ ์ฝ ๋ฒํผ(Protocol Buffers) ๋๋ ์ปค์คํ ๋ฐ์ด๋๋ฆฌ ํ์์ด ์์ต๋๋ค. ํจ์จ์ ์ด๊ณ ๊ตฌ๋ฌธ ๋ถ์์ด ์ฌ์ฐ๋ฉฐ ์ ์กํ๋ ๋ฐ์ดํฐ ์ ํ์ ์ ํฉํ ํ์์ ์ ํํ์ญ์์ค.
- ๋ฉ์์ง ์ ํ: ์ด๋ค ์ ํ์ ๋ฉ์์ง๊ฐ ๊ตํ๋ ๊น์? ๊ฐ ๋ฉ์์ง ์ ํ์ ๋ชฉ์ ๊ณผ ๊ตฌ์กฐ๋ฅผ ์ ์ํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ธ์ฆ, ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ, ์ ์ด ๋ช ๋ น ๋ฐ ์ค๋ฅ ์๋ฆผ์ ์ํ ๋ฉ์์ง๊ฐ ์์ ์ ์์ต๋๋ค.
- ์ํ ๊ด๋ฆฌ: ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์ด๋ป๊ฒ ์ํ๋ฅผ ์ ์งํ ๊น์? ํต์ ์ค์ ์ํ ์ ๋ณด๊ฐ ์ด๋ป๊ฒ ์ถ์ ๋๊ณ ์ ๋ฐ์ดํธ๋ ์ง ๊ฒฐ์ ํ์ญ์์ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ค๋ฅ๋ ์ด๋ป๊ฒ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ ๊น์? ์ค๋ฅ ์ฝ๋๋ฅผ ์ ์ํ๊ณ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๊ณ ๋ณต๊ตฌํ๋ ๋ฉ์ปค๋์ฆ์ ์ ์ํ์ญ์์ค.
์์ : ์ค์๊ฐ ์ฝ๋ ํธ์ง ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง ์ ํ์ ์ ์ํ ์ ์์ต๋๋ค:
- `AUTH`: ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ(๋๋ ํ ํฐ)๋ฅผ ํฌํจํฉ๋๋ค.
- `EDIT`: ์ฝ๋ ํธ์ง์ ๋ํ๋ ๋๋ค. ์ค ๋ฒํธ, ์์ ์์น, ์ฝ์ ๋๋ ์ญ์ ํ ํ ์คํธ๋ฅผ ํฌํจํฉ๋๋ค.
- `CURSOR`: ์ฌ์ฉ์์ ์ปค์ ์์น๋ฅผ ๋ํ๋ ๋๋ค. ์ค ๋ฒํธ์ ์ด ๋ฒํธ๋ฅผ ํฌํจํฉ๋๋ค.
- `SYNC`: ์ ์ฌ์ฉ์๊ฐ ์ฐธ์ฌํ ๋ ๋ฌธ์์ ์ํ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ฒด ๋ฌธ์ ๋ด์ฉ์ ํฌํจํฉ๋๋ค.
2. ์ง๋ ฌํ ํ์ ์ ํํ๊ธฐ
๋ฉ์์ง๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ๋์ฝ๋ฉํ๊ธฐ ์ํ ์ง๋ ฌํ ํ์์ ์ ํํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ต์ ์ ๋๋ค:
- JSON: ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์์ผ๋ก, ๊ตฌ๋ฌธ ๋ถ์์ด ์ฝ๊ณ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํ๋กํ ํ์ดํ์ ์ ํฉํฉ๋๋ค.
- ํ๋กํ ์ฝ ๋ฒํผ (protobuf): ํจ์จ์ ์ด๊ณ ์คํค๋ง ์งํ๋ฅผ ์ง์ํ๋ ๋ฐ์ด๋๋ฆฌ ํ์์ ๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ ๋๋ค. ๋ฉ์์ง ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ธฐ ์ํด `.proto` ํ์ผ์ ์ ์ํด์ผ ํฉ๋๋ค.
- MessagePack: JSON๊ณผ ์ ์ฌํ์ง๋ง ๋ ์๊ณ ํจ์จ์ ์ธ ๋ ๋ค๋ฅธ ๋ฐ์ด๋๋ฆฌ ํ์์ ๋๋ค.
- CBOR (Concise Binary Object Representation): ์๊ณ ํจ์จ์ ์ผ๋ก ์ค๊ณ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ง๋ ฌํ ํ์์ ๋๋ค.
์ง๋ ฌํ ํ์์ ์ ํ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. JSON์ ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข์ ์ถ๋ฐ์ ์ด๋ฉฐ, ํ๋กํ ์ฝ ๋ฒํผ๋ MessagePack์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋์ ์ ํ์ ๋๋ค.
3. ์๋ฒ์ ํ๋กํ ์ฝ ๋ก์ง ๊ตฌํํ๊ธฐ
์๋ฒ ์ธก์์๋ WebTransport ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ณ , ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ , ์ปค์คํ ํ๋กํ ์ฝ์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ๋ณด๋ด๋ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์์ (Node.js์ `node-webtransport` ์ฌ์ฉ):
const { WebTransport, WebTransportServer } = require('node-webtransport');
const server = new WebTransportServer({ port: 4433 });
server.listen().then(() => {
console.log('Server listening on port 4433');
});
server.handleStream(async (session) => {
console.log('New session:', session.sessionId);
session.on('stream', async (stream) => {
console.log('New stream:', stream.id);
const reader = stream.readable.getReader();
const writer = stream.writable.getWriter();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
console.log('Stream closed');
break;
}
// ๋ฉ์์ง๊ฐ JSON์ผ๋ก ์ธ์ฝ๋ฉ๋์๋ค๊ณ ๊ฐ์
const message = JSON.parse(new TextDecoder().decode(value));
console.log('Received message:', message);
// ์ปค์คํ
ํ๋กํ ์ฝ์ ๋ฐ๋ผ ๋ฉ์์ง ์ฒ๋ฆฌ
switch (message.type) {
case 'AUTH':
// ์ฌ์ฉ์ ์ธ์ฆ
console.log('Authenticating user:', message.username);
const response = { type: 'AUTH_RESPONSE', success: true };
writer.write(new TextEncoder().encode(JSON.stringify(response)));
break;
case 'EDIT':
// ์ฝ๋ ์์ ์ฒ๋ฆฌ
console.log('Processing code edit:', message);
// ...
break;
default:
console.log('Unknown message type:', message.type);
break;
}
}
} catch (error) {
console.error('Error processing stream:', error);
} finally {
reader.releaseLock();
writer.releaseLock();
}
});
session.on('datagram', (datagram) => {
// ๋น์ ๋ขฐ์ฑ ๋ฐ์ดํฐ๊ทธ๋จ ์ฒ๋ฆฌ
console.log('Received datagram:', new TextDecoder().decode(datagram));
});
});
server.on('error', (error) => {
console.error('Server error:', error);
});
4. ํด๋ผ์ด์ธํธ์ ํ๋กํ ์ฝ ๋ก์ง ๊ตฌํํ๊ธฐ
ํด๋ผ์ด์ธํธ ์ธก์์๋ WebTransport ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ , ์ปค์คํ ํ๋กํ ์ฝ์ ๋ฐ๋ผ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ์๋ต์ ์์ ํ๊ณ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์์ (JavaScript):
async function connect() {
try {
const transport = new WebTransport('https://example.com:4433/');
await transport.ready;
console.log('Connected to server');
const stream = await transport.createUnidirectionalStream();
const writer = stream.getWriter();
// ์ธ์ฆ ๋ฉ์์ง ์ ์ก
const authMessage = { type: 'AUTH', username: 'test', password: 'password' };
writer.write(new TextEncoder().encode(JSON.stringify(authMessage)));
await writer.close();
// ์๋ฐฉํฅ ์คํธ๋ฆผ ์์ฑ
const bidiStream = await transport.createBidirectionalStream();
const bidiWriter = bidiStream.writable.getWriter();
const bidiReader = bidiStream.readable.getReader();
// ์์ ๋ฉ์์ง ์ ์ก
const editMessage = { type: 'EDIT', line: 1, position: 0, text: 'Hello, world!' };
bidiWriter.write(new TextEncoder().encode(JSON.stringify(editMessage)));
// ์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง ์์
while (true) {
const { done, value } = await bidiReader.read();
if (done) {
console.log('Bidirectional stream closed');
break;
}
const message = JSON.parse(new TextDecoder().decode(value));
console.log('Received message from server:', message);
// ๋ฉ์์ง ์ฒ๋ฆฌ
switch (message.type) {
case 'AUTH_RESPONSE':
console.log('Authentication response:', message.success);
break;
default:
console.log('Unknown message type:', message.type);
break;
}
}
await bidiWriter.close();
bidiReader.releaseLock();
// ๋ฐ์ดํฐ๊ทธ๋จ ์ ์ก (๋น์ ๋ขฐ์ฑ)
transport.datagrams.writable.getWriter().write(new TextEncoder().encode('Hello from datagram!'));
transport.datagrams.readable.getReader().read().then( ({ value, done }) => {
if(done){
console.log("Datagram stream closed.");
} else {
console.log("Datagram received:", new TextDecoder().decode(value));
}
});
} catch (error) {
console.error('Error connecting:', error);
}
}
connect();
5. ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌํํ๊ธฐ
๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ชจ๋ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์์ชฝ์์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ญ์์ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๋ฉ์์ง ์ ํจ์ฑ ๊ฒ์ฌ: ๋ค์ด์ค๋ ๋ฉ์์ง๊ฐ ์์ ํ์๊ณผ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋์ง ํ์ธํฉ๋๋ค.
- ์๋ชป๋ ๋ฉ์์ง ์ฒ๋ฆฌ: ์๋ชป๋ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋, ์ค๋ฅ ์๋ต์ ๋ณด๋ด๊ฑฐ๋, ์ฐ๊ฒฐ์ ๋ซ์ต๋๋ค.
- ์ฐ๊ฒฐ ์ค๋ฅ ์ฒ๋ฆฌ: ๋คํธ์ํฌ ์ค๋จ์ด๋ ์๋ฒ ์ฅ์ ์ ๊ฐ์ ์ฐ๊ฒฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
- ์ ์ ์ข ๋ฃ: ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ฐ๊ฒฐ์ ์ ์์ ์ผ๋ก ์ข ๋ฃํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
WebTransport๋ QUIC๋ฅผ ํตํด ๋ด์ฅ๋ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌํํ ๋๋ ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ: ๊ถํ ์๋ ์ฌ์ฉ์๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ์ ์๋๋ก ๊ฒฌ๊ณ ํ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค. OAuth 2.0 ๋๋ JWT (JSON ์น ํ ํฐ)์ ๊ฐ์ ์ ๊ณ ํ์ค ์ธ์ฆ ํ๋กํ ์ฝ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ํธํ: QUIC๋ ์ ์ก ๊ณ์ธต์์ ์ํธํ๋ฅผ ์ ๊ณตํ์ง๋ง, ์ถ๊ฐ ๋ณด์์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ: ๋ชจ๋ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ ์ ํ ๊ฒ์ฆํ์ฌ ์ฃผ์ ๊ณต๊ฒฉ ๋ฐ ๊ธฐํ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํฉ๋๋ค.
- ์๋ ์ ํ(Rate Limiting): ๋จ์ฉ ๋ฐ ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ ์ ํ์ ๊ตฌํํฉ๋๋ค.
- ์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ: ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ๋ฅผ ์ํํฉ๋๋ค.
์ค์ ์ฌ์ฉ ์ฌ๋ก
WebTransport๋ ๋ค์์ ํฌํจํ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค:
- ์จ๋ผ์ธ ๊ฒ์: ์ค์๊ฐ ๊ฒ์ ํ๋ ์ด, ํ๋ ์ด์ด ๋๊ธฐํ, ๊ฒ์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ์ ์ง์ฐ ํต์ . ์์ฒ ๋ช ์ ํ๋ ์ด์ด๊ฐ ์ค์๊ฐ์ผ๋ก ์ํธ ์์ฉํ๋ ๋๊ท๋ชจ ๋ค์ค ์ฌ์ฉ์ ์จ๋ผ์ธ ๊ฒ์(MMO)์ ์์ํด ๋ณด์ญ์์ค. WebTransport์ ๋ฎ์ ์ง์ฐ ์๊ฐ๊ณผ ๋ค์คํ ๊ธฐ๋ฅ์ ์ํํ๊ณ ๋ฐ์์ด ๋น ๋ฅธ ๊ฒ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํ ๊ฒ์ ๋๋ค.
- ํ์ ํ์: ์ต์ํ์ ์ง์ฐ์ผ๋ก ์ค๋์ค ๋ฐ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํฉ๋๋ค. ๋ค๋ฅธ ๊ตญ๊ฐ์ ์ฌ๋ฌด์ค์ด ์๋ ํ์ฌ๊ฐ ์ ๊ธฐ์ ์ผ๋ก ํ์ ํ์๋ฅผ ํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์ ๋ขฐ์ฑ ์๋ ์คํธ๋ฆผ๊ณผ ๋น์ ๋ขฐ์ฑ ์คํธ๋ฆผ์ ๋ชจ๋ ์ฒ๋ฆฌํ๋ WebTransport์ ๋ฅ๋ ฅ์ ๋ช ํํ ํต์ ์ ์ํด ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ฒ๋ฆฌํ๊ณ , ์ง์ฐ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๋น๋์ค ๋ฐ์ดํฐ์์ ์ผ๋ถ ํจํท ์์ค์ ํ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ํ์ : ์ฌ๋ฌ ์ฌ์ฉ์ ๊ฐ์ ๋ฌธ์, ์ฝ๋ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋๊ธฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ ๋ฌธ์ ํธ์ง ๋๊ตฌ๋ WebTransport๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์์น์ ๊ด๊ณ์์ด ์ต์ํ์ ์ง์ฐ์ผ๋ก ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณผ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
- ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ: ๋ผ์ด๋ธ ๋น๋์ค ๋ฐ ์ค๋์ค ์ฝํ ์ธ ๋ฅผ ๋ง์ ์ฒญ์ค์๊ฒ ๋ฎ์ ์ง์ฐ ์๊ฐ์ผ๋ก ๋ฐฉ์กํฉ๋๋ค. WebTransport๋ ๋ผ์ด๋ธ ์ด๋ฒคํธ, ์ฝ์ํธ ๋๋ ๋ด์ค ๋ฐฉ์ก์ ์ ์ธ๊ณ ์์ฒญ์์๊ฒ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์ฐ์ ์๋ํ: ์ฐ์ ์ฅ๋น์ ์ค์๊ฐ ์ ์ด ๋ฐ ๋ชจ๋ํฐ๋ง. ์ค์๊ฐ์ผ๋ก ํต์ ํด์ผ ํ๋ ์๋ง์ ์ผ์์ ์ก์ถ์์ดํฐ๊ฐ ์๋ ๊ณต์ฅ ํ์ฅ์ ์์ํด ๋ณด์ญ์์ค. WebTransport๋ ์ด๋ฌํ ์ฅ์น๋ฅผ ์ ์ดํ๊ณ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ๊ณ ์ ๋ขฐํ ์ ์๋ ํต์ ๋คํธ์ํฌ๋ฅผ ์์ฑํ์ฌ ํจ์จ์ ์ด๊ณ ์๋ํ๋ ์ ์กฐ ๊ณต์ ์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค.
- ๊ธ์ต ๊ฑฐ๋ ํ๋ซํผ: ์ค์๊ฐ ์์ฅ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ณ ์ต์ํ์ ์ง์ฐ ์๊ฐ์ผ๋ก ๊ฑฐ๋๋ฅผ ์คํํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ํด๋ฆฌํ(Polyfills)
2023๋ ํ๋ฐ ํ์ฌ, WebTransport๋ ์์ง ๋น๊ต์ ์๋ก์ด ๊ธฐ์ ์ด๋ฉฐ ๋ธ๋ผ์ฐ์ ์ง์์ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. Chrome๊ณผ Edge๋ WebTransport๋ฅผ ์ ์ง์ํ์ง๋ง ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ์ง์์ด ์ ํ์ ์ด๊ฑฐ๋ ์ ํ ์์ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋์ ๋ฒ์์ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋๋ก ํ๋ ค๋ฉด ํด๋ฆฌํ์ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค. ํด๋ฆฌํ์ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฝ๋ ์กฐ๊ฐ์ ๋๋ค. ์ฌ๋ฌ WebTransport ํด๋ฆฌํ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ์์ง WebTransport๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํด๋ฆฌํ์ ๋ค์ดํฐ๋ธ WebTransport ๊ตฌํ๊ณผ ๋์ผํ ์์ค์ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ ์ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ํด๋ฆฌํ๋ก ์ฒ ์ ํ ํ ์คํธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ฒฐ๋ก
WebTransport API๋ ๊ฐ๋ฐ์๊ฐ ํฅ์๋ ์ค์๊ฐ ํต์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๊ธฐ์ ์ ๋๋ค. QUIC ํ๋กํ ์ฝ์ ํ์ฉํ๊ณ ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌํ์ ํ์ฉํจ์ผ๋ก์จ WebTransport๋ ์น์์ผ๊ณผ ๊ฐ์ ๊ธฐ์กด ์น ํต์ ๊ธฐ์ ์ ๋นํด ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ ์์ง ๋ฐ์ ์ค์ด์ง๋ง, WebTransport์ ์ ์ฌ์ ์ธ ์ด์ ์ ์ค์๊ฐ ๋๋ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ํ์ํ ๊ฐ์น๊ฐ ์๋ ๊ธฐ์ ์ ๋๋ค.
์น์ด ๋์ฑ ์ํธ์์ฉ์ ์ด๊ณ ์ค์๊ฐ์ ์ธ ๊ฒฝํ์ผ๋ก ๊ณ์ ์งํํจ์ ๋ฐ๋ผ, WebTransport๋ ์ด๋ฌํ ๋ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ๊ธฐ์ ์ด ๋ ๊ฒ์ ๋๋ค. WebTransport์ ํต์ฌ ๊ฐ๋ ์ ์ดํดํ๊ณ ์ปค์คํ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ํ์ตํจ์ผ๋ก์จ ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ํ์ ์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
WebTransport๋ก ์น ํต์ ์ ๋ฏธ๋๋ฅผ ๋ฐ์๋ค์ด๊ณ ๋น๊ตํ ์ ์๋ ์๋, ์ ์ฐ์ฑ ๋ฐ ์ ๋ขฐ์ฑ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐํํ์ญ์์ค. ๊ฐ๋ฅ์ฑ์ ๋ฌดํํฉ๋๋ค.