Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.16] 2๋ถ€ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ #10 | Istio CORS ์„ค์ • ๋ฐ HTTPS ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ

ygtoken 2025. 3. 18. 11:41
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ CORS(Cross-Origin Resource Sharing) ์„ค์ • ๋ฐ HTTPS ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
CORS๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ…์ด๋ฉฐ,
HTTPS๋Š” ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด TLS๋ฅผ ์ ์šฉํ•œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” CORS ๊ฐœ๋…๊ณผ ์„ค์ • ๋ฐฉ๋ฒ•, Istio Gateway๋ฅผ ํ™œ์šฉํ•œ HTTPS ์ ์šฉ ๋ฐฉ๋ฒ•,
๊ทธ๋ฆฌ๊ณ  VirtualService๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTPS ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. CORS(Cross-Origin Resource Sharing)๋ž€?

โœ… 1.1 CORS ๊ฐœ๋…

CORS๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๊ฐ„์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ API ์š”์ฒญ์„ ์ฐจ๋‹จํ•˜์ง€๋งŒ,
CORS ์„ค์ •์„ ํ†ตํ•ด ํŠน์ • ๋„๋ฉ”์ธ์—์„œ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CORS ์ •์ฑ…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์š”์ฒญ ์ฐจ๋‹จ ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ํŠน์ • ๋„๋ฉ”์ธ์—์„œ๋งŒ API ์š”์ฒญ์„ ํ—ˆ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์šด์˜๋  ๊ฒฝ์šฐ CORS ์ •์ฑ…์„ ์ ์šฉํ•ด์•ผ ํ•จ

โœ… 1.2 Istio์—์„œ CORS ์„ค์ •

Istio์—์„œ๋Š” VirtualService๋ฅผ ํ™œ์šฉํ•˜์—ฌ CORS ์ •์ฑ…์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜๋Š” ํŠน์ • ๋„๋ฉ”์ธ์—์„œ๋งŒ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” CORS ์„ค์ • ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
    - my-service
  http:
    - corsPolicy:
        allowOrigin:
          - "https://allowed-domain.com"  # ํŠน์ • ๋„๋ฉ”์ธ์—์„œ๋งŒ ์š”์ฒญ ํ—ˆ์šฉ
        allowMethods:
          - GET
          - POST
          - OPTIONS
        allowHeaders:
          - Authorization
          - Content-Type
        maxAge: "24h"  # CORS ์บ์‹œ ์œ ์ง€ ์‹œ๊ฐ„
    - route:
        - destination:
            host: my-service
            port:
              number: 8080

์„ค๋ช…:

  • corsPolicy.allowOrigin: "https://allowed-domain.com" → ํŠน์ • ๋„๋ฉ”์ธ์—์„œ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • allowMethods: [GET, POST, OPTIONS] → ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ ์ง€์ •
  • allowHeaders: [Authorization, Content-Type] → ํ—ˆ์šฉํ•  HTTP ํ—ค๋” ์ง€์ •
  • maxAge: "24h" → CORS ์บ์‹œ๋ฅผ 24์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€ํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์šด์˜๋  ๋•Œ CORS ์ •์ฑ…์„ ์ ์šฉํ•ด์•ผ ํ•จ
  • API ์š”์ฒญ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฐจ๋‹จ๋˜์ง€ ์•Š๋„๋ก ํ—ˆ์šฉํ•  ๋„๋ฉ”์ธ ์„ค์ • ๊ฐ€๋Šฅ

๐Ÿ”น 2. HTTPS ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

โœ… 2.1 Istio Gateway๋ฅผ ํ™œ์šฉํ•œ HTTPS ์„ค์ •

HTTPS๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด TLS ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ Istio Gateway์—์„œ HTTPS ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  TLS ์ธ์ฆ์„œ Secret ์ƒ์„ฑ

kubectl create -n istio-system secret tls my-tls-secret \
  --key tls.key \
  --cert tls.crt

โ‘ก HTTPS ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Istio Gateway ์„ค์ •

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-secure-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 443  # HTTPS ํฌํŠธ
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE  # HTTPS ์‚ฌ์šฉ
        credentialName: my-tls-secret  # Secret์—์„œ TLS ์ธ์ฆ์„œ ๋กœ๋“œ
      hosts:
        - "example.com"  # ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ๋งŒ HTTPS ์ ์šฉ

