Post

[Kubernetes] ๐Ÿ”’ Gateway API๋กœ HTTPโ†’HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (HTTPRoute RequestRedirect)

Gateway API์˜ ํ‘œ์ค€ ํ•„ํ„ฐ RequestRedirect๋กœ HTTP๋ฅผ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์Šค๋„ˆ 2๊ฐœ+๋ผ์šฐํŠธ 2๊ฐœ ๊ธฐ๋ณธํ˜•๋ถ€ํ„ฐ allowedRoutes๋กœ ํ‰๋ฌธ ๋…ธ์ถœ์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ์‹ค๋ฌด ํŒจํ„ด๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

[Kubernetes] ๐Ÿ”’ Gateway API๋กœ HTTPโ†’HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (HTTPRoute RequestRedirect)

Gateway API์—์„œ HTTPโ†’HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋Š” Ingress์˜ annotation(ssl-redirect)์ด ์•„๋‹ˆ๋ผ ํ‘œ์ค€ ํ•„ํ„ฐ RequestRedirect๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” HTTP(80)ยทHTTPS(443) ๋ฆฌ์Šค๋„ˆ 2๊ฐœ + HTTPRoute 2๊ฐœ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธํ˜•๊ณผ, ์•ฑ ํŒ€์ด sectionName์„ ๋น ๋œจ๋ ค๋„ ํ‰๋ฌธ ๋…ธ์ถœ์ด ์•ˆ ๋˜๋„๋ก allowedRoutes๋กœ 80 ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ž ๊ทธ๋Š” ์‹ค๋ฌด ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  โ€œ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ http๊ฐ€ ๊ณ„์† ๋˜๋Š”โ€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค gRPC ์‚ฝ์งˆ์—์„œ ์ถœ๋ฐœํ•ด HTTP/2ยทTLSยท๋กœ๋“œ๋ฐธ๋Ÿฐ์„œยทGateway APIยท์ธ์ฆ์„œ๊นŒ์ง€ ํ’€์–ด๊ฐ€๋Š” ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ์•ž์„  Ingress โ†’ Gateway API ํŽธ๊ณผ cert-manager TLS ํŽธ์„ ๋จผ์ € ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค.


๐ŸŽฏ ํ•ต์‹ฌ: RequestRedirect ํ•„ํ„ฐ

RequestRedirect๋Š” ํด๋ผ์ด์–ธํŠธ์— 3XX ์‘๋‹ต์„ ๋Œ๋ ค์ค˜ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋‹ค์‹œ ์š”์ฒญํ•˜๊ฒŒ ํ•˜๋Š” Gateway API ํ‘œ์ค€ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. HTTPRoute์˜ rules[].filters์— type: RequestRedirect๋ฅผ ์„ ์–ธํ•˜๊ณ , HTTPโ†’HTTPS ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” scheme: https + statusCode: 301์ด ์ •์„์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
rules:
- filters:
  - type: RequestRedirect
    requestRedirect:
      scheme: https
      statusCode: 301

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋Š” ์ง€์ •ํ•œ URL ์š”์†Œ๋งŒ ๋ฐ”๊พธ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด GET http://redirect.example/cinnamon ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ต๋ฉ๋‹ˆ๋‹ค.

1
2
HTTP/1.1 301 Moved Permanently
location: https://redirect.example/cinnamon

scheme๋งŒ https๋กœ ๋ฐ”๋€Œ๊ณ  host(redirect.example)ยทpath(/cinnamon)๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

โš ๏ธ RequestRedirect์™€ URLRewrite๋Š” ํ•œ rule ์•ˆ์—์„œ ๋™์‹œ์— ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. RequestRedirect๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ 3XX๋กœ โ€œ๋‹ค์‹œ ์š”์ฒญํ•ด๋ผโ€๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๊ณ , URLRewrite๋Š” ๋ฐฑ์—”๋“œ๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— ์š”์ฒญ์„ ์กฐ์šฉํžˆ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋ผ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ง€์›ํ•˜๋Š” ์ƒํƒœ ์ฝ”๋“œ๋Š”?

์ฝ”๋“œ์˜๋ฏธ๋ฉ”๋ชจ
301์˜๊ตฌ ์ด๋™ (Moved Permanently)HTTPโ†’HTTPS ์—…๊ทธ๋ ˆ์ด๋“œ ๊ถŒ์žฅ
302์ž„์‹œ (Found)statusCode ์ƒ๋žต ์‹œ ๊ธฐ๋ณธ๊ฐ’
303See OtherPOSTโ†’GET ํŒจํ„ด
307์ž„์‹œ + ๋ฉ”์„œ๋“œ ๋ณด์กดExtended ์ง€์›
308์˜๊ตฌ + ๋ฉ”์„œ๋“œ ๋ณด์กดExtended ์ง€์›

