[Kubernetes] ๐ HTTP/2๋ TLS๊ฐ ์๋๋ค: h2 vs h2c ์๋ฒฝ ์ ๋ฆฌ
HTTP/2์ TLS๋ ๋ณ๊ฐ๋ผ๋ ์ฌ์ค์ ๋ดํฌยท์ฝ์ ๋น์ ๋ก ํ์ด๋ด๊ณ , h2์ h2c์ ์ฐจ์ด, ALPN ํ์, TLS termination๊น์ง ์ฟ ๋ฒ๋คํฐ์ค gRPC ํต์ ์ ๊ธฐ์ด ๊ฐ๋ ์ ์ ๋ฆฌํ์ต๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์ gRPC๋ฅผ ๋ค๋ฃจ๋ค ๋ณด๋ฉด โํ๋ฌธ HTTP/2(h2c)โ, โscheme์ด https์ธ๋ฐ ํ๋ฌธโ ๊ฐ์ ๋ชจ์์ฒ๋ผ ๋ค๋ฆฌ๋ ๋ง๋ค๊ณผ ๋ง์ฃผ์นฉ๋๋ค. ์ด ๊ธ์์๋ ๊ทธ ํผ๋์ ๊ทผ์์ธ โHTTP/2 = TLSโ๋ผ๋ ์คํด๋ฅผ ๋ดํฌยท์ฝ์ ๋น์ ๋ก ๊นจ๊ณ , h2์ h2c์ ์ฐจ์ด, ALPN ํ์, TLS termination์ ์ ๋ฆฌํฉ๋๋ค. ์ด ๊ฐ๋
๋ง ์ก์ผ๋ฉด ๊ฒ์ดํธ์จ์ด ๋ค gRPC ํต์ ์ด ์ ๊ทธ๋ ๊ฒ ๋์ํ๋์ง ์ ๋ถ ์ค๋ช
๋ฉ๋๋ค.
์ด ์๋ฆฌ์ฆ๋ ์ฟ ๋ฒ๋คํฐ์ค์ gRPC ์๋น์ค๋ฅผ ์ฌ๋ฆฌ๋ค ๋งํ ์ฝ์ง์์ ์ถ๋ฐํด HTTP/2ยทTLSยท๋ก๋๋ฐธ๋ฐ์ยทGateway APIยท์ธ์ฆ์๊น์ง ํ์ด๊ฐ๋ ๊ธฐ๋ก์ ๋๋ค. ์ด๋ฒ 2ํธ์ ๊ธฐ์ด ๊ฐ๋ (h2 vs h2c) ํธ์ ๋๋ค. 1ํธ์ ์์ง ์ ์ฝ์๋ค๋ฉด .NET gRPC๊ฐ ๊ฒ์ดํธ์จ์ด ๋ค์์ ์ ๋๋ ๋ฌธ์ ์ ํด๊ฒฐ์ ๋จผ์ ๋ณด๋ฉด ์ข์ต๋๋ค.
๐งฑ ๋ชจ๋ ํผ๋์ ๊ทผ์: โHTTP/2 = TLSโ๋ผ๋ ์คํด
HTTP/2์ TLS๋ ๋ณ๊ฐ์ ๋๋ค. ๊ฐ์ฅ ๋จผ์ ๊นจ์ผ ํ ์คํด์ ๋๋ค. ๋์ ์๋ก ๋ค๋ฅธ ์ถ์ ์์ต๋๋ค.
- TLS = ์ํธํ. ๋ฐ์ดํฐ๋ฅผ ๋ดํฌ์ ๋ฃ์ด ๋ดํ๋๋์ ๋ฌธ์ ์ ๋๋ค.
- HTTP/2 = ํต์ ํ๋กํ ์ฝ. ํธ์ง๋ฅผ ์ด๋ค โ์ธ์ดโ๋ก ์ฐ๋๋์ ๋ฌธ์ ์ ๋๋ค(HTTP/1.1์ด๋ HTTP/2๋).
๋น์ ํ๋ฉด ์ด๋ ์ต๋๋ค.
- ์ํธํ(TLS) = ๋ดํฌ / ํ๋ฌธ = ์ฝ์
- ํต์ ๋ฐฉ์(HTTP ๋ฒ์ ) = ํธ์ง๋ฅผ ์ด ์ธ์ด
ํธ์ง๋ฅผ HTTP/2๋ผ๋ ์ธ์ด๋ก ์ฐ๋, ๋ดํฌ์ ๋ด์ ๋ณด๋ผ ์๋ ์๊ณ (์ํธํ), ์ฝ์๋ก ๋ณด๋ผ ์๋ ์์ต๋๋ค(ํ๋ฌธ). ์ด ๋์ ๋ ๋ฆฝ์ ์ ๋๋ค.
๐ข ๋ค ๊ฐ์ง ์กฐํฉ
ํฌ์ฅ(์ํธํ)๊ณผ ์ธ์ด(HTTP ๋ฒ์ )๊ฐ ๋ ๋ฆฝ์ด๋ผ, ๋ค ๊ฐ์ง ์กฐํฉ์ด ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค.
| ย | ํ๋ฌธ (์ฝ์) | TLS (๋ดํฌ) |
|---|---|---|
| HTTP/1.1 | ๊ทธ๋ฅ HTTP (http://) | HTTPS (https://) |
| HTTP/2 | h2c | h2 |
์ฌ๊ธฐ์ h2c์ c๋ cleartext(ํ๋ฌธ), ์ฆ โ์ํธํํ์ง ์์ HTTP/2โ์
๋๋ค.
์ โํ๋ฌธ HTTP/2โ๊ฐ ๋ชจ์์ฒ๋ผ ๋ค๋ฆด๊น?
๋ธ๋ผ์ฐ์ ๋๋ฌธ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋ณด์์ HTTP/2๋ฅผ TLS ์์์๋ง(h2) ํ์ฉํ๊ณ , ํ๋ฌธ HTTP/2(h2c)๋ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ผ์์์ โHTTP/2 = HTTPSโ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ํ์ง๋ง ๊ทธ๊ฑด ๋ธ๋ผ์ฐ์ ์ ์ ์ฑ ์ผ ๋ฟ, ํ๋กํ ์ฝ ์์ฒด์ ๊ท์น์ด ์๋๋๋ค. ์๋ฒ๋ผ๋ฆฌ ํต์ ํ ๋ ํ๋ฌธ HTTP/2(h2c)๋ฅผ ํํ ์ฐ๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด๋ถ๊ฐ ๋ํ์ ์ ๋๋ค.
๐ง ํํ ์คํด: โHTTP/2๋ฉด ๋น์ฐํ https๋๊น ์ธ์ฆ์๊ฐ ํ์ํ๊ฒ ์ง.โ ์ค์ ๋ก๋ ํด๋ฌ์คํฐ ๋ด๋ถ ํต์ ์ ํ๋ฌธ HTTP/2(h2c)์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ์ํธํ๋ ๋ณ๊ฐ ๋ฌธ์ ์ ๋๋ค.
๐ h2 / h2c๋ ๋๊ฐ ์ง์ด๋ธ ๋ง์ด ์๋๋ค
h2์ h2c๋ ํน์ ๋๊ตฌ์ ์ฉ์ด๊ฐ ์๋๋ผ HTTP/2 ํ์ค(RFC 7540)์ ์ ์๋๊ณ IANA์ ๋ฑ๋ก๋ ๊ณต์ ์๋ณ์์
๋๋ค.
์๋ h2๋ TLS ํธ๋์
ฐ์ดํฌ ๋ โ์ฐ๋ฆฌ HTTP/2๋ก ๋งํ์โ๋ฅผ ์งง๊ฒ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ALPN ํ ํฐ์
๋๋ค. ๊ทธ๋์ http2์ฒ๋ผ ๊ธธ๊ฒ ์ฐ์ง ์๊ณ h2๋ผ๋ ์งง์ ํํ๋ก ์ ํ์ต๋๋ค. h2c๋ ํ๋ฌธ ์ฐ๊ฒฐ์์ HTTP/1.1 โ HTTP/2 ์
๊ทธ๋ ์ด๋๋ฅผ ์์ฒญํ ๋ ์ฐ๋ ํ ํฐ์ด์์ต๋๋ค.
์ด๊ฒ ์ค์ํ ์ด์ ๋ ๋๊ตฌ๊ฐ ๋ฐ๋์ด๋ ์๋ฏธ๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค. EnvoyยทKestrelยทgRPCยทContour HTTPProxy ์ด๋์ ๋ณด๋ h2c๋ ์ ๋ถ โํ๋ฌธ HTTP/2โ๋ผ๋ ๊ฐ์ ๋ป์
๋๋ค. ๊ฐ ๋๊ตฌ๊ฐ ์ ๋ฉ๋๋ก ์ง์ ๊ฒ ์๋๋ผ ๊ฐ์ ํ์ค์ ๋ฐ๋ฅด๋ฏ๋ก, ํ ๋ฒ ์ตํ๋ฉด ๊ทธ๋๋ก ํตํฉ๋๋ค.
์ฐธ๊ณ : ์ดํ HTTP/2 ํ์ค์ด RFC 9113์ผ๋ก ์ ๋ฆฌ๋๋ฉฐ ํ๋ฌธ ์ ๊ทธ๋ ์ด๋(
Upgrade: h2c) ๋ฉ์ปค๋์ฆ ๋ฑ ์ธ๋ถ ๊ท์น์ ์ผ๋ถ ๋ฐ๋์์ง๋ง,h2=TLS HTTP/2,h2c=ํ๋ฌธ HTTP/2๋ผ๋ ๊ธฐ๋ณธ ์๋ฏธ๋ ๊ทธ๋๋ก์ ๋๋ค.
๐ค ALPN โ ๋ดํฌ๋ฅผ ์ด๊ธฐ ์ ์ โ์ธ์ดโ๋ฅผ ํฉ์ํ๋ ๊ณผ์
ALPN(Application-Layer Protocol Negotiation)์ TLS ํธ๋์
ฐ์ดํฌ ๋จ๊ณ์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ด๋ค ํ๋กํ ์ฝ๋ก ํต์ ํ ์ง ๋ฏธ๋ฆฌ ํฉ์ํ๋ ๊ณผ์ ์
๋๋ค. ๋ดํฌ(TLS)๋ฅผ ๋ดํ๊ธฐ ์ ์ โ์ฐ๋ฆฌ ๋ฌด์จ ์ธ์ด๋ก ๋งํ ๊น?โ๋ฅผ ์ ํ๋ ์
์ด๊ณ , ์ฌ๊ธฐ์ h2๋ก ํฉ์๋๋ฉด HTTP/2๋ก ํต์ ํฉ๋๋ค.
ํต์ฌ ํฌ์ธํธ๋ ํ๋ฌธ(์ฝ์)์๋ ์ด ALPN ๋จ๊ณ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ 1ํธ์์ Kestrel์ Http1AndHttp2๋ก ๋๋ฉด ์ ๋๋ ๊ฒ์
๋๋ค. ํ๋ฌธ ํฌํธ์๋ โ๋ฌด์จ ์ธ์ด๋โ๋ฅผ ํ์ํ ALPN์ด ์์ผ๋, Kestrel์ด ์์ ํ๊ฒ HTTP/1.1๋ก ๋จ์ด๋จ๋ฆฝ๋๋ค. ํ๋ฌธ์์ HTTP/2๋ฅผ ๋ฐ์ผ๋ ค๋ฉด Http2 ์ ์ฉ์ผ๋ก ๋ชป ๋ฐ์์ผ ํฉ๋๋ค.
1
2
3
4
5
6
7
8
// appsettings.json โ ํ๋ฌธ ํฌํธ์์ HTTP/2๋ฅผ ๊ฐ์
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
โ๏ธ TLS termination โ ๋ดํฌ๋ฅผ ์ด๋์ ๋ฏ๋๋
TLS termination(TLS ์ข ๋ฃ)์ ๊ฒ์ดํธ์จ์ด๊ฐ ๋ค์ด์ค๋ ์ํธํ ์ฐ๊ฒฐ์ ๋ดํฌ(TLS)๋ฅผ ๋ฏ์ด ํ๋ฌธ์ผ๋ก ๋ฐ๊พธ๋ ์ง์ ์ ๋๋ค. ๋ด์ฉ์ ์ฝ์ด ๋ผ์ฐํ ํ๋ ค๋ฉด ๋ดํฌ๋ฅผ ๋จผ์ ์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ฌ์คํฐ ์์ชฝ(๊ฒ์ดํธ์จ์ด โ Pod)์ผ๋ก๋ ๋ค์ ์ฝ์(ํ๋ฌธ h2c)๋ก ์ ๋ฌํฉ๋๋ค.
1
ํด๋ผ์ด์ธํธ โโ(๋ดํฌ, h2)โโโถ ๊ฒ์ดํธ์จ์ด[๋ดํฌ ๋ฏ์] โโ(์ฝ์, h2c)โโโถ Pod
์ฌ๊ธฐ์ 1ํธ์ ์์ธ โก๊ฐ ๋์ต๋๋ค. ๊ฒ์ดํธ์จ์ด๋ ๋ดํฌ๋ฅผ ๋ฏ์ด ์ฝ์๋ก ๋ฐ๊พธ๋ฉด์๋, ํธ์ง์ ๋ถ์ :scheme ๋ผ๋ฒจ์ ์๋๋๋ก โhttps(๋ดํฌ)โ๋ผ๊ณ ๋จ๊ฒจ ๋ก๋๋ค. ๊ทธ๋ฌ๋ ์ฝ์๋ฅผ ๋ฐ์ Kestrel์ด โ๋ผ๋ฒจ์ ๋ดํฌ๋ผ๋๋ฐ ๋ ์ฝ์๋ค?โ ํ๊ณ ๊ฑฐ๋ถํ ๊ฒ์
๋๋ค. AllowAlternateSchemes๋ โ๊ทธ ๋ผ๋ฒจ์ ๋ฌด์ํ๊ณ ๋ฐ์๋ผโ๋ผ๋ ํ๋ฝ์ด์์ต๋๋ค.
1
2
3
4
builder.WebHost.ConfigureKestrel(options =>
{
options.AllowAlternateSchemes = true; // :scheme=https + ํ๋ฌธ ์ ์ก ํ์ฉ
});
๐งฉ ์ ๋ฆฌ: ์ธ ๊ฐ์ง๋ง ๊ตฌ๋ถํ๋ฉด ๋๋ค
1ํธ์ ๋ชจ๋ ์ฆ์์ด ์ด ์ธ ๊ฐ์ง์ ์กฐํฉ์ผ๋ก ์ค๋ช ๋ฉ๋๋ค.
| ๊ตฌ๋ถ | ์๋ฏธ | ์์ |
|---|---|---|
| ๋ดํฌ / ์ฝ์ | ์ํธํ ์ฌ๋ถ | TLS / ํ๋ฌธ |
| ์ธ์ด | ํต์ ๋ฐฉ์ | HTTP/1.1 / HTTP/2 |
| ๋ผ๋ฒจ | ์์ฒญ ํค๋ | :scheme, :authority ๋ฑ |
์ธ์ธ ํ ๋ฌธ์ฅ: ํต์ ๋ฐฉ์(HTTP/1.1ยทHTTP/2)๊ณผ ์ํธํ(TLS๋ฅผ ์ฐ๋ ๋ง๋)๋ ์์ ํ ๋ณ๊ฐ๋ค.
์ด ํ ๋ฌธ์ฅ์ด ๋ชธ์ ๋ฐฐ๋ฉด, โํ๋ฌธ HTTP/2โ๋ โscheme์ด https์ธ๋ฐ ํ๋ฌธโ๋ ๋ ์ด์ ๋ชจ์์ผ๋ก ๋ค๋ฆฌ์ง ์์ต๋๋ค.
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Q. h2์ h2c์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
๋ ๋ค HTTP/2์
๋๋ค. h2๋ TLS ์์์(์ํธํ) ๋์ํ๋ HTTP/2, h2c๋ ํ๋ฌธ(cleartext)์์ ๋์ํ๋ HTTP/2์
๋๋ค. c๋ cleartext๋ฅผ ๋ปํฉ๋๋ค.
Q. HTTP/2๋ฅผ ์ฐ๋ ค๋ฉด ๋ฐ๋์ ์ธ์ฆ์(TLS)๊ฐ ํ์ํ๊ฐ์?
์๋๋๋ค. ๊ทธ๊ฑด ๋ธ๋ผ์ฐ์ ์ ์ ์ฑ ์ผ ๋ฟ ํ๋กํ ์ฝ ๊ท์น์ด ์๋๋๋ค. ์๋ฒ ๊ฐ ํต์ , ํนํ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ ํ๋ฌธ HTTP/2(h2c)๋ฅผ ํํ ์ฌ์ฉํฉ๋๋ค.
Q. ALPN์ด ์์ผ๋ฉด ์ HTTP/2๋ก ํต์ ํ ์ ์๋์?
ํ๋ฌธ ์ฐ๊ฒฐ์๋ TLS ํธ๋์ ฐ์ดํฌ ์์ฒด๊ฐ ์์ด ALPN ํ์ ๋จ๊ณ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ โHTTP/2๋ก ๋งํ์โ๋ฅผ ํฉ์ํ ๋ฐฉ๋ฒ์ด ์์ด, ์๋ฒ๋ ์์ ํ๊ฒ HTTP/1.1๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ HTTP/2 ์ ์ฉ์ผ๋ก ๋ช ์๋์ด ์์ด์ผ ํฉ๋๋ค.
Q. TLS termination ์ดํ ๋ฐฑ์๋๋ ์ด๋ค ํ๋กํ ์ฝ์ ๋ฐ๋์?
๊ฒ์ดํธ์จ์ด๊ฐ TLS๋ฅผ ์ข
๋ฃํ๋ฉด ๋ฐฑ์๋(Pod)๋ก๋ ํ๋ฌธ์ด ์ ๋ฌ๋ฉ๋๋ค. gRPC๋ผ๋ฉด ์ด๋ ํ๋ฌธ HTTP/2, ์ฆ h2c๋ก ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค.
๐ ์ฐธ๊ณ
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)
- RFC 9113 - HTTP/2 (RFC 7540 ๊ฐ์ ํ)
- IANA TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs
- MDN - Application-Layer Protocol Negotiation (ALPN)
- ๊ด๋ จ ๊ธ: gRPC๊ฐ .NET์์๋ง ์ ๋๋ค (์๋ฆฌ์ฆ 1ํธ)
</content>