All Products
Search
Document Center

Alibaba Cloud Service Mesh:FAQ tentang JWT

Last Updated:Jun 28, 2025

Topik ini menjawab beberapa pertanyaan umum (FAQ) terkait JSON Web Token (JWT).

Apa saja algoritma JWT yang didukung oleh ASM?

  • Instance Service Mesh (ASM) dengan versi lebih lama dari V1.13 hanya mendukung algoritma RSA.

  • Instance ASM versi V1.13 atau lebih baru mendukung algoritma ES256, ES384, ES512, HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, dan EdDSA.

Bagaimana cara menggunakan parameter jwksUri di ASM?

Parameter jwksUri dapat digunakan pada instance ASM versi V1.13 atau lebih baru. Metode penggunaannya berbeda-beda tergantung pada skenario:

  • Untuk menentukan alamat layanan dalam kluster Container Service for Kubernetes (ACK) yang dikelola oleh ASM, Anda dapat menggunakan parameter jwksUri secara langsung.

  • Untuk menentukan alamat layanan yang tidak diterapkan dalam kluster ACK yang dikelola oleh ASM, Anda harus mengonfigurasi entri layanan yang sesuai.

Contoh ini menggunakan JWT resmi Istio dan JSON Web Key Set (JWKS). Untuk informasi lebih lanjut, lihat sampel JWT dan JWKS Istio.

jwksUri menentukan alamat layanan dalam kluster ACK yang dikelola oleh ASM

