Post

[Kubernetes] ๐Ÿ”Œ gRPC๊ฐ€ .NET์—์„œ๋งŒ ์•ˆ ๋๋‹ค: HTTP/2ยทTLSยทscheme ๋ฌธ์ œ ํ•ด๊ฒฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ฒŒ์ดํŠธ์›จ์ด ๋’ค์—์„œ .NET gRPC๋งŒ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ HTTP/2(h2c)์™€ Kestrel์˜ AllowAlternateSchemes ์„ค์ •์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

[Kubernetes] ๐Ÿ”Œ gRPC๊ฐ€ .NET์—์„œ๋งŒ ์•ˆ ๋๋‹ค: HTTP/2ยทTLSยทscheme ๋ฌธ์ œ ํ•ด๊ฒฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— gRPC ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ ธ๋Š”๋ฐ Python ์„œ๋ฒ„๋Š” ๋ถ™๊ณ  .NET(Kestrel) ์„œ๋ฒ„๋งŒ ๊ณ„์† ๋Š๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ทธ ์›์ธ์ด โ‘  ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋ฐฑ์—”๋“œ๋กœ HTTP/1.1์„ ๋ณด๋‚ด๋Š” ๋ฌธ์ œ์™€ โ‘ก TLS ์ข…๋ฃŒ ํ›„์—๋„ :scheme=https ๋ผ๋ฒจ์ด ๋‚จ์•„ Kestrel์ด ๊ฑฐ๋ถ€ํ•˜๋Š” ๋ฌธ์ œ, ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„์ธต์— ์žˆ์—ˆ์Œ์„ ์ถ”์ ํ•˜๊ณ  h2c + AllowAlternateSchemes๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— gRPC ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ฆฌ๋‹ค ๋ง‰ํžŒ ์‚ฝ์งˆ์—์„œ ์ถœ๋ฐœํ•ด, HTTP/2ยทTLSยท๋กœ๋“œ๋ฐธ๋Ÿฐ์„œยทGateway APIยท์ธ์ฆ์„œ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ํ’€์–ด๊ฐ€๋Š” ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. 1ํŽธ(์ด ๊ธ€)์€ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ์ž…๋‹ˆ๋‹ค.


๐Ÿšจ ์ฆ์ƒ: ๊ฐ™์€ gRPC์ธ๋ฐ ํ•œ์ชฝ๋งŒ ์•ˆ ๋œ๋‹ค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— gRPC ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ด ์„ค์ •์€ ๋™์ผํ•œ๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐˆ๋ ธ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œํฌํŠธ 80 (ํ‰๋ฌธ)ํฌํŠธ 443 (TLS)
Python gRPC ์„œ๋ฒ„โœ… ์ •์ƒโœ… ์ •์ƒ
.NET(Kestrel) gRPC ์„œ๋ฒ„โœ… ์ •์ƒโŒ ์—ฐ๊ฒฐ ๋Š๊น€

Kestrel ๋กœ๊ทธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ์ฐํ˜”์Šต๋‹ˆ๋‹ค.

1
The request :scheme header 'https' does not match the transport scheme 'http'.

์ฒ˜์Œ ๋“  ์ƒ๊ฐ์€ โ€œHTTP/2๊ฐ€ ๋ฌธ์ œ๋‹ˆ๊นŒ HTTP/2๋ฅผ ํ”ผํ•ด๋ณด์žโ€์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ๊ทธ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. gRPC๋Š” HTTP/2 ์œ„์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. HTTP/2๋ฅผ ๋นผ๋Š” ์ˆœ๊ฐ„ ๊ทธ๊ฑด ๋” ์ด์ƒ gRPC๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. โ€œํ”ผํ•˜์žโ€๊ฐ€ ์•„๋‹ˆ๋ผ โ€œ์–ด๋””์„œ, ์™œ ๊นจ์ง€๋Š”์ง€โ€๋ฅผ ์ •ํ™•ํžˆ ์ฐพ์ž๋กœ์š”.


๐Ÿ“Œ ํ•ต์‹ฌ ์ „์ œ ๋‘ ๊ฐ€์ง€

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋‘ ๊ฐ€์ง€๋งŒ ๊น”๊ณ  ๊ฐ‘๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๊ฐœ๋…์€ ๋‹ค์Œ ํŽธ์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค.)

  1. gRPC = HTTP/2. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ HTTP/2๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  2. โ€œํ†ต์‹  ๋ฐฉ์‹(HTTP ๋ฒ„์ „)โ€๊ณผ โ€œ์•”ํ˜ธํ™”(TLS)โ€๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ชจ๋“  ํ˜ผ๋ž€์˜ ๊ทผ์›์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ํ—ท๊ฐˆ๋ ธ๋˜ ๊ฑด h2c๋ผ๋Š” ๋‹จ์–ด์˜€์Šต๋‹ˆ๋‹ค.

