Istio 를 통한 JWT Claim 기반 라우팅 구현
Istio 와 같은 Service Mesh를 활용하면 JWT Claim을 손쉽게 검증하고 이를 기반으로 동적 라우팅을 구현할 수 있습니다. JWT Claim 기반 라우팅은 사용자의 정보와 권한을 바탕으로 요청을 세분화하고, 맞춤형 트래픽 분배를 가능하게 하는 효과적인 방법입니다.
해당 포스트에서는 Istio 를 활용해 JWT Claim 기반 라우팅을 구현하는 방법과 그 중요성을 설명합니다.
목차
1. JWT Claim 기반 라우팅이란?
1-1. JWT Claim의 개념과 역할, 장점
2. Istio 로 JWT Claim 기반 라우팅 구현하기
2-1. JWT Claim 검증을 위한 Istio 설정
2-2. 실행 데모 예제
3. 결론
1. JWT Claim 기반 라우팅이란?
JWT Claim 기반 라우팅은 요청에 포함된 JWT의 Claim 데이터를 활용하여 트래픽을 특정 서비스로 분배하는 방식입니다. 이를 통해 사용자 그룹별로 차별화된 서비스 제공이 가능하며, 더 높은 보안성을 제공합니다. 특히 Istio 는 Ingress Gateway를 통해 JWT 검증 및 Claim 기반 라우팅을 효과적으로 지원합니다.
1-1. JWT Claim의 개념과 역할, 장점
JWT(JSON Web Token)는 사용자 인증과 데이터 전달을 위한 간단하고 안전한 방식으로, Claim은 JWT의 핵심 데이터를 담고 있습니다. Claim은 사용자의 역할(role), 권한(permission), 지역(region) 등 다양한 정보를 포함하며, 이를 통해 서비스 요청을 세분화할 수 있습니다.
JWT Claim 기반 라우팅의 가장 큰 장점은 보안성과 유연성입니다. 특정 사용자 그룹에 맞춘 트래픽 분배가 가능하며, 인증된 사용자만 특정 리소스에 접근할 수 있도록 제한하여 보안 수준을 높일 수 있습니다.
또한, Claim 데이터를 활용하면 글로벌 서비스에서 지역 기반 트래픽 관리와 같은 맞춤형 서비스 제공이 가능합니다.
2. Istio 로 JWT Claim 기반 라우팅 구현하기
2-1. JWT Claim 검증을 위한 Istio 설정
JWT Claim 기반 라우팅을 구현하려면 먼저 Istio 의 RequestAuthentication을 설정하여 JWT 검증을 활성화해야 합니다. 다음은 설정 예제입니다.
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
name: ingress-jwt
namespace: istio-system
spec:
selector:
matchLabels:
istio: ingressgateway
jwtRules:
- issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.24/security/tools/jwt/samples/jwks.json"
위 설정은 Ingress Gateway에서 issuer 값이 "testing@secure.istio.io"로 설정된 JWT를 검증하도록 구성합니다. JWT의 키는 지정된 jwksUri URL을 통해 확인됩니다. 이로써 Istio 는 Ingress Gateway 단계에서 요청에 포함된 JWT가 올바른지 판단할 수 있습니다.
2-2. 실행 데모 예제
JWT Claim 기반 라우팅을 설정하려면 다음 단계를 따라야 합니다:
1. Namespace 생성 및 워크로드 배포
먼저 foo라는 네임스페이스를 생성하고, httpbin 워크로드를 Istio Ingress Gateway를 통해 노출합니다.
httpbin은 테스트 및 디버깅 목적으로 설계된 간단한 HTTP 요청 및 응답 서비스를 제공하는 오픈 소스 애플리케이션입니다.
$ kubectl create ns foo
$ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo
$ kubectl apply -f samples/httpbin/httpbin-gateway.yaml -n foo
2. Ingress Gateway 동작 확인
배포한 Ingress Gateway가 제대로 동작하는지 확인합니다.
$ curl "$INGRESS_HOST:$INGRESS_PORT"/headers -s -o /dev/null -w "%{http_code}\n"
200
3. VirtualService를 통한 JWT Claim 기반 라우팅 설정VirtualService를 사용해 JWT의 Claim 데이터를 기반으로 요청을 특정 서비스로 라우팅합니다.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
namespace: foo
spec:
hosts:
- "*"
gateways:
- httpbin-gateway
http:
- match:
- uri:
prefix: /headers
headers:
"@request.auth.claims.groups":
exact: group1
route:
- destination:
port:
number: 8000
host: httpbin
EOF
위 설정은 JWT의 groups Claim이 group1인 요청만 /headers 경로로 라우팅되도록 설정합니다.
4. JWT Claim 기반 라우팅 테스트
JWT를 포함하지 않거나 잘못된 JWT를 사용할 경우 요청이 차단됩니다. 반대로, 올바른 JWT를 사용할 경우 요청이 성공적으로 라우팅됩니다.
- JWT 없이 요청:
$ curl -s -I "http://$INGRESS_HOST:$INGRESS_PORT/headers"
HTTP/1.1 404 Not Found

- 잘못된 JWT 사용:
$ curl -s -I "http://$INGRESS_HOST:$INGRESS_PORT/headers" -H "Authorization: Bearer some.invalid.token"
HTTP/1.1 401 Unauthorized

- 올바른 JWT 사용:
$ TOKEN_GROUP=$(curl https://raw.githubusercontent.com/istio/istio/release-1.24/security/tools/jwt/samples/groups-scope.jwt -s) && echo "$TOKEN_GROUP" | cut -d '.' -f2 - | base64 --decode
$ curl -s -I "http://192.168.201.190/headers" -H "Authorization: Bearer $TOKEN_GROUP"
HTTP/1.1 200 OK

JWT가 유효하지만 Claim 조건(group1)을 충족하지 않으면 요청은 차단됩니다.
$ TOKEN_NO_GROUP=$(curl https://raw.githubusercontent.com/istio/istio/release-1.24/security/tools/jwt/samples/demo.jwt -s)
$ curl -s -I "http://$INGRESS_HOST:$INGRESS_PORT/headers" -H "Authorization: Bearer $TOKEN_NO_GROUP"
HTTP/1.1 404 Not Found
3. 결론
JWT Claim 기반 라우팅은 사용자 정보를 활용하여 더욱 세분화된 트래픽 관리를 가능하게 합니다. 이를 통해 특정 사용자 그룹이나 조건에 따라 맞춤형 서비스를 제공할 수 있으며, 높은 보안성과 유연성을 제공합니다. Istio 는 Ingress Gateway에서 JWT를 검증하고, 이를 기반으로 라우팅을 설정할 수 있는 강력한 기능을 제공하므로, 마이크로서비스 환경에서 이 접근 방식을 쉽게 구현할 수 있습니다.
JWT Claim 기반 라우팅은 인증 및 권한 관리를 서비스 수준으로 확장하는 데 있어 핵심적인 역할을 하며, Istio 와 같은 서비스 메쉬 솔루션을 활용하면 이를 손쉽게 구현할 수 있습니다. 이를 통해 마이크로서비스 환경이 더욱 안전하고 효율적으로 운영되기를 기대합니다. 추가 학습 자료는 NGINX STORE 블로그의 Istio 카테고리를 참고하세요.
댓글을 달려면 로그인해야 합니다.