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 카테고리를 참고하세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required