h2์™€ h2c๋Š” ๋ฌด์—‡์ธ๊ฐ€?

h2๋Š” TLS ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” HTTP/2, h2c๋Š” ์•”ํ˜ธํ™” ์—†์ด(ํ‰๋ฌธ) ๋™์ž‘ํ•˜๋Š” HTTP/2๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค(c = cleartext). โ€œHTTP/2์ธ๋ฐ ํ‰๋ฌธโ€์ด๋ผ๋Š” ๋ง์ด ๋ชจ์ˆœ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ, HTTP/2์™€ TLS๊ฐ€ ๋ณ„๊ฐœ์˜ ๊ณ„์ธต์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๋‚˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

ํ‘œ๊ธฐํ”„๋กœํ† ์ฝœ์•”ํ˜ธํ™”์ผ๋ฐ˜์ ์ธ ํฌํŠธ
h2HTTP/2TLS ์žˆ์Œ443
h2cHTTP/2ํ‰๋ฌธ80

๐Ÿ” ์›์ธ โ‘  โ€” ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ HTTP/1.1๋กœ ๋ง์„ ๊ฑธ๊ณ  ์žˆ์—ˆ๋‹ค

์ฒซ ๋ฒˆ์งธ ์›์ธ์€ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋ฐฑ์—”๋“œ๋กœ HTTP/1.1์„ ๋ณด๋‚ด๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Kestrel์„ HTTP/2 ์ „์šฉ์œผ๋กœ ์„ค์ •ํ•ด ๋‘๋ฉด ๊ทธ ํฌํŠธ๋Š” HTTP/2๋งŒ ์•Œ์•„๋“ฃ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๋ณ„๋„ ์ง€์ •์ด ์—†์œผ๋ฉด ๋ฐฑ์—”๋“œ๋กœ HTTP/1.1์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. โ€œ์–ธ์–ดโ€๊ฐ€ ์•ˆ ๋งž์œผ๋‹ˆ Kestrel์ด ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ โ‘ -a: ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ h2c๋กœ ๋ณด๋‚ด๊ฒŒ ํ•œ๋‹ค

Service์— appProtocol์„ ๋ช…์‹œํ•˜๋ฉด, ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋ฐฑ์—”๋“œ๋กœ ํ‰๋ฌธ HTTP/2๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
# Service
apiVersion: v1
kind: Service
metadata:
  name: my-grpc-svc
spec:
  ports:
    - name: grpc
      port: 8080
      targetPort: 8080
      appProtocol: kubernetes.io/h2c   # ํ‰๋ฌธ HTTP/2๋กœ ์ „๋‹ฌํ•˜๋ผ

Contour๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด HTTPProxy์—์„œ ๋ฐฑ์—”๋“œ ํ”„๋กœํ† ์ฝœ์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
# Contour HTTPProxy
spec:
  routes:
    - services:
        - name: my-grpc-svc
          port: 8080
          protocol: h2c

ํ•ด๊ฒฐ โ‘ -b: Kestrel์„ HTTP/2 ์ „์šฉ์œผ๋กœ ๋‘”๋‹ค

ํ‰๋ฌธ ํฌํŠธ์—๋Š” ํ”„๋กœํ† ์ฝœ ์ž๋™ ํ˜‘์ƒ(ALPN)์ด ์—†์–ด์„œ, Http1AndHttp2๋กœ ๋‘๋ฉด ํ˜‘์ƒ ๋‹จ๊ณ„ ์—†์ด HTTP/1.1๋กœ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‰๋ฌธ gRPC ํฌํŠธ๋Š” Http2๋กœ ๊ณ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
// appsettings.json
{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }
}

โš ๏ธ Http1AndHttp2๋Š” TLS(ALPN)๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ HTTP/2๋กœ ํ˜‘์ƒ๋ฉ๋‹ˆ๋‹ค. TLS ์ข…๋ฃŒ๊ฐ€ ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์ผ์–ด๋‚˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ํ‰๋ฌธ ํฌํŠธ์ด๋ฏ€๋กœ Http2๋กœ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” ์›์ธ โ‘ก โ€” scheme ๋ผ๋ฒจ ๋ถˆ์ผ์น˜ (.NET๋งŒ ๋ง‰ํ˜”๋˜ ์ง„์งœ ์ด์œ )