Dalam contoh ini, jwksUri menentukan alamat layanan nginx-proxy dalam kluster yang dikelola oleh ASM. Kunci publik dapat diperoleh dari jwks melalui port 80 dari alamat/get_jwks. Nilai jwksUri adalah http://nginx-proxy.{Namespace}.svc.cluster.local:80/get_jwks.

  1. Jalankan perintah berikut untuk memeriksa apakah get_jwks dari kluster dapat digunakan:

    curl nginx-proxy/get_jwks

    Output yang diharapkan:

    { "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65p****-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYt****-91gVuoeJT_DwtGGcp4ignkgXfkiE****-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]}

    Output di atas menunjukkan bahwa get_jwks dapat digunakan.

  2. Buat kebijakan autentikasi permintaan.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

    3. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.

    4. Di panel navigasi sisi kiri, pilih Mesh Security Center > RequestAuthentication.

    5. Di halaman RequestAuthentication, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan autentikasi permintaan dan Template, salin konten berikut ke editor YAML, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: RequestAuthentication
      metadata:
        name: jwt-example
        namespace: foo
      spec:
        jwtRules:
          - issuer: testing@secure.istio.io
            jwksUri: 'http://nginx-proxy/get_jwks'
        selector:
          matchLabels:
            app: httpbin
  3. Gunakan kubectl untuk terhubung ke bidang data berdasarkan informasi dalam file kubeconfig, dan jalankan perintah berikut untuk mengakses aplikasi HTTPBin:

    # Tetapkan variabel lingkungan Token.
    TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
    # Akses aplikasi httpbin dari pod tempat aplikasi sleep berada menggunakan permintaan dengan JWT.
    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"

    Jika kode status 200 dikembalikan, operasi berhasil.

jwksUri menentukan alamat layanan yang tidak diterapkan dalam kluster ACK yang dikelola oleh ASM

Dalam contoh ini, protokol HTTP digunakan. Untuk menggunakan HTTPS untuk mendapatkan JWKS, konfigurasikan aturan tujuan untuk entri layanan.

  1. Buat entri layanan untuk layanan tersebut.

    1. Buat file bernama service-entry.yaml dan salin konten berikut ke file tersebut:

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: external-svc-https
        namespace: foo
      spec:
        addresses:
          - 11.11.XX.XX   # Ganti variabel ini dengan jwksUri Anda.
        endpoints:
          - address: 11.11.XX.XX  # Ganti variabel ini dengan jwksUri Anda.
        hosts:
          - 11.11.XX.XX  # Ganti variabel ini dengan jwksUri Anda.
        location: MESH_EXTERNAL
        ports:
           - name: http
            number: 80
            protocol: HTTP
          - name: https
            number: 443
            protocol: HTTPS      
        resolution: STATIC                          
    2. Jalankan perintah berikut untuk membuat entri layanan:

      kubectl apply -f service-entry.yaml
  2. (Opsional) Untuk menggunakan HTTPS untuk mendapatkan JWKS, konfigurasikan aturan tujuan untuk entri layanan.

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: external-svc-https
      namespace: foo
    spec:
      host: ${The host where ServiceEntry resides}
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
          - port:
              number: 443
            tls:
              mode: SIMPLE
  3. Buat kebijakan autentikasi permintaan.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

    3. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.

    4. Di panel navigasi sisi kiri, pilih Mesh Security Center > RequestAuthentication.

    5. Di halaman RequestAuthentication, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan autentikasi permintaan dan Template, salin konten berikut ke editor YAML, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: RequestAuthentication
      metadata:
        name: jwt-example
        namespace: foo
      spec:
        jwtRules:
          - issuer: tes****@secure.istio.io
            jwksUri: '${Your jwksUri}'
        selector:
          matchLabels:
            app: httpbin
  4. Jalankan perintah berikut untuk mengakses aplikasi httpbin di pod tempat aplikasi sleep berada:

    # Akses aplikasi httpbin dari pod tempat aplikasi sleep berada menggunakan permintaan dengan JWT.
    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"

    Jika kode status 200 dikembalikan, operasi berhasil.

Bagaimana cara mengonfigurasi autentikasi JWT ketika saya tidak ingin mengautentikasi permintaan yang menuju jalur tertentu?

Anda dapat menyetel parameter action ke DENY dan menentukan jalur saat mengonfigurasi file YAML kebijakan otorisasi di Konsol ASM.

  1. Sebarkan aplikasi sampel dan akses aplikasi tersebut.

    1. Sebarkan aplikasi Bookinfo di kluster ACK yang ditambahkan ke instance ASM. Untuk informasi lebih lanjut, lihat Sebarkan aplikasi di kluster ACK yang ditambahkan ke instance ASM.

    2. Jalankan perintah berikut untuk mengakses tiga layanan guna memastikan semua jalur dapat diakses:

      curl "http://${Alamat IP gateway ingress}/productpage" -sS -o /dev/null -w "%{http_code}\n"
      curl "http://${Alamat IP gateway ingress}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n"
      curl "http://${Alamat IP gateway ingress}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"

      Jika kode status 200 dikembalikan di setiap keluaran perintah, operasi berhasil.

  2. Buat kebijakan autentikasi permintaan.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

    3. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.

    4. Di panel navigasi sisi kiri, pilih Mesh Security Center > RequestAuthentication.

    5. Di halaman RequestAuthentication, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan autentikasi permintaan dan Template, salin konten berikut ke editor YAML, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: RequestAuthentication
      metadata:
        name: jwt-example
        namespace: istio-system
      spec:
        jwtRules:
          - issuer: testing@secure.istio.io
            jwks: >-
              { "keys":[
              {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVu****_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]}
        selector:
          matchLabels:
            app: istio-ingressgateway

      Kebijakan autentikasi permintaan ini berlaku untuk gateway ingress, dan semua permintaan yang melewati gateway perlu diautentikasi. Permintaan dengan JWT valid atau tanpa JWT diizinkan, sedangkan permintaan dengan JWT tidak valid ditolak.

  3. Buat kebijakan otorisasi yang mengizinkan permintaan tanpa JWT untuk mengakses jalur tertentu.

    Anda dapat membuat kebijakan otorisasi untuk menentukan bahwa permintaan yang menuju jalur tertentu tidak perlu melewati autentikasi JWT, sedangkan permintaan yang menuju jalur lainnya harus membawa JWT yang valid. Dalam contoh ini, permintaan yang menuju jalur /productpage tidak perlu melewati autentikasi JWT, sedangkan permintaan yang menuju dua jalur lainnya harus membawa JWT yang valid.

    1. Masuk ke Konsol ASM.

    2. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

    3. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau pilih Manage di kolom Actions.

    4. Di panel navigasi sisi kiri, pilih Mesh Security Center > AuthorizationPolicy.

    5. Di halaman AuthorizationPolicy, klik Create from YAML. Di halaman yang muncul, pilih Namespace tempat Anda ingin membuat kebijakan otorisasi dan Template, salin konten berikut ke editor YAML, lalu klik Create.

      apiVersion: security.istio.io/v1beta1
      kind: AuthorizationPolicy
      metadata:
        name: test-exclude
        namespace: istio-system
      spec:
        action: DENY
        rules:
          - from:
              - source:
                  notRequestPrincipals:
                    - '*'
            to:
              - operation:
                  notPaths:
                    - /productpage
        selector:
          matchLabels:
            app: istio-ingressgateway
                                      

      Kebijakan otorisasi ini juga berlaku untuk gateway ingress. Aturan DENY dikonfigurasikan untuk menolak semua permintaan tanpa JWT yang valid yang menuju jalur selain jalur /productpage.

  4. Lakukan pengujian akses.

    1. Jalankan perintah berikut untuk menetapkan JWT ke variabel lingkungan Token:

      export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1****.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9****-LS9qd_vpdLG4Tn1A15NxfCjp5f7Q****-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****
    2. Jalankan perintah berikut untuk mengakses tiga layanan:

      • Setiap permintaan tidak membawa JWT:

        curl "http://${Alamat IP gateway ingress}/productpage" -sS -o /dev/null -w "%{http_code}\n"
        200
        
        curl "http://${Alamat IP gateway ingress}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n"
        403
        
        curl "http://${Alamat IP gateway ingress}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"
        403

        Keluaran menunjukkan bahwa hanya jalur /productpage yang dapat diakses, sedangkan dua jalur lainnya tidak dapat diakses dan kode status 403 dikembalikan.

      • Setiap permintaan membawaJWT:

        curl "http://${Alamat IP gateway ingress}/productpage" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
        200
        
        curl "http://${Alamat IP gateway ingress}/api/v1/products/0" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
        200
        
        curl "http://${Alamat IP gateway ingress}/api/v1/products/1" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
        200

        Kode status 200 dikembalikan untuk setiap operasi, menunjukkan bahwa ketiga jalur tersebut dapat diakses.