์„ค๋ช…:

  • tls.mode: SIMPLE → TLS๋ฅผ ์ ์šฉํ•˜์—ฌ HTTPS ํ™œ์„ฑํ™”
  • credentialName: my-tls-secret → Kubernetes Secret์—์„œ TLS ์ธ์ฆ์„œ๋ฅผ ๋กœ๋“œ
  • hosts: "example.com" → ํŠน์ • ๋„๋ฉ”์ธ(example.com)์—๋งŒ HTTPS ์ ์šฉ

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด HTTPS๋ฅผ ๊ฐ•์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์™ธ๋ถ€ ์š”์ฒญ์„ HTTPS๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •

โœ… 2.2 HTTPS VirtualService ์„ค์ •

์•„๋ž˜ VirtualService๋Š” HTTPS ํŠธ๋ž˜ํ”ฝ์„ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-secure-service
spec:
  hosts:
    - "example.com"
  gateways:
    - my-secure-gateway  # HTTPS ๊ฒŒ์ดํŠธ์›จ์ด ์ ์šฉ
  http:
    - match:
        - uri:
            prefix: "/api"  # "/api" ๊ฒฝ๋กœ ์š”์ฒญ์„ my-service๋กœ ๋ผ์šฐํŒ…
      route:
        - destination:
            host: my-service
            port:
              number: 8080

์„ค๋ช…:

  • gateways: my-secure-gateway → HTTPS ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  Gateway ์ง€์ •
  • match.uri.prefix: "/api" → "/api" ๊ฒฝ๋กœ์˜ ์š”์ฒญ์„ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ
  • destination.port.number: 8080 → ๋‚ด๋ถ€ ์„œ๋น„์Šค์˜ ํฌํŠธ ์„ค์ •

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • HTTPS๋ฅผ ์ ์šฉํ•œ ํ›„, ํŠน์ • ๊ฒฝ๋กœ(/api ๋“ฑ)์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ

๐Ÿ”น 3. CORS + HTTPS ํ†ตํ•ฉ ์„ค์ •

์•„๋ž˜ ์˜ˆ์ œ๋Š” CORS์™€ HTTPS๋ฅผ ํ•จ๊ป˜ ์ ์šฉํ•˜๋Š” VirtualService ์„ค์ •์ž…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: secure-api
spec:
  hosts:
    - "example.com"
  gateways:
    - my-secure-gateway
  http:
    - corsPolicy:
        allowOrigin:
          - "https://allowed-domain.com"
        allowMethods:
          - GET
          - POST
          - OPTIONS
        allowHeaders:
          - Authorization
          - Content-Type
        maxAge: "24h"
    - match:
        - uri:
            prefix: "/api"
      route:
        - destination:
            host: my-service
            port:
              number: 8080

์„ค๋ช…:

  • HTTPS ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ CORS ์ •์ฑ…์„ ํ•จ๊ป˜ ์ ์šฉํ•˜์—ฌ ํŠน์ • ๋„๋ฉ”์ธ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉ

๐Ÿ“Œ ๊ฒฐ๋ก 

  • CORS(Cross-Origin Resource Sharing)๋Š” ํŠน์ • ๋„๋ฉ”์ธ์—์„œ API ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ…์ด๋ฉฐ,
    Istio์˜ VirtualService๋ฅผ ํ™œ์šฉํ•˜์—ฌ CORS ์„ค์ •์„ ๊ฐ„๋‹จํžˆ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • HTTPS๋Š” TLS๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋ฉฐ,
    Istio์—์„œ๋Š” Gateway์™€ Secret์„ ํ™œ์šฉํ•˜์—ฌ HTTPS๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ
  • CORS์™€ HTTPS๋ฅผ ํ•จ๊ป˜ ์„ค์ •ํ•˜๋ฉด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ฉด์„œ๋„, ์™ธ๋ถ€ ๋„๋ฉ”์ธ์—์„œ์˜ API ์š”์ฒญ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

 

728x90