Kong API Gateway는 API 요청을 라우팅하고, 다양한 기능을 제공하는 강력한 게이트웨이 솔루션입니다. 그 중 하나는 Published URL을 재작성(Rewrite)하여 외부 클라이언트가 요청하는 URL을 내부 서비스의 엔드포인트로 변경하는 기능입니다. 이는 레거시 시스템을 유지하면서도 클라이언트가 새로운 URL을 사용하게 할 수 있어, 보안성과 유연성을 높이는 데 유용합니다.
예시 시나리오
레거시 시스템에서 내부적으로 사용되는 API가 /api/vikings/
경로로 되어 있다고 가정해 보겠습니다. 하지만 외부 사용자에게는 /viking/v2/api
라는 새로운 경로를 제공하려고 합니다. 이러한 시나리오에서 Kong을 사용하여 쉽게 URL 재작성이 가능합니다.
기본 URL 재작성 (Simple URL Rewriting)
단계 1: 서비스 생성
Kong에 서비스를 등록합니다. 이 서비스는 실제 API 요청을 처리할 외부 또는 내부 서버로 설정됩니다.
http POST :8001/services name=ragnareternal host=httpbin.org path=/legacy/api/vikings
위 명령은 /legacy/api/vikings
경로를 가진 서비스로 httpbin.org
서버를 생성하는 예시입니다.
단계 2: 라우트 설정
서비스에 대한 라우트를 설정하여 외부 클라이언트가 접근할 수 있는 엔드포인트를 정의합니다. 이때 클라이언트는 /viking/v2/api
로 요청을 보내지만, 실제 서비스에서는 /legacy/api/vikings
로 요청이 전달됩니다.
http POST :8001/services/ragnareternal/routes name=thor paths='["/viking/v2/api"]'
단계 3: API 호출
이제 클라이언트가 /viking/v2/api
경로로 요청을 보낼 수 있으며, Kong은 이를 /legacy/api/vikings
로 변환하여 백엔드 서비스에 전달합니다.
http :8000/viking/v2/api/heroes/search?q=loki
응답 예시
{
"args": {
"q": "loki"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "HTTPie/2.0.0",
"X-Forwarded-Host": "localhost"
},
"json": null,
"method": "GET",
"origin": "172.23.0.1, 74.66.140.21, 172.23.0.1",
"url": "https://httpbin.org/legacy/api/vikings/heroes/search?q=loki"
}
위 예시에서 클라이언트는 /viking/v2/api
로 요청했지만, 실제 요청은 /legacy/api/vikings/heroes/search
로 변환되어 처리되었습니다.
고급 URL 재작성 (Advanced URL Rewriting)
좀 더 복잡한 URL 재작성 작업이 필요할 때는 정규식 캡처 그룹과 Kong의 Request Transformer Advanced Plugin을 사용할 수 있습니다. 예를 들어, 경로에 동적으로 변환해야 하는 부분이 포함되어 있을 때 유용합니다.
예시 시나리오
/api/<function>/vikings
경로를 /viking/v2/api/<function>
으로 변환하려는 경우, 정규식 캡처 그룹을 사용하여 경로의 특정 부분을 동적으로 캡처하고 변환할 수 있습니다.
단계 1: 서비스 생성
먼저 서비스부터 생성합니다.
http POST :8001/services name=flokithewise host=httpbin.org
단계 2: 경로에 캡처 그룹 적용
정규식 캡처 그룹을 사용하여 URL의 동적인 부분을 캡처하도록 경로를 설정합니다. function
과 path
부분을 캡처하는 것이 목표입니다.
http POST :8001/services/flokithewise/routes name=loki paths='["/viking/v2/api/(?<function>\\S+?)/(?<path>\\S+)"]'
위 명령에서는 function
과 path
를 정규식으로 캡처하여 동적으로 변환할 준비를 합니다.
단계 3: Request Transformer Plugin 설정
정규식으로 캡처한 값을 사용하여 변환된 URL을 구성합니다. Kong의 Request Transformer Advanced Plugin을 사용하여 캡처한 경로를 재작성할 수 있습니다.
http --form POST :8001/routes/<route-id>/plugins name=request-transformer-advanced config.replace.uri="/legacy/api/\$(uri_captures['function'])/vikings/\$(uri_captures['path'])"
단계 4: API 호출
이제 /viking/v2/api/quests/search
경로로 API 요청을 보내면, 요청이 /legacy/api/quests/vikings/search
로 변환됩니다.
http :8000/viking/v2/api/quests/search?q=thor
응답 예시
{
"args": {
"q": "thor"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "HTTPie/2.0.0",
"X-Forwarded-Host": "localhost"
},
"json": null,
"method": "GET",
"origin": "172.23.0.1, 74.66.140.21, 172.23.0.1",
"url": "https://httpbin.org/legacy/api/quests/vikings/search?q=thor"
}
이 예시에서 요청은 /viking/v2/api/quests/search?q=thor
로 보내졌지만, Kong은 이를 /legacy/api/quests/vikings/search
로 변환했습니다.
추가 정보: Plugin을 활용한 URL 조작
Kong은 Request Transformer Plugin 외에도 다양한 플러그인을 제공하여 요청과 응답을 조작할 수 있습니다. 특히 URL 리다이렉션, 인증 처리, 캐시 처리, 트래픽 제어 등의 작업이 필요할 때 유용합니다.
1. 요청 헤더 변경
특정 API 요청이 특정 헤더를 요구하거나, 외부 요청에 대한 보안을 강화하기 위해 헤더를 추가/변경할 수 있습니다. 예를 들어, 특정 API 요청에 인증 토큰을 추가할 수 있습니다.
http --form POST :8001/routes/<route-id>/plugins name=request-transformer config.add.headers="Authorization: Bearer <token>"
2. 응답 변환
Kong을 통해 받은 응답의 내용도 수정할 수 있습니다. 예를 들어 JSON 데이터를 XML로 변환하거나, 특정 필드를 제거하는 작업을 할 수 있습니다.
http --form POST :8001/routes/<route-id>/plugins name=response-transformer config.remove.json="field_to_remove"
- 단순 URL 재작성: 기본적으로 경로를 변환하는 작업은 간단하게 설정할 수 있으며, Kong은 요청 경로의 일부를 그대로 유지하면서 서비스 경로로 변환합니다.
- 고급 URL 재작성: 정규식 캡처 그룹을 사용하여 복잡한 경로 변환도 가능합니다. Request Transformer Advanced Plugin을 통해 동적으로 경로를 재작성할 수 있습니다.
- 추가 기능: Kong은 플러그인 생태계를 통해 요청과 응답을 자유롭게 조작할 수 있으며, 보안, 성능, 유연성 측면에서 높은 확장성을 제공합니다.
이 방법을 통해 Kong API Gateway를 사용하여 유연한 API 경로 관리와 서비스 재작성 작업을 효율적으로 수행할 수 있습니다. Kong Gateway와 Cloudentity Kong Plugin의 Kubernetes와 Helm을 사용한 통합 작업 과정에서 모든 주요 구성 요소와 설정을 포함하여 Kong Gateway와 외부 인증 시스템을 연동해 API 보안을 강화하는 방법입니다.
Kong Gateway와 Cloudentity Kong Plugin 개요
- Kong Gateway: API Gateway로서 트래픽 관리, 요청 인증, 로깅, 보안 기능을 제공합니다. Kubernetes와 함께 배포 가능하며 API 서비스 및 경로를 설정하여 외부와의 통신을 관리합니다.
- Cloudentity Kong Plugin: Cloudentity의 인증 및 권한 부여 기능을 Kong Gateway에 통합하여 API에 대한 외부 인증을 관리하는 플러그인입니다. 이를 통해 OAuth 토큰 교환과 외부 액세스 제어를 수행할 수 있습니다.
- Kong Authorizer: Cloudentity 내에서 설정한 인증 서버로, API 요청에 대한 권한 부여를 처리하고 Kong Plugin을 통해 Kong Gateway에서의 API 액세스를 제어합니다.
사전 요구 사항
- Kubernetes 클러스터 (v1.19 이상)
- Helm (v3.0 이상)
- Cloudentity SaaS 계정 (클라이언트 ID, 클라이언트 시크릿 필요)
- 클러스터에서 Kong Gateway 및 Cloudentity Kong Plugin 설치를 위한 접근 권한
Kubernetes 클러스터 설정
로컬에서 Kubernetes 클러스터를 실행하려면 kind
를 사용하여 클러스터를 설정할 수 있습니다.
# Go 1.17 이상 설치된 경우
GO111MODULE="on" go install sigs.k8s.io/kind@v0.20.0 && kind create cluster
Helm 설치 및 Kong Gateway 리포지토리 추가
Helm을 통해 Kong Gateway를 배포하고 관리하기 위해 Helm 리포지토리를 추가합니다.
# Kong Helm 리포지토리 추가
helm repo add kong https://charts.konghq.com
helm repo update
Kong Gateway 및 Cloudentity Plugin 설치
Kong Gateway를 Kubernetes 클러스터에 설치할 때 Cloudentity Kong Plugin을 포함해야 합니다.
Kong Gateway 설정 파일 작성 (values.yaml)
이 설정 파일에는 Kong Gateway 설치 구성과 함께 Cloudentity 플러그인을 설치하는 방법을 포함하고 있습니다.
admin:
enabled: true
http:
enabled: false
ingress:
enabled: true
hostname: kong.127-0-0-1.nip.io
tls: quickstart-kong-admin-cert
deployment:
kong:
enabled: true
initContainers:
- name: plugin-setup
image: kong:3.4
command:
- "sh"
- "-c"
- "luarocks install kong-plugin-acp"
volumeMounts:
- name: "custom-kong-plugin-acp"
mountPath: "/usr/local/share/lua/5.1/kong/plugins/acp"
env:
database: postgres
plugins: bundled, acp
proxy:
enabled: true
http:
enabled: true
containerPort: 8080
Kong Gateway 설치
Kong Gateway와 Cloudentity 플러그인을 설치하려면 위에서 작성한 values.yaml
파일을 사용합니다.
helm install kong kong/kong --namespace kong --values values.yaml
Cloudentity Kong Plugin 설치
Cloudentity Kong Plugin을 Kong Gateway에 추가하려면 Kong Admin API에 Cloudentity 플러그인을 연결합니다.
플러그인 설치를 위한 initContainer 설정
values.yaml
파일에 Cloudentity 플러그인 설치를 위한 initContainer
를 추가해야 합니다.
initContainers:
- name: plugin-setup
image: kong:3.4
command:
[
"sh",
"-c",
"luarocks install kong-plugin-acp && luarocks unpack kong-plugin-acp",
]
volumeMounts:
- name: custom-kong-plugin-acp
mountPath: "/usr/local/share/lua/5.1/kong/plugins/acp"
설정 후 다음과 같은 명령어로 Helm 업데이트를 실행합니다.
helm upgrade kong kong/kong --namespace kong --values values.yaml
Kong Authorizer 설치 및 배포
Cloudentity에서 Kong Authorizer를 생성하고, 이를 통해 API 요청을 인증할 수 있습니다.
Cloudentity에서 Kong Authorizer 생성
- Cloudentity 콘솔에 로그인하여 워크스페이스로 이동합니다.
- Authorization → Gateways → Create Gateway → Kong을 선택합니다.
- Kong Authorizer 이름과 설명을 추가하고, 인증서 생성 및 바인딩 옵션을 선택합니다.
Kong Authorizer Helm 차트를 사용하여 설치
Cloudentity가 제공하는 Helm 차트를 사용하여 Kong Authorizer를 설치합니다.
helm repo add acp https://charts.cloudentity.io && helm repo update
helm upgrade --install kong-authorizer acp/kong-authorizer \
--set clientCredentials.clientID=${CLIENT_ID} \
--set clientCredentials.clientSecret=${CLIENT_SECRET} \
--set issuerURL=${ISSUER_URL} \
--set kongAdminURL=https://kong-admin.kong.svc:8444 \
--namespace cl-kong-authorizer
이 명령어를 실행하면 Kong Authorizer가 Kubernetes 클러스터에 배포됩니다.
Kong Authorizer 상태 확인
Kong Authorizer가 정상적으로 실행 중인지 확인하려면 아래 명령어를 실행합니다.
kubectl get po --namespace cl-kong-authorizer -w
서비스 및 경로 설정
Kong Gateway에서 API 서비스와 경로를 설정하여 API 요청을 처리할 수 있도록 구성합니다.
샘플 서비스(httpbin) 배포
다음 명령어로 httpbin 서비스를 Kubernetes에 배포합니다.
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: httpbin
spec:
ports:
- port: 80
name: http
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
template:
metadata:
labels:
app: httpbin
spec:
containers:
- name: httpbin
image: kennethreitz/httpbin
ports:
- containerPort: 80
EOF
Kong Admin API를 사용한 경로 추가
다음 명령어로 서비스 및 경로를 Kong Admin API를 통해 추가합니다.
# 서비스 추가
curl -i -X POST --url https://localhost:8444/services/ \
--data 'name=httpbin-service' \
--data 'url=http://httpbin.default.svc:80'
# 경로 추가
curl -i -X POST --url https://localhost:8444/services/httpbin-service/routes \
--data 'paths[]=/anything' \
--data 'name=httpbin-route'
Cloudentity 플러그인 적용 및 API 보호
Cloudentity Kong Plugin을 통해 API 요청을 보호하고 외부 인증을 설정합니다.
Cloudentity 플러그인 연결
서비스에 Cloudentity 플러그인을 연결하여 외부 인증을 처리하도록 구성합니다.
curl -sSk -X POST https://localhost:8444/services/httpbin-service/plugins \
--data 'name=acp' \
--data 'config.api_group_id=httpbin-service' \
--data 'config.auth_url=https://kong-authorizer.svc/authorize' \
--data 'config.ssl_verify=false'
이제 Cloudentity 플러그인을 통해 외부 인증이 적용되어 API 요청이 보호됩니다.
정책 적용 및 API 접근 제어 테스트
Cloudentity에서 API에 대한 접근 제어 정책을 설정하고 테스트할 수 있습니다.
정책 생성
Cloudentity 콘솔에서 정책을 생성하고 특정 API에 적용합니다.
정책 적용 후 API 호출
정책이 적용된 API를 호출하여 접근이 허용 또는 차단되는지 확인합니다.
curl http://localhost:8000/anything/anywhere -v
이러한 과정으로 Kubernetes와 Helm을 사용하여 Kong Gateway를 배포하고, Cloudentity Kong Plugin을 통합하여 API 요청에 대한 인증 및 접근 제어를 구현합니다. Kong Gateway의 API 요청을 관리하고 Cloudentity Kong Authorizer를 통해 외부 인증을 처리하는 방법을 통해 API에 대한 보안 정책을 중앙에서 관리하고 API 요청에 대한 세밀한 제어를 가능하게 할 수 있습니다.
댓글