๐Ÿ’ก 307/308๊ณผ path ๋‹จ์œ„ redirect๋Š” โ€œExtendedโ€ ์ง€์›์ด๋ผ ๊ตฌํ˜„์ฒด(ContourยทIstioยทEnvoy Gateway ๋“ฑ)๋ณ„๋กœ ์ง€์› ์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์ „ conformance ๋ฌธ์„œ๋กœ ํ™•์ธํ•˜์„ธ์š”.


๐Ÿงฑ ๊ธฐ๋ณธ ๊ตฌ์„ฑ: ๋ฆฌ์Šค๋„ˆ 2๊ฐœ + ๋ผ์šฐํŠธ 2๊ฐœ

HTTPโ†’HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์˜ ๊ธฐ๋ณธํ˜•์€ Gateway์— 80ยท443 ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ชจ๋‘ ๋‘๊ณ , HTTPRoute๋ฅผ 2๊ฐœ(80=๋ฆฌ๋‹ค์ด๋ ‰ํŠธ, 443=๋ฐฑ์—”๋“œ ์ „๋‹ฌ) ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1๏ธโƒฃ Gateway โ€” HTTPยทHTTPS ๋ฆฌ์Šค๋„ˆ ๋‘˜ ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: redirect-gateway
  namespace: gateway-system        # ํ”Œ๋žซํผํŒ€ ์†Œ์œ 
spec:
  gatewayClassName: foo-lb
  listeners:
  - name: http
    protocol: HTTP
    port: 80
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      certificateRefs:
      - name: redirect-example      # TLS Secret (cert-manager๊ฐ€ ๋ฐœ๊ธ‰)

2๏ธโƒฃ HTTPRoute โ‘  โ€” 80 ๋ฆฌ์Šค๋„ˆ์— ๋ถ™์—ฌ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-filter-redirect
  namespace: gateway-system        # 80 ๋ฆฌ์Šค๋„ˆ์— ๋ถ™์ด๋ ค๋ฉด Gateway์™€ ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
spec:
  parentRefs:
  - name: redirect-gateway
    sectionName: http              # http(80) ๋ฆฌ์Šค๋„ˆ๋งŒ ์„ ํƒ
  hostnames:
  - redirect.example
  rules:
  - filters:
    - type: RequestRedirect
      requestRedirect:
        scheme: https
        statusCode: 301

3๏ธโƒฃ HTTPRoute โ‘ก โ€” 443 ๋ฆฌ์Šค๋„ˆ์— ๋ถ™์—ฌ ๋ฐฑ์—”๋“œ๋กœ ์ „๋‹ฌ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-route
  namespace: team-a                # ์•ฑ ํŒ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
  labels:
    gateway-access: "true"         # 443 ๋ฆฌ์Šค๋„ˆ allowedRoutes selector์™€ ๋งค์นญ (์•„๋ž˜ ์ฐธ๊ณ )
spec:
  parentRefs:
  - name: redirect-gateway
    namespace: gateway-system      # Gateway๊ฐ€ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ผ ๋ช…์‹œ
    sectionName: https
  hostnames:
  - redirect.example
  rules:
  - backendRefs:
    - name: example-svc            # team-a ์•ˆ์˜ Service
      port: 80

๐Ÿ’ก ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐฐ์น˜ ๋ฉ”๋ชจ

  • Gateway + ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ โ†’ gateway-system(ํ”Œ๋žซํผ). 80 ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๊ธฐ๋ณธ from: Same์ด๋ผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๋„ ๊ฐ™์€ ns์— ๋‘ฌ์•ผ ๋ถ™์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ ๋ผ์šฐํŠธ โ†’ team-a(์•ฑ ํŒ€). Gateway๊ฐ€ ๋‹ค๋ฅธ ns๋ผ parentRefs.namespace๋ฅผ ๋ช…์‹œํ•˜๊ณ , 443 ๋ฆฌ์Šค๋„ˆ์˜ allowedRoutes๊ฐ€ ์ด ns๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • backendRefs๊ฐ€ ๋‹ค๋ฅธ ns์˜ Service๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๊ทธ์ชฝ์— ReferenceGrant๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ns๋ฉด ๋ถˆํ•„์š”.
  • ๋ชจ๋‘ ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋‘˜ ๊ฑฐ๋ฉด namespace ํ‘œ๊ธฐ๋Š” ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค(๊ณต์‹ ๊ฐ€์ด๋“œ ์˜ˆ์‹œ ํ˜•ํƒœ).

โ“ ์™œ ๋ผ์šฐํŠธ๊ฐ€ ๊ผญ 2๊ฐœ์—ฌ์•ผ ํ•˜๋‚˜?

ํ•œ HTTPRoute์˜ rules๋Š” ๊ทธ ๋ผ์šฐํŠธ๊ฐ€ ๋ถ™์€ ๋ชจ๋“  ๋ฆฌ์Šค๋„ˆ์— ๋˜‘๊ฐ™์ด ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ โ€œ80=๋ฆฌ๋‹ค์ด๋ ‰ํŠธ / 443=๋ฐฑ์—”๋“œ ์ „๋‹ฌโ€์„ ํ•œ ๋ผ์šฐํŠธ ์•ˆ์—์„œ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ญํ• ๋ณ„๋กœ ๋ผ์šฐํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๋Š” ๊ฒŒ์ดํŠธ์›จ์ด๋‹น 1๊ฐœ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ์—์„œ hostnames๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ทธ 80 ๋ฆฌ์Šค๋„ˆ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฑ์ด ์—ฌ๋Ÿฌ ๊ฐœ์—ฌ๋„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๋Š” ํ•˜๋‚˜๋ฉด ๋˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ฐ ์•ฑ์˜ 443 ๋ฐฑ์—”๋“œ ๋ผ์šฐํŠธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์–ด์ฐจํ”ผ ๋งŒ๋“ค ๊ฒƒ).

sectionName: https๋งŒ ๋ฐ•์œผ๋ฉด 404, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค

์•ฑ ๋ผ์šฐํŠธ๋ฅผ 443์—๋งŒ ๊ณ ์ •ํ•˜๋ฉด 80์œผ๋กœ ์˜จ ์š”์ฒญ์€ ๋งค์นญ๋˜๋Š” ๋ผ์šฐํŠธ๊ฐ€ ์—†์–ด 404๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค(๋ฆฌ๋‹ค์ด๋ ‰ํŠธ โŒ). ๋ธŒ๋ผ์šฐ์ €๋กœ ํ…Œ์ŠคํŠธํ–ˆ์„ ๋•Œ https๋กœ ๋„˜์–ด๊ฐ”๋‹ค๋ฉด ๊ทธ๊ฑด ๋ธŒ๋ผ์šฐ์ €์˜ https-first ๋™์ž‘์ผ ๋ฟ, ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. curlยท๋ชจ๋ฐ”์ผ ์•ฑ ๋“ฑ http ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ https๋กœ ๋ณด๋‚ด๋ ค๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๋Š” ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ›ก๏ธ allowedRoutes๋กœ ํ‰๋ฌธ ๋…ธ์ถœ ์›์ฒœ ์ฐจ๋‹จ

์•ฑ ํŒ€์ด sectionName์„ ๋น ๋œจ๋ฆฌ๋ฉด ๊ทธ ๋ผ์šฐํŠธ๊ฐ€ 80 ๋ฆฌ์Šค๋„ˆ์—๋„ ๋ฐ”์ธ๋”ฉ๋ผ ํ‰๋ฌธ(HTTP)์œผ๋กœ ์„œ๋น™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ์˜ โ€œ์˜ˆ์˜โ€์— ๊ธฐ๋Œ€์ง€ ๋ง๊ณ , 80 ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ”Œ๋žซํผ ์ „์šฉ์œผ๋กœ ์ž ๊ฐ€์„œ ๋ง‰๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

sectionName์ด ์—†์œผ๋ฉด ๋ผ์šฐํŠธ๋Š” ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋“  ๋ฆฌ์Šค๋„ˆ(80 ํฌํ•จ)์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด 80์—์„œ ๋ฐฑ์—”๋“œ ๋ผ์šฐํŠธ๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งค์นญ๋˜์–ด ํ‰๋ฌธ ์„œ๋น™์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. allowedRoutes๋กœ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž ๊ธ‰๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
spec:
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same          # ๊ฒŒ์ดํŠธ์›จ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค(=ํ”Œ๋žซํผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ)๋งŒ ํ—ˆ์šฉ
  - name: https
    port: 443
    protocol: HTTPS
    tls:
      mode: Terminate
      certificateRefs:
      - name: redirect-example
    allowedRoutes:
      namespaces:
        from: Selector      # ์•ฑ ํŒ€ ๋ผ์šฐํŠธ๋Š” ์—ฌ๊ธฐ์—๋งŒ
        selector:
          matchLabels:
            gateway-access: "true"

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ ํŒ€์ด sectionName์„ ๋น ๋œจ๋ ค๋„ ๊ทธ ๋ผ์šฐํŠธ๋Š” 80์—์„œ๋Š” ๊ฑฐ๋ถ€๋˜๊ณ  443์—๋งŒ ๋ถ™์Šต๋‹ˆ๋‹ค. 80์€ ํ”Œ๋žซํผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๊ฐ€ ๋…์ ํ•˜๋ฏ€๋กœ ํ‰๋ฌธ ๋…ธ์ถœ์ด ์›์ฒœ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ http๊ฐ€ ๊ณ„์† ๋  ๋•Œ

์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๊ฐ€ 80์— ์ง„์งœ ๋ถ™์—ˆ๋‚˜?

