[Kubernetes] ๐ ์ธ์ฆ์์ cert-manager: ๋ ๊ฐ๋ PKI์ TLS ์๋ํ
keyยทcertยทCAยทTLS ์ฉ์ด๋ฅผ ์ ๋ถ์ฆ ๋น์ ๋ก ์ ๋ฆฌํ๊ณ , ์ฟ ๋ฒ๋คํฐ์ค์ ๋ ๊ฐ๋ PKI(ํด๋ฌ์คํฐ ๋ด๋ถ vs ์ฑ/์ธ๊ทธ๋ ์ค)์ cert-manager์ ์ธ์ฆ์ ๋ฐ๊ธยท๊ฐฑ์ ์๋ํ๋ฅผ ๋ค๋ฃน๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๋ค๋ฃจ๋ค ๋ณด๋ฉด kubeadm๋ก ํด๋ฌ์คํฐ๋ฅผ ์ธ์ธ ๋๋ ์ธ์ฆ์๊ฐ ๋์ค๊ณ , IngressยทGateway์๋ ์ธ์ฆ์๊ฐ ๋์ต๋๋ค. ๊ฐ์ ๊ฑธ๊น์? ์ด ๊ธ์์๋ keyยทcertยทCAยทTLS ์ฉ์ด๋ฅผ ์ ๋ถ์ฆ ๋น์ ๋ก ์ ๋ฆฌํ๊ณ , ์ฟ ๋ฒ๋คํฐ์ค์ PKI๊ฐ ๋ ๊ฐ๋(ํด๋ฌ์คํฐ ๋ด๋ถ mTLS vs ์ฑ/์ธ๊ทธ๋ ์ค TLS)๋ก ๋ณ๊ฐ๋ผ๋ ์ , ๊ทธ๋ฆฌ๊ณ cert-manager๊ฐ โ๋ฐ์ ์ธ์ฆ์๋ฅผ ๋ฃ๋โ ๊ฒ ์๋๋ผ ๋ฐ๊ธยท๊ฐฑ์ ํ์๋ฅผ ์๋ํํ๋ค๋ ํต์ฌ์ ๋ค๋ฃน๋๋ค.
์ด ์๋ฆฌ์ฆ๋ ์ฟ ๋ฒ๋คํฐ์ค gRPC ์ฝ์ง์์ ์ถ๋ฐํด HTTP/2ยทTLSยท๋ก๋๋ฐธ๋ฐ์ยทGateway APIยท์ธ์ฆ์๊น์ง ํ์ด๊ฐ๋ ๊ธฐ๋ก์ ๋๋ค. ์ด๋ฒ 6ํธ์ ์ธ์ฆ์์ cert-manager ํธ์ ๋๋ค. ์์ 2ํธ(h2 vs h2c), 5ํธ(Gateway API)์ ๋จผ์ ๋ณด๋ฉด ์ข์ต๋๋ค.
๐ชช ์ฉ์ด 4๊ฐ โ ๊ฒฝ์ ๊ด๊ณ๊ฐ ์๋๋ผ ํ ์์คํ ์ ์ญํ ๋ค
keyยทCAยทcertificateยทTLS๋ ์๋ก ๋ค๋ฅธ ์ ํ์ง๊ฐ ์๋๋ผ, ํ๋์ ์ ๋ถ์ฆ ์์คํ ์ ์ด๋ฃจ๋ ์ญํ ๋ค์ ๋๋ค.
| ์ฉ์ด | ์ ๋ถ์ฆ ๋น์ | ์ค์ ์๋ฏธ |
|---|---|---|
| key(ํค) | ๋๋ง ๋ง๋ค ์ ์๋ ์๋ช | ๊ฐ์ธํค + ๊ฒ์ฆ์ฉ ๊ณต๊ฐํค. ๋ชจ๋ ๊ฒ์ ํ ๋ |
| CA(์ธ์ฆ๊ธฐ๊ด) | ์ ๋ถ์ฆ ๋ฐ๊ธ ๊ธฐ๊ด(์ ๋ถ) | ์๊ธฐ ํค(CA key)๋ก ์ธ์ฆ์์ ๋์ฅ์ ์ฐ์ |
| certificate(cert/crt) | ์ ๋ถ์ฆ ์นด๋ ๊ทธ ์์ฒด | ๊ณต๊ฐํค + ์ ์ + CA์ ์๋ช |
| TLS | ๊ฒ๋ฌธ์์์ ์ ๋ถ์ฆ ์ ์ยท๊ฒ์ฆ | ์ ์ฌ๋ฃ๋ฅผ ์ค์ ๋ก ์ฐ๋ ํ๋กํ ์ฝ |
์ ๋ฆฌํ๋ฉด โCA๊ฐ ์๊ธฐ ํค๋ก ์ธ์ฆ์(์ ๋ถ์ฆ)์ ์๋ช ํ๊ณ , TLS๊ฐ ์ฐ๊ฒฐํ ๋ ๊ทธ๊ฑธ ์ ์ยท๊ฒ์ฆํ๋ค.โ ๋ท์ด ํ ํ๋ฆ์ ๋ถํ์ด์ง, ์๋ก ๋ค๋ฅธ ์ ํ์ง๊ฐ ์๋๋๋ค.
๐ด ํท๊ฐ๋ฆผ์ ํต์ฌ: ๊ฐ์ ๊ธฐ์ ์ ์ฐ๋ ๋ณ๊ฐ์ ๋ ์ฒด๊ณ
์ฟ ๋ฒ๋คํฐ์ค์๋ ์์ ํ ๋ณ๊ฐ์ธ ๋ ์ข ๋ฅ์ ์ธ์ฆ์ ์ฒด๊ณ๊ฐ ์๊ณ , ๋ ๋ค ๊ฐ์ ๊ธฐ์ (X.509 + TLS)์ ์จ์ ๋๊ฐ์ ๋ณด์ ๋๋ค. ์ฌ๊ธฐ๊ฐ ์ง์ง ํจ์ ์ ๋๋ค.
โ ํด๋ฌ์คํฐ ๋ด๋ถ PKI (kubeadm certs) โ ์ปดํฌ๋ํธ๋ผ๋ฆฌ ์ธ์ฆ์ฉ
- ํด๋ฌ์คํฐ์ ์์ฒด CA(
ca.crt/ca.key)๊ฐ ์๊ณ , ๊ทธ๊ฒ API ์๋ฒยทetcdยทkubelet ๋ฑ์ ์ธ์ฆ์๋ฅผ ์๋ช ํฉ๋๋ค. - ์ปดํฌ๋ํธ๋ค์ โ์๋ ์ธ์ฆ์๊ฐ ์ฐ๋ฆฌ ํด๋ฌ์คํฐ CA๊ฐ ์๋ช ํ ๊ฑฐ๋โ๋ก ์๋ก๋ฅผ ๋ฏฟ์ต๋๋ค(mTLS, ์ํธ ์ธ์ฆ).
- ์ด๊ฒ ๋ณดํต ๊ฐฑ์ ํ๋ ๊ทธ ์ธ์ฆ์์ ๋๋ค. (์์ฌ๊ท(leaf) ์ธ์ฆ์๋ ๊ธฐ๋ณธ 1๋ , CA ์์ฒด๋ ๋ณดํต 10๋ )
- ๊ด๋ฆฌ ๋๊ตฌ: kubeadm (
kubeadm certs renew๋ฑ). ์ธ๋ถ ์๋น์ค์ ๋ฌด๊ด.
โก ์ฑ/์ธ๊ทธ๋ ์ค TLS (GatewayยทIngress + cert-manager) โ ์ธ๋ถ ํด๋ผ์ด์ธํธ์ฉ
- ๊ณต์ธ CA(๋๋ ์ฌ๋ด CA)๊ฐ
a.example.com๊ฐ์ ๋๋ฉ์ธ ์ธ์ฆ์๋ฅผ ์๋ช ํฉ๋๋ค. - ์ธ๋ถ ๋ธ๋ผ์ฐ์ ยทํด๋ผ์ด์ธํธ๊ฐ โ์ด https ์๋ฒ ๋ฏฟ์ด๋ ๋๋โ๋ฅผ ํ๋จํ๋ ์ฉ๋์ ๋๋ค.
- ๊ด๋ฆฌ ๋๊ตฌ: cert-manager๋ ์๋ Secret. ํด๋ฌ์คํฐ ๋ด๋ถ ํต์ ๊ณผ ๋ฌด๊ด.
๐ง ๋์ ๋ณ๊ฐ์ CA, ๋ณ๊ฐ์ ๋ชฉ์ , ๋ณ๊ฐ์ ์๋ช ยท๊ด๋ฆฌ ๋๊ตฌ์ ๋๋ค. ํด๋ฌ์คํฐ CA๋
a.example.com์ธ์ฆ์์ ์๋ฌด ์๊ด์ด ์๊ณ , ๋ธ๋ผ์ฐ์ ๋ ํด๋ฌ์คํฐ CA๋ฅผ ๋ชจ๋ฅด๋ฉฐ, ์ปดํฌ๋ํธ๋ค์ Letโs Encrypt๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ธฐ์ ์ ๊ฐ์ง๋ง(X.509+TLS), ๋ค๋ฅธ ๊ฑด โ๋๊ตฌ๋ฅผ ์ํ ์ ๋ขฐ๋โ โ โ ์ ํด๋ฌ์คํฐ ์๊ตฌ๋ค๋ผ๋ฆฌ, โก๋ ๋ฐ๊นฅ ์๋์๊ฒ์ ๋๋ค.
| ๊ตฌ๋ถ | โ ํด๋ฌ์คํฐ ๋ด๋ถ PKI | โก ์ฑ/์ธ๊ทธ๋ ์ค TLS |
|---|---|---|
| ๋ชฉ์ | ์ปดํฌ๋ํธ ์ํธ ์ธ์ฆ(mTLS) | ์ธ๋ถ ํด๋ผ์ด์ธํธ ์ ๋ขฐ |
| CA | ํด๋ฌ์คํฐ ์์ฒด CA | ๊ณต์ธ/์ฌ๋ด CA (Letโs Encrypt ๋ฑ) |
| ์๋ช | leaf 1๋ , CA 10๋ | ๋ฐ๊ธ์ฒ๋ณ(Letโs Encrypt 90์ผ) |
| ๊ด๋ฆฌ | kubeadm | cert-manager / ์๋ Secret |
์ด์ ๋ถํฐ๋ โก(์ฑ/์ธ๊ทธ๋ ์ค TLS) ์๊ธฐ์ ๋๋ค.
๐ข Gateway์์ TLS๋ฅผ ์ค์ํํ๊ธฐ
Gateway API์์๋ TLS ์ค์ ์ด Gateway์ listener๋ก ์ฌ๋ผ๊ฐ, TLS ๊ฐ์ธํค๊ฐ ํ๋ซํผํ ํ ๊ณณ์ ๋ชจ์ ๋๋ค. 5ํธ์์ ๋ณธ ์ญํ ๋ถ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ณด์ ์ด์ ์ผ๋ก ์ด์ด์ง๋๋ค.
์์ Ingress ๋ฐฉ์์ ์ฝ์ : Ingress์ TLS Secret์ Ingress์ ๊ฐ์ ๋ค์์คํ์ด์ค, ์ฆ ์ฑํ ๋ค์์คํ์ด์ค์ ์์ด์ผ ํ์ต๋๋ค. ๊ทธ๋์ TLS ๊ฐ์ธํค๊ฐ ํ๋ง๋ค ํฉ์ด์ก๊ณ , ๊ด๋ฆฌยท๊ฐ์ฌ ๋ฒ์๊ฐ ์ปธ์ต๋๋ค.
Gateway API์์๋ Gateway(ํ๋ซํผํ ๋ฆฌ์์ค)์ listener์ TLS๋ฅผ ๋๋ฏ๋ก, ๊ฐ์ธํค๊ฐ ํ๋ซํผํ ํ ๊ณณ์ ๋ชจ์ด๊ณ ์ฑํ์ Route๋ง ๋ถ์ ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
kind: Gateway
metadata:
name: shared-gateway
namespace: gateway-system # ํ๋ซํผํ ์์
spec:
listeners:
- name: team-a
port: 443
protocol: HTTPS
hostname: "a.example.com" # ํ๋ก์ ํธ๋ณ ๋๋ฉ์ธ
tls:
mode: Terminate
certificateRefs:
- name: team-a-tls # ํ๋ก์ ํธ๋ณ ์ธ์ฆ์
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
team: a
- ํ๋ก์ ํธ๋ณ๋ก ๋ค๋ฅธ ์ธ์ฆ์๋ ๊ฐ๋ฅํฉ๋๋ค. listener๋ฅผ ๋๋ฉ์ธ๋ณ๋ก ๋๋๋ฉด TLS์ SNI(์ ์ํ๋ ค๋ ๋๋ฉ์ธ)๋ก ์ธ์ฆ์๊ฐ ์๋ ์ ํ๋ฉ๋๋ค.
- ์ถ๊ฐ ํต์ ์ฅ์น:
allowedRoutes๋ก ์ด๋ ๋ค์์คํ์ด์ค์ Route๋ง ๋ถ์์ง ์ ํํ๊ณ , ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ Secret์ ์ฐธ์กฐํ๋ ค๋ฉด ReferenceGrant๋ก ๋ช ์์ ํ์ฉ์ด ํ์ํฉ๋๋ค(ํฌ๋ก์ค ๋ค์์คํ์ด์ค ์ ๊ทผ ๊ธฐ๋ณธ ์ฐจ๋จ = ๋ณด์ ๊ธฐ๋ฅ). - HTTPRoute๊ฐ ์ด๋ listener์ ๋ถ์์ง๋
hostname๊ต์งํฉ์ผ๋ก ์๋ ๋งค์นญ๋๊ณ , ๋ช ํํ ํ๋ ค๋ฉดsectionName(listener ์ด๋ฆ)์ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๐ค cert-manager โ โ๋ฐ์ ์ธ์ฆ์๋ฅผ ๋ฃ๋โ ๊ฒ ์๋๋ผ โ๋ฐ๋ ํ์๋ฅผ ์๋ํโ
cert-manager๋ ๋ด๋น์์๊ฒ ๋ฐ์ ์ธ์ฆ์๋ฅผ ๋ฃ์ด์ฃผ๋ ๋๊ตฌ๊ฐ ์๋๋ผ, ์ง์ ๊ฐ์ธํค๋ฅผ ๋ง๋ค๊ณ CA์ ์ธ์ฆ์๋ฅผ ์์ฒญํด ๋ฐ์์ค๋ ๋๊ตฌ์ ๋๋ค. ์๋ ๋ฐฉํฅ์ด ๋ฐ๋๋ผ๋ ์ ์ด ํฐ ์คํด ํฌ์ธํธ์ ๋๋ค. ์ฆ ์์ฑ๋ ์ธ์ฆ์๋ฅผ ์ฌ๋ํํ ๋ฐ์ ๋ฃ๋ ๊ฒ ์๋๋ผ, ์ฌ๋์ ์์ ๊ฑฐ์น๋ ๋จ๊ณ ์์ฒด๋ฅผ ์์ฑ๋๋ค.
์๋ํ ํ๋ฆ
- cert-manager ์ค์น (ํด๋ฌ์คํฐ์ Pod๋ก)
- Issuer/ClusterIssuer ์ ์ โ โ์ธ์ฆ์๋ฅผ ์ด๋์ ๋ฐ์์งโ(Letโs Encrypt, Vault, ์ฌ๋ด CA ๋ฑ)
- Certificate ์์ฑ(๋๋ ์ ๋ํ ์ด์ ) โ โa.example.com ์ธ์ฆ์ ํ์โ
- cert-manager๊ฐ ๋ฐ๊ธ์ฒ์ ํต์ ํ๊ณ ๋๋ฉ์ธ ์์ ๋ฅผ ์ฆ๋ช (HTTP-01 / DNS-01 ์ฑ๋ฆฐ์ง)
- ๋ฐ์ ์ธ์ฆ์+ํค๋ฅผ Secret์ ์๋ ์ ์ฅ โ Gateway๊ฐ ๊ทธ Secret ์ฐธ์กฐ
- ๋ง๋ฃ ์ ์๋ ๊ฐฑ์ (์: Letโs Encrypt๋ 90์ผ)
ํต์ฌ์ ์ฌ๋์ด ๊ฐ์ธํค๋ฅผ ๋ง๋ค๊ฑฐ๋ secret.yaml์ ์ฃผ๊ณ ๋ฐ์ ์ผ์ด ์ฌ๋ผ์ง๋ค๋ ๊ฒ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ClusterIssuer (Let's Encrypt ACME)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
class: nginx
---
# Certificate โ cert-manager๊ฐ ๋ฐ๊ธยท๊ฐฑ์ ยทSecret ์ ์ฅ์ ์๋ ์ฒ๋ฆฌ
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: team-a-tls
namespace: gateway-system
spec:
secretName: team-a-tls # Gateway๊ฐ ์ฐธ์กฐํ๋ Secret ์ด๋ฆ
dnsNames:
- a.example.com
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
๋ฐ๊ธ์ฒ(issuer) ์ข ๋ฅ๋ ๋ค์ํฉ๋๋ค: ACME(Letโs Encrypt ๋ฑ), HashiCorp Vault, Venafi, ์ฌ๋ด CA, self-signed. ํต์ฌ์ โ์ฌ๋์ด ์๋๋ผ ํ๋ก๊ทธ๋จ์ด ์๋์ผ๋ก ์์ฒญยท์๋ นํ ์ ์๋ ๋ฐ๊ธ์ฒโ๋ผ๋ ์ ์ ๋๋ค.
โ ๏ธ cert-manager๊ฐ ์๋ ๋ฐ๊ธ์ ๋์ฒดํ๋ ค๋ฉด ํ์ฌ CA๊ฐ ์๋ ์ฐ๋(ACME/Vault ๋ฑ) ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ์์ ์๋ ๋ฐ๊ธ๋ฟ์ด๋ฉด cert-manager๊ฐ ๊ทธ ๋ฐ๊ธ์ ์๋ํํ์ง ๋ชปํฉ๋๋ค.
์๋ ๋ฐ๊ธ์ ์ ์งํด์ผ ํ๋ค๋ฉด ์ ์ด๋ secret.yaml์ ์์ผ๋ก ์ฐ๋ ๋์ ์ด๋ ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
1
2
kubectl create secret tls my-tls \
--cert=tls.crt --key=tls.key -n my-namespace
๐ ํ ์ค ์์ฝ
- keyยทcertยทCAยทTLS๋ ํ ์ ๋ถ์ฆ ์์คํ ์ ์ญํ ๋ค์ ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค์ PKI๊ฐ ๋ ๊ฐ๋ โ ํด๋ฌ์คํฐ ๋ด๋ถ(kubeadm, mTLS)์ ์ฑ/์ธ๊ทธ๋ ์ค TLS โ ๋ก ์์ ํ ๋ณ๊ฐ์ ๋๋ค.
- cert-manager๋ โ๋ฐ์ ์ธ์ฆ์๋ฅผ ๋ฃ๋โ ๊ฒ ์๋๋ผ โ๋ฐ๋ ํ์(๋ฐ๊ธยท๊ฐฑ์ )๋ฅผ ์๋ํโ ํ๋ ๋๊ตฌ์ด๋ฉฐ, ์๋ ์ฐ๋ ๊ฐ๋ฅํ CA๊ฐ ์ ์ ์ ๋๋ค.
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Q. kubeadm ์ธ์ฆ์์ Ingress TLS ์ธ์ฆ์๋ ๊ฐ์ ๊ฑด๊ฐ์?
์๋๋๋ค. kubeadm ์ธ์ฆ์๋ ํด๋ฌ์คํฐ ์ปดํฌ๋ํธ๋ผ๋ฆฌ์ mTLS์ฉ(ํด๋ฌ์คํฐ ์์ฒด CA), Ingress/Gateway TLS๋ ์ธ๋ถ ํด๋ผ์ด์ธํธ์ฉ(๊ณต์ธ/์ฌ๋ด CA)์ ๋๋ค. CAยท๋ชฉ์ ยท์๋ช ยท๊ด๋ฆฌ ๋๊ตฌ๊ฐ ๋ชจ๋ ๋ค๋ฆ ๋๋ค.
Q. cert-manager์ ํ์ฌ์์ ๋ฐ์ .pfx๋ฅผ ๋ฃ์ผ๋ฉด ๊ด๋ฆฌํด์ฃผ๋์?
๊ทธ๊ฒ cert-manager์ ๋ฐฉ์์ด ์๋๋๋ค. cert-manager๋ ์ง์ ํค๋ฅผ ๋ง๋ค๊ณ CA์ ๋ฐ๊ธ์ ์์ฒญํฉ๋๋ค. ํ์ฌ CA๊ฐ ACME/Vault ๋ฑ์ผ๋ก ์๋ ์ฐ๋๋์ง ์๊ณ ์์ ์๋ ๋ฐ๊ธ๋ง ํ๋ค๋ฉด, cert-manager๋ก ์๋ํํ ์ ์์ต๋๋ค.
Q. Letโs Encrypt ์ธ์ฆ์ ์ ํจ๊ธฐ๊ฐ์ ์ผ๋ง์ธ๊ฐ์?
90์ผ์ ๋๋ค. cert-manager๋ ๋ง๋ฃ ์ ์ ์๋์ผ๋ก ๊ฐฑ์ ํ๋ฏ๋ก ์๋ ๊ฐ์ ์ด ํ์ ์์ต๋๋ค.
Q. HTTP-01๊ณผ DNS-01 ์ฑ๋ฆฐ์ง์ ์ฐจ์ด๋?
๋ ๋ค ๋๋ฉ์ธ ์์ ๋ฅผ ์ฆ๋ช
ํ๋ ๋ฐฉ์์
๋๋ค. HTTP-01์ ๋๋ฉ์ธ์ ํน์ ๊ฒฝ๋ก์ ํ ํฐ์ ๋
ธ์ถ(80 ํฌํธ ํ์), DNS-01์ DNS TXT ๋ ์ฝ๋๋ก ์ฆ๋ช
ํฉ๋๋ค. ์์ผ๋์นด๋ ์ธ์ฆ์(*.example.com)๋ DNS-01๋ง ๊ฐ๋ฅํฉ๋๋ค.
Q. Gateway API์์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์ธ์ฆ์ Secret์ ์ฐธ์กฐํ๋ ค๋ฉด?
ReferenceGrant๋ก ๋ช ์์ ํ์ฉ์ด ํ์ํฉ๋๋ค. ํฌ๋ก์ค ๋ค์์คํ์ด์ค ์ ๊ทผ์ ๊ธฐ๋ณธ ์ฐจ๋จ๋์ด ์์ด, ์ด ๋ณด์ ๊ธฐ๋ฅ์ ํตํด ์ด๋ค ๋ค์์คํ์ด์ค๊ฐ ์ด๋ค ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋์ง ํต์ ํฉ๋๋ค.
๐ ์ฐธ๊ณ
- cert-manager ๊ณต์ ๋ฌธ์
- cert-manager - ACME / Letโs Encrypt Issuer
- Kubernetes Docs - PKI certificates and requirements
- Kubernetes Docs - Certificate Management with kubeadm
- Gateway API - TLS Configuration
- ๊ด๋ จ ๊ธ: Gateway API (5ํธ) ยท h2 vs h2c (2ํธ)
</content>