๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ 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 ์์ฒญ์ ์ ์ดํ ์ ์์