1
kubectl describe httproute http-filter-redirect -n gateway-system

status.parents[].conditions์—์„œ Accepted: True์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•ˆ ๋ถ™๋Š” ํ”ํ•œ ์›์ธ:

  • allowedRoutes ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ถˆ์ผ์น˜(๊ธฐ๋ณธ๊ฐ’์ด Same)
  • sectionName ์˜คํƒ€ (http์ธ๋ฐ https๋กœ ์“ฐ๋Š” ๋“ฑ)
  • parentRefs.namespace ์˜ค๋ฅ˜
  • hostnames ๋ถˆ์ผ์น˜

2๏ธโƒฃ 80์— ๋ฐฑ์—”๋“œ ๋ผ์šฐํŠธ๊ฐ€ ๋ผ์–ด๋“ค์—ˆ๋‚˜?

์•ฑ ๋ผ์šฐํŠธ๊ฐ€ sectionName ์—†์ด 80์—๋„ ๋ถ™์œผ๋ฉด ๋งค์นญ ์šฐ์„ ์ˆœ์œ„์—์„œ ๋ฐฑ์—”๋“œ๊ฐ€ ์ด๊ฒจ ํ‰๋ฌธ์œผ๋กœ ์„œ๋น™๋ฉ๋‹ˆ๋‹ค. โ†’ ์•ฑ ๋ผ์šฐํŠธ์— sectionName: https๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜, ์œ„ allowedRoutes ์ž ๊ธˆ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์š”์ฒญ์ด ์ด Gateway๋ฅผ ๊ฑฐ์น˜๊ธด ํ•˜๋‚˜?

์˜ˆ์ „ ingress-nginx๊ฐ€ ์•„์ง 80์„ ์„œ๋น„์Šคํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜, NodePortยทLB๋กœ ๋ฐฑ์—”๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, port-forward๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒฝ์šฐ Gateway๊ฐ€ ํŠธ๋ž˜ํ”ฝ ๊ฒฝ๋กœ์— ์—†์–ด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ์ ์šฉ๋  ๋ฆฌ ์—†์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋™์ž‘ ํ™•์ธ์€ curl๋กœ ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
curl -I http://redirect.example/cinnamon
# HTTP/1.1 301 Moved Permanently
# location: https://redirect.example/cinnamon

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

Q. Ingress์˜ ssl-redirect annotation๊ณผ ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€์š”?

Ingress๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค nginx.ingress.kubernetes.io/ssl-redirect: "true" ๊ฐ™์€ ๋ฒค๋” ์ „์šฉ annotation์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. Gateway API๋Š” ์ด๋ฅผ ํ‘œ์ค€ ํ•„ํ„ฐ RequestRedirect๋กœ ์ •์˜ํ•ด ๊ตฌํ˜„์ฒด์— ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ์ŠคํŽ™์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Q. 301๊ณผ 302 ์ค‘ ๋ฌด์—‡์„ ์จ์•ผ ํ•˜๋‚˜์š”?

HTTPโ†’HTTPS ์˜๊ตฌ ์ „ํ™˜์—๋Š” 301(์˜๊ตฌ ์ด๋™)์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €ยท๊ฒ€์ƒ‰์—”์ง„์ด ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•ด ๋‹ค์Œ๋ถ€ํ„ฐ ๋ฐ”๋กœ https๋กœ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. statusCode๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ 302(์ž„์‹œ)์ž…๋‹ˆ๋‹ค.

Q. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๋ฅผ ๋นผ๊ณ  443 ๋ผ์šฐํŠธ๋งŒ ๋‘๋ฉด ์•ˆ ๋˜๋‚˜์š”?

๋ธŒ๋ผ์šฐ์ €๋Š” https-first ๋™์ž‘ ๋•Œ๋ฌธ์— ์ž˜ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, 80์œผ๋กœ ์ง์ ‘ ์˜จ ์š”์ฒญ(curlยท๊ตฌํ˜• ํด๋ผ์ด์–ธํŠธยท์™ธ๋ถ€ ์—ฐ๋™)์€ 404๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๋ถ€๋“œ๋Ÿฌ์šด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋ณด์žฅํ•˜๋ ค๋ฉด 80 ๋ฆฌ์Šค๋„ˆ์— ๋ถ™๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋ผ์šฐํŠธ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Q. POST ์š”์ฒญ๋„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๋‚˜์š”?

301/302๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ ๋ฉ”์„œ๋“œ๊ฐ€ GET์œผ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. POST ๋“ฑ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด์กดํ•ด์•ผ ํ•˜๋ฉด 307/308์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด๋Š” Extended ์ง€์›์ด๋ผ ๊ตฌํ˜„์ฒด ์ง€์› ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”.


๐Ÿ“š ์ฐธ๊ณ 

</content> </invoke>

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