๋‘ ๋ฒˆ์งธ ์›์ธ์ด์ž .NET๋งŒ ๋ง‰ํžŒ ์ง„์งœ ์ด์œ ๋Š” :scheme ๋ผ๋ฒจ๊ณผ ์‹ค์ œ ์ „์†ก ๋ฐฉ์‹์˜ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ TLS๋ฅผ ์ข…๋ฃŒ(๋ณตํ˜ธํ™”)ํ•ด ํ‰๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ” ๋ณด๋‚ด๋ฉด์„œ๋„, ์š”์ฒญ์— ๋ถ™์€ :scheme ๊ฐ’์€ ์›๋ž˜๋Œ€๋กœ https ๋กœ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Kestrel์— ๋„์ฐฉํ•œ ์—ฐ๊ฒฐ์€ ํ‰๋ฌธ์ž…๋‹ˆ๋‹ค. Kestrel์€ โ€œscheme์€ https๋ผ๋Š”๋ฐ ์—ฐ๊ฒฐ์€ ํ‰๋ฌธ์ด๋„ค? ์•ˆ ๋งž์ž–์•„โ€๋ผ๋ฉฐ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋กœ๊ทธ์— ์ฐํžŒ ๊ทธ ์—๋Ÿฌ์˜ ์ •์ฒด์˜€์Šต๋‹ˆ๋‹ค.

1
The request :scheme header 'https' does not match the transport scheme 'http'.

Python gRPC ์„œ๋ฒ„๋Š” ์ด scheme ๊ฒ€์ฆ์„ ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋ƒฅ ํ†ต๊ณผํ–ˆ๊ณ , Kestrel๋งŒ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฒ€์‚ฌํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ โ‘ก: Kestrel์—๊ฒŒ ๊ทธ scheme์„ ํ—ˆ์šฉํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค€๋‹ค

AllowAlternateSchemes ์˜ต์…˜์„ ์ผœ๋ฉด Kestrel์ด :scheme๊ณผ ์ „์†ก ๋ฐฉ์‹์ด ๋‹ฌ๋ผ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
builder.WebHost.ConfigureKestrel(options =>
{
    options.AllowAlternateSchemes = true;
});

๋ค์œผ๋กœ ์ด ์˜ต์…˜์„ ์ผœ๋ฉด HttpRequest.Scheme์ด ์›๋ž˜ ๊ฐ’(https)์œผ๋กœ ์žกํ˜€, ์•ฑ์ด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธยท์ ˆ๋Œ€๊ฒฝ๋กœ URL์„ ๋งŒ๋“ค ๋•Œ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Tip: AllowAlternateSchemes๋Š” .NET 6 ์ด์ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. scheme ๊ฐ’ ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ ์œ ํšจํ•œ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ ๋‘ ์„ค์ •์€ โ€œ์ค‘๋ณตโ€์ด ์•„๋‹ˆ๋ผ โ€œ์„œ๋กœ ๋‹ค๋ฅธ ์ธตโ€

์ฒ˜์Œ์—” โ€œ๋‘˜ ๋‹ค h2c ๊ด€๋ จ ์•„๋‹Œ๊ฐ€?โ€ ์‹ถ์—ˆ๋Š”๋ฐ, ์—ญํ• ์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์„ค์ •๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต์˜๋ฏธ
Service์˜ appProtocol: h2cํ†ต์‹  ๋ฐฉ์‹(์–ธ์–ด)โ€œHTTP/2๋กœ ๋ณด๋‚ด๋ผโ€
Kestrel AllowAlternateSchemesํ—ค๋”(๋ผ๋ฒจ) ๊ฒ€์ฆโ€œhttps ๋ผ๋ฒจ์„ ํ‰๋ฌธ ์œ„์—์„œ๋„ ํ—ˆ์šฉํ•ด๋ผโ€

๊ทธ๋ž˜์„œ ํ•˜๋‚˜๋งŒ ๋นผ๋„, ๋‘˜ ๋‹ค ๋นผ๋„ ํ†ต์‹ ์ด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋งž์ถฐ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


โœ… ์ฆ์ƒ์ด ์ „๋ถ€ ์„ค๋ช…๋œ๋‹ค

๋‘ ์›์ธ์„ ์•Œ๊ณ  ๋‚˜๋ฉด ์ฒ˜์Œ์˜ ์ฆ์ƒ ํ‘œ๊ฐ€ ๋ชจ๋‘ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

  • ์™œ 80์€ ๋˜๊ณ  443์€ ์•ˆ ๋๋‚˜? 80(ํ‰๋ฌธ)์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ scheme http๋กœ ์ „๋‹ฌ โ†’ ์‹ค์ œ๋„ ํ‰๋ฌธ โ†’ ์ผ์น˜ โ†’ OK. 443(TLS)์€ scheme https๋ฅผ ํ‰๋ฌธ ์œ„๋กœ ์ „๋‹ฌ โ†’ ๋ถˆ์ผ์น˜ โ†’ ์‹คํŒจ.

  • ์™œ Python์€ ๋˜๊ณ  .NET์€ ์•ˆ ๋๋‚˜? Python ์„œ๋ฒ„๋Š” scheme ๋ผ๋ฒจ์„ ๊ฒ€์ฆํ•˜์ง€ ์•Š์•˜๊ณ , Kestrel๋งŒ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฒ€์‚ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


๐Ÿ“ ํ•œ ์ค„ ์š”์•ฝ

.NET gRPC๊ฐ€ ๊ฒŒ์ดํŠธ์›จ์ด ๋’ค์—์„œ ์•ˆ ๋๋˜ ๊ฑด ๋‘ ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค.

  1. ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ HTTP/1.1๋กœ ๋ง์„ ๊ฑธ์–ด์„œ โ†’ Service appProtocol: h2c + Kestrel Protocols: Http2
  2. TLS๋ฅผ ํ‘ผ ๋’ค์—๋„ :scheme=https ๋ผ๋ฒจ์ด ๋‚จ์•„ Kestrel์ด ๊ฑฐ๋ถ€ํ•ด์„œ โ†’ AllowAlternateSchemes = true

๋‘˜์€ ๋‹ค๋ฅธ ์ธต์˜ ๋ฌธ์ œ๋ผ ๋‘˜ ๋‹ค ๋งž์ถฐ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


โ“ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

Q. gRPC๋ฅผ HTTP/1.1๋กœ ์“ธ ์ˆ˜๋Š” ์—†๋‚˜์š”?

์—†์Šต๋‹ˆ๋‹ค. gRPC๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์„ ์œ„ํ•ด HTTP/2๋ฅผ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์–ด, HTTP/2๋ฅผ ๋นผ๋ฉด ๋” ์ด์ƒ gRPC๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

Q. h2์™€ h2c์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋‘˜ ๋‹ค HTTP/2์ž…๋‹ˆ๋‹ค. h2๋Š” TLS ์œ„์—์„œ(์•”ํ˜ธํ™”), h2c๋Š” ํ‰๋ฌธ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ TLS๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋ฐฑ์—”๋“œ๋กœ๋Š” h2c(ํ‰๋ฌธ HTTP/2)๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

Q. Kestrel์„ Http1AndHttp2๋กœ ๋‘๋ฉด ์•ˆ ๋˜๋‚˜์š”?

ํ‰๋ฌธ ํฌํŠธ์—์„œ๋Š” ALPN ํ˜‘์ƒ์ด ์—†์–ด HTTP/1.1๋กœ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. TLS ์ข…๋ฃŒ๊ฐ€ ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์ผ์–ด๋‚˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ํ‰๋ฌธ gRPC ํฌํŠธ๋ฅผ Http2๋กœ ๊ณ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Q. AllowAlternateSchemes๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ํ•„์š”ํ•œ๊ฐ€์š”?

๊ฒŒ์ดํŠธ์›จ์ด/๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ TLS๋ฅผ ์ข…๋ฃŒํ•œ ๋’ค :scheme์„ ์›๋ž˜ ๊ฐ’(https)์œผ๋กœ ์œ ์ง€ํ•œ ์ฑ„ ํ‰๋ฌธ์œผ๋กœ ๋ฐฑ์—”๋“œ์— ์ „๋‹ฌํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์ด ์—†์œผ๋ฉด Kestrel์ด scheme๊ณผ ์ „์†ก ๋ฐฉ์‹ ๋ถˆ์ผ์น˜๋กœ ์—ฐ๊ฒฐ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“š ์ฐธ๊ณ 

</content> </invoke>

This post is licensed under CC BY 4.0 by the author.