

AWS Layanan Modernisasi Mainframe (Managed Runtime Environment experience) tidak lagi terbuka untuk pelanggan baru. Untuk kemampuan yang mirip dengan Layanan Modernisasi AWS Mainframe (pengalaman Lingkungan Runtime Terkelola), jelajahi Layanan Modernisasi AWS Mainframe (Pengalaman yang Dikelola Sendiri). Pelanggan yang sudah ada dapat terus menggunakan layanan ini seperti biasa. Untuk informasi selengkapnya, lihat Perubahan [AWS ketersediaan Modernisasi Mainframe](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html).

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Konfigurasikan keamanan untuk aplikasi Gapwalk
<a name="ba-runtime-security"></a>

Topik berikut menjelaskan cara mengamankan aplikasi Gapwalk.

Merupakan tanggung jawab Anda untuk menyediakan konfigurasi yang tepat untuk memastikan bahwa penggunaan kerangka kerja AWS Transform for mainframe aman.

Semua fitur terkait keamanan dinonaktifkan secara default. Untuk mengaktifkan otentikasi (dan CSRF, XSS, CSP, dan sebagainya), atur ke dan ke. `gapwalk-application.security` `enabled` `gapwalk-application.security.identity` `oauth`

**Topics**
+ [Konfigurasikan aksesibilitas URI untuk aplikasi Gapwalk](ba-runtime-filteringURIs.md)
+ [Konfigurasikan otentikasi untuk aplikasi Gapwalk](ba-runtime-auth.md)
+ [Konfigurasikan batasan laju untuk AWS Transform untuk Runtime mainframe](ba-runtime-rate-limiting.md)

# Konfigurasikan aksesibilitas URI untuk aplikasi Gapwalk
<a name="ba-runtime-filteringURIs"></a>

Topik ini menjelaskan cara mengkonfigurasi pemfilteran URIs untuk aplikasi Gapwalk. Fitur ini tidak memerlukan penyedia identitas (iDP).

Untuk memblokir daftar URIs, tambahkan dua baris berikut ke aplikasi modern Anda, ganti*URI-1*,, dan seterusnya*URI-2*, dengan URIs yang ingin Anda blokir. `application-main.yml`

```
gapwalk-application.security.filterURIs: enabled
gapwalk-application.security.blockedURIs: URI-1, URI-2, URI-3
```

# Konfigurasikan otentikasi untuk aplikasi Gapwalk
<a name="ba-runtime-auth"></a>

Untuk mengonfigurasi OAuth2 otentikasi aplikasi Gapwalk Anda, Anda perlu menyiapkan penyedia identitas (iDP) dan mengintegrasikannya dengan aplikasi Anda. Panduan ini mencakup langkah-langkah untuk menggunakan Amazon Cognito atau Keycloak sebagai IDP Anda. Dengan Amazon Cognito, Anda dapat memperbarui file konfigurasi aplikasi Anda dengan detail kumpulan pengguna Cognito. Dengan Keycloak, Anda dapat mengontrol akses ke aplikasi APIs dan sumber daya berdasarkan peran yang ditetapkan pengguna.

**Topics**
+ [Konfigurasikan OAuth2 otentikasi Gapwalk dengan Amazon Cognito](ba-runtime-auth-cognito.md)
+ [Konfigurasikan OAuth2 otentikasi Gapwalk dengan Keycloak](ba-runtime-auth-keycloak.md)

# Konfigurasikan OAuth2 otentikasi Gapwalk dengan Amazon Cognito
<a name="ba-runtime-auth-cognito"></a>

Topik ini menjelaskan cara mengonfigurasi OAuth2 otentikasi untuk aplikasi Gapwalk menggunakan Amazon Cognito sebagai penyedia identitas (iDP).

## Prasyarat
<a name="ba-runtime-auth-cognito-prereq"></a>

Dalam tutorial ini kita akan menggunakan Amazon Cognito sebagai IDP dan PlanetDemo sebagai proyek modern.

Anda dapat menggunakan penyedia identitas eksternal lainnya. ClientRegistration Informasi harus diperoleh dari IDP Anda dan diperlukan untuk otentikasi Gapwalk. Untuk informasi selengkapnya, lihat [Panduan Developer Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/) .

** ClientRegistration Informasi:**

id klien  
ID dari ClientRegistration. Dalam contoh kita itu akan terjadi PlanetsDemo.

rahasia klien  
Rahasia klien Anda.

titik akhir otorisasi  
URI titik akhir otorisasi untuk server otorisasi.

titik akhir token  
URI titik akhir token untuk server otorisasi.

titik akhir jwks  
URI digunakan untuk mendapatkan JSON Web Key (JWK) yang berisi kunci untuk memvalidasi tanda tangan web JSON yang dikeluarkan oleh server otorisasi.

pengalihan URI  
URI tempat server otorisasi mengalihkan pengguna akhir jika akses diberikan.

## Pengaturan Amazon Cognito
<a name="cog-setup"></a>

Pertama kita akan membuat dan mengonfigurasi kumpulan pengguna dan pengguna Amazon Cognito yang akan kita gunakan dengan aplikasi Gapwalk yang digunakan untuk tujuan pengujian.

**catatan**  
Jika Anda menggunakan IDP lain, Anda dapat melewati langkah ini.

**Buat kumpulan pengguna**

1. Buka Amazon Cognito di Konsol Manajemen AWS dan autentikasi menggunakan kredensil Anda. AWS 

1. Pilih **Kolam Pengguna**.

1. Pilih **Buat kolam pengguna**.

1. Di **Konfigurasikan pengalaman masuk**, pertahankan jenis penyedia default kumpulan **pengguna Cognito**. **Anda dapat memilih satu atau beberapa **opsi masuk kumpulan pengguna Cognito**; untuk saat ini, pilih **Nama pengguna**, lalu pilih Berikutnya.**  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/cog-auth-provider.png)

1. **Di **Konfigurasikan persyaratan keamanan**, pertahankan default dan nonaktifkan **otentikasi multi-faktor dengan** memilih Tidak ada **MFA**, lalu pilih Berikutnya.**  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/cog-sec-requirements.png)

1. Sebagai langkah keamanan, nonaktifkan **Aktifkan pendaftaran mandiri**, lalu pilih **Berikutnya**.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/cog-config-sign-up.png)

1. **Pilih **Kirim email dengan Cognito**, lalu pilih Berikutnya.**  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/cog-email.png)

1. Di **Integrasikan aplikasi Anda**, tentukan nama untuk kumpulan pengguna Anda. Di **halaman otentikasi yang di-host**, pilih **Gunakan UI yang Dihosting Cognito**.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/cog-domain.png)

1. Untuk mempermudah, di **Domain**, pilih **Gunakan domain Cognito** dan masukkan awalan domain; misalnya,. `https://planetsdemo` Aplikasi demo harus ditambahkan sebagai klien.

   1. Di **klien aplikasi awal**, pilih **Klien rahasia**. Masukkan nama klien aplikasi, seperti**planetsdemo**, lalu pilih **Hasilkan rahasia klien**.

   1. Di URL **callback yang diizinkan, masukkan URL** untuk mengarahkan pengguna setelah otentikasi. URL harus diakhiri dengan `/login/oauth2/code/cognito` Misalnya, untuk aplikasi kami dan aplikasi backend Gapwalk dan BAC:

      ```
      http://localhost:8080/bac
            http://localhost:8080/bac/login/oauth2/code/cognito
            http://localhost:8080/gapwalk-application
            http://localhost:8080/gapwalk-application/login/oauth2/code/cognito
            http://localhost:8080/planetsdemo
            http://localhost:8080/planetsdemo/login/oauth2/code/cognito
      ```

      Anda dapat mengedit URL nanti.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/cog-urls.png)

   1. Di **Login yang diizinkan**, URLs masukkan URL halaman keluar yang Anda inginkan untuk dialihkan oleh Amazon Cognito saat aplikasi Anda mengeluarkan pengguna. Misalnya, untuk aplikasi backend Gapwalk dan BAC:

      ```
      http://localhost:8080/bac/logout
      http://localhost:8080/gapwalk-application/logout
      http://localhost:8080/planetsdemo/logout
      ```

      Anda dapat mengedit URL nanti.

   1. Simpan nilai default di **pengaturan klien aplikasi lanjutan** dan bagian **izin baca dan tulis Atribut**.

   1. Pilih **Berikutnya**.

1. Di **Tinjau dan buat**, verifikasi pilihan Anda, lalu pilih **Buat kumpulan pengguna**.

Untuk informasi selengkapnya, lihat [Membuat kumpulan pengguna](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html).

**Pembuatan pengguna**

Karena pendaftaran mandiri dinonaktifkan, buat pengguna Amazon Cognito. Arahkan ke Amazon Cognito di. Konsol Manajemen AWS Pilih kumpulan pengguna yang Anda buat, lalu di **Pengguna** pilih **Buat pengguna**.

Di **Informasi pengguna**, pilih **Kirim undangan email**, masukkan nama pengguna dan alamat email, lalu pilih **Buat kata sandi**. Pilih **Create user** (Buat pengguna).

**Pembuatan peran**

Di tab **Grup**, buat 3 grup (SUPER\$1ADMIN, ADMIN, dan USER), dan kaitkan pengguna Anda ke satu atau beberapa grup ini. Peran ini kemudian dipetakan ke ROLE\$1SUPER\$1ADMIN, ROLE\$1ADMIN dan ROLE\$1USER oleh aplikasi Gapwalk untuk memungkinkan untuk mengakses beberapa panggilan API REST terbatas.

Aplikasi ini mengimplementasikan scope-to-role pemetaan hierarkis yang bekerja dengan beberapa OAuth2 penyedia identitas. Ketika token JWT yang dikeluarkan oleh Cognito digunakan untuk otorisasi server sumber daya, cakupan yang ditentukan dalam token secara otomatis dipetakan ke peran yang sesuai.

## Integrasikan Amazon Cognito ke dalam aplikasi Gapwalk
<a name="integrate-cognito"></a>

Sekarang setelah kumpulan pengguna dan pengguna Amazon Cognito Anda siap, buka `application-main.yml` file aplikasi modern Anda dan tambahkan kode berikut:

```
gapwalk-application.security: enabled
gapwalk-application.security.identity: oauth
gapwalk-application.security.issuerUri: https://cognito-idp.<region-id>.amazonaws.com/<pool-id>
gapwalk-application.security.domainName: <your-cognito-domain>

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            client-id: <client-id>
            client-name: <client-name>
            client-secret: <client-secret>
            provider: cognito
            authorization-grant-type: authorization_code
            scope: openid
            redirect-uri: "<redirect-uri>"
        provider:
          cognito:
            issuer-uri: ${gapwalk-application.security.issuerUri}
            authorization-uri: ${gapwalk-application.security.domainName}/oauth2/authorize
            jwk-set-uri: ${gapwalk-application.security.issuerUri}/.well-known/jwks.json
            token-uri: ${gapwalk-application.security.domainName}/oauth2/token
            user-name-attribute: username
      resourceserver:
        jwt:
          jwk-set-uri: ${gapwalk-application.security.issuerUri}/.well-known/jwks.json
```

Ganti placeholder berikut seperti yang dijelaskan:

1. Buka Amazon Cognito di Konsol Manajemen AWS dan autentikasi menggunakan kredensil Anda. AWS 

1. Pilih **Kumpulan Pengguna** dan pilih kumpulan pengguna yang Anda buat. Anda dapat menemukan **ID kumpulan pengguna** Anda*pool-id*.

1. Pilih **Integrasi aplikasi** di mana Anda dapat menemukan*your-cognito-domain*, lalu buka **Klien aplikasi dan analitik** dan pilih aplikasi Anda.

1. Di **App client: YourApp** Anda dapat menemukan*client-name*,*client-id*, dan *client-secret* (**Tampilkan rahasia klien**).

1. *region-id*sesuai dengan ID AWS Wilayah tempat Anda membuat pengguna dan kumpulan pengguna Amazon Cognito. Contoh:`eu-west-3`.

1. Untuk *redirect-uri* memasukkan URI yang Anda tentukan untuk **URL callback Diizinkan**. Dalam contoh kita itu`http://localhost:8080/planetsdemo/login/oauth2/code/cognito`.

Anda sekarang dapat menerapkan aplikasi Gapwalk Anda dan menggunakan pengguna yang dibuat sebelumnya untuk masuk ke aplikasi Anda.

# Konfigurasikan OAuth2 otentikasi Gapwalk dengan Keycloak
<a name="ba-runtime-auth-keycloak"></a>

Topik ini menjelaskan cara mengkonfigurasi OAuth2 otentikasi untuk aplikasi Gapwalk menggunakan Keycloak sebagai penyedia identitas (iDP). Dalam tutorial ini kita menggunakan Keycloak 24.0.0.

## Prasyarat
<a name="ba-runtime-auth-keycloak-prereq"></a>
+ [Jubah kunci](https://www.keycloak.org/)
+ Aplikasi Gapwalk

## Pengaturan keycloak
<a name="keycloak-setup"></a>

1. Buka dasbor Keycloak Anda di browser web Anda. Kredensi default adalah admin/admin. Pergi ke bilah navigasi kiri atas, dan buat ranah dengan nama**demo**, seperti yang ditunjukkan pada gambar berikut.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_2.png)

1. Buat klien dengan nama**app-demo**.  
![\[User interface for creating a new client in an authentication management system.\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_3.jpg)

   Ganti `localhost:8080` dengan alamat aplikasi Gapwalk Anda  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_4.png)  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_5.png)

1. **Untuk mendapatkan rahasia klien Anda, pilih **Klien**, lalu **app-demo**, lalu Kredensial.**  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_6.jpg)

1. Pilih **Klien**, lalu **cakupan Klien**, lalu **Tambahkan mapper yang telah ditentukan sebelumnya**. Pilih **peran ranah**.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_7.jpg)

1. Edit peran ranah Anda dengan konfigurasi yang ditunjukkan pada gambar berikut.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_8.jpg)

1. Ingat **Nama Klaim Token** yang ditentukan. Anda akan memerlukan nilai ini dalam definisi pengaturan Gapwalk untuk properti. `gapwalk-application.security.claimGroupName`  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_9.jpg)

1. Pilih **peran Realms**, dan buat 3 peran:**SUPER\$1ADMIN**,**ADMIN**, dan**USER**. Peran ini kemudian dipetakan ke`ROLE_SUPER_ADMIN`,`ROLE_ADMIN`, dan `ROLE_USER` oleh aplikasi Gapwalk untuk dapat mengakses beberapa panggilan API REST terbatas.  
![\[alt_text\]](http://docs.aws.amazon.com/id_id/m2/latest/userguide/images/ba-runtime-auth-keycloak_10.jpg)

## Integrasikan Keycloak ke dalam aplikasi Gapwalk
<a name="gapwalk-setup"></a>

Edit Anda `application-main.yml` sebagai berikut:

```
gapwalk-application.security: enabled
gapwalk-application.security.identity: oauth
gapwalk-application.security.issuerUri: http://<KEYCLOAK_SERVER_HOSTNAME>/realms/<YOUR_REALM_NAME>
gapwalk-application.security.claimGroupName: "keycloak:groups"

gapwalk-application.security.userAttributeName: "preferred_username"
# Use "username" for cognito, 
#     "preferred_username" for keycloak
#      or any other string

spring:
  security:
    oauth2:
      client:
        registration:
          demo:
            client-id: <YOUR_CLIENT_ID>
            client-name: Demo App
            client-secret: <YOUR_CLIENT_SECRET>
            provider: keycloak
            authorization-grant-type: authorization_code
            scope: openid
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          keycloak:
            issuer-uri: ${gapwalk-application.security.issuerUri}
            authorization-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/auth
            jwk-set-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/certs
            token-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/token
            user-name-attribute: ${gapwalk-application.security.userAttributeName}
      resourceserver:
        jwt:
          jwk-set-uri: ${gapwalk-application.security.issuerUri}/protocol/openid-connect/certs
```

Ganti*<KEYCLOAK\$1SERVER\$1HOSTNAME>*,*<YOUR\$1REALM\$1NAME>*,*<YOUR\$1CLIENT\$1ID>*, dan *<YOUR\$1CLIENT\$1SECRET>* dengan nama host server Keycloak Anda, nama ranah Anda, ID klien Anda, dan rahasia klien Anda.

# Konfigurasikan batasan laju untuk AWS Transform untuk Runtime mainframe
<a name="ba-runtime-rate-limiting"></a>

AWS Transform for mainframe Runtime mencakup fungsionalitas pembatas laju bawaan untuk melindungi aplikasi gapwalk dari permintaan yang berlebihan dan potensi penyalahgunaan. Sistem pembatas laju menggunakan algoritma Token Bucket untuk menyediakan kapasitas burst dan pembatasan laju berkelanjutan.

**Topics**
+ [Ikhtisar pembatasan tarif](#ba-runtime-rate-limiting-overview)
+ [Properti konfigurasi](#ba-runtime-rate-limiting-config)
+ [Aktifkan pembatasan tarif](#ba-runtime-rate-limiting-enable)
+ [Identifikasi klien](#ba-runtime-rate-limiting-client-id)
+ [Header batas nilai](#ba-runtime-rate-limiting-headers)
+ [Manajemen memori](#ba-runtime-rate-limiting-memory)

## Ikhtisar pembatasan tarif
<a name="ba-runtime-rate-limiting-overview"></a>

Sistem pembatas laju menyediakan fitur-fitur berikut:

**Algoritma Bucket Token**  
+ Memungkinkan lalu lintas burst hingga kapasitas burst yang dikonfigurasi
+ Isi ulang token dengan kecepatan tetap berdasarkan permintaan per menit
+ Memberikan pembatasan tingkat kelancaran tanpa memblokir lonjakan lalu lintas yang sah

**Identifikasi Klien**  
+ Mengidentifikasi klien dengan alamat IP dengan dukungan proxy
+ Dukungan X-Forwarded-For dan X-Real-IP header
+ Menangani penyeimbang beban dan skenario proxy terbalik

**Automatic Memory Management**  
+ Secara otomatis membersihkan ember batas tarif kedaluwarsa
+ Interval pembersihan yang dapat dikonfigurasi dan waktu kedaluwarsa
+ Mencegah kebocoran memori dalam aplikasi yang berjalan lama

**Integrasi HTTP**  
+ Mengembalikan HTTP 429 (Terlalu Banyak Permintaan) ketika batas terlampaui
+ Termasuk header batas tarif standar dalam tanggapan
+ Memberikan informasi retry-after untuk klien

## Properti konfigurasi
<a name="ba-runtime-rate-limiting-config"></a>

Konfigurasikan pembatasan laju dalam `application-main.yaml` file Anda:

```
gapwalk:
  ratelimiting:
    enabled: true                                        # Enable/disable rate limiting
    requestsPerMinute: 1000                              # Sustained rate limit per minute
    burstCapacity: 1500                                  # Maximum burst requests allowed
    includeHeaders: true                                 # Include X-RateLimit-* headers
    cleanupIntervalMinutes: 5                            # Cleanup interval for expired buckets
    bucketExpiryHours: 1                                 # Hours after which unused buckets expire
    errorMessage: "Too many requests. Try again later."  # Custom error message
    whitelistIps: ""                                     # Comma-separated IPs to bypass limiting
    perEndpointLimiting: false                           # Apply limits per endpoint (not implemented)
```

### Deskripsi properti
<a name="ba-runtime-rate-limiting-config-properties"></a>

**diaktifkan**  
Sakelar utama untuk mengaktifkan atau menonaktifkan fungsionalitas pembatas laju. Default: `false`

**requestsPerMinute**  
Jumlah permintaan yang diizinkan per menit untuk pembatasan tarif berkelanjutan. Ini mewakili tingkat isi ulang token. Default: `1000`

**Kapasitas Burst**  
Jumlah maksimum permintaan yang diizinkan dalam burst sebelum pembatasan tarif berlaku. Harus lebih tinggi daripada `requestsPerMinute` memungkinkan lonjakan lalu lintas. Default: `1500`

**IncludeHeaders**  
Apakah akan menyertakan header batas tingkat standar (`X-RateLimit-Limit`,`X-RateLimit-Remaining`,`X-RateLimit-Reset`) dalam tanggapan HTTP. Default: `true`

**cleanupIntervalMinutes**  
Interval dalam hitungan menit antara pembersihan otomatis ember batas tarif kedaluwarsa. Membantu mencegah kebocoran memori. Default: `5`

**bucketExpiryHours**  
Waktu dalam beberapa jam setelah ember batas tarif yang tidak digunakan dianggap kedaluwarsa dan memenuhi syarat untuk pembersihan. Default: `1`

**errorMessage**  
Pesan kesalahan kustom dikembalikan dalam respons JSON ketika batas tingkat terlampaui. Default: `"Too many requests. Try again later."`

**Whitelistips**  
Daftar alamat IP yang dipisahkan koma yang memintas batas laju sepenuhnya. Berguna untuk pemeriksaan kesehatan atau sistem tepercaya. Default: `empty`

**perEndpointLimiting**  
Apakah akan menerapkan batas tarif terpisah per titik akhir, bukan per klien saja. Saat ini tidak diimplementasikan. Default: `false`

## Aktifkan pembatasan tarif
<a name="ba-runtime-rate-limiting-enable"></a>

Untuk mengaktifkan pembatasan laju dengan pengaturan default:

```
gapwalk:
  ratelimiting:
    enabled: true
```

## Identifikasi klien
<a name="ba-runtime-rate-limiting-client-id"></a>

Sistem pembatas tarif mengidentifikasi klien menggunakan urutan prioritas berikut:

1. **X-Forwarded-For header** (IP pertama jika dipisahkan koma)

1. **X-Real-IP sundulan**

1. **Alamat jarak jauh** dari permintaan HTTP

Ini memastikan identifikasi klien yang tepat ketika aplikasi berada di belakang:
+ Penyeimbang beban
+ Membalikkan proxy
+ CDNs
+ Gerbang API

### Contoh identifikasi klien
<a name="ba-runtime-rate-limiting-client-id-example"></a>

```
# Direct connection
Client IP: 192.168.1.100

# Behind load balancer with X-Forwarded-For
X-Forwarded-For: 203.0.113.45, 192.168.1.100
Client IP: 203.0.113.45 (first IP used)

# Behind reverse proxy with X-Real-IP
X-Real-IP: 203.0.113.45
Client IP: 203.0.113.45
```

## Header batas nilai
<a name="ba-runtime-rate-limiting-headers"></a>

Ketika `includeHeaders` diaktifkan, header berikut ditambahkan ke respons HTTP:

**X- RateLimit -Batas**  
Batas batas tarif untuk klien (permintaan per menit)

**X- RateLimit -Tersisa**  
Jumlah permintaan yang tersisa di jendela batas tarif saat ini

**X- RateLimit -Setel Ulang**  
Waktu di mana jendela batas laju disetel ulang (stempel waktu Unix)

### Contoh header respon
<a name="ba-runtime-rate-limiting-headers-example"></a>

```
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1640995200
```

### Batas nilai melebihi respons
<a name="ba-runtime-rate-limiting-headers-exceeded"></a>

Ketika batas kurs terlampaui, sistem mengembalikan:

**Status HTTP**  
429 Terlalu Banyak Permintaan

**Content-Type**  
aplikasi/json

**Coba Ulang-Setelah**  
Jumlah detik untuk menunggu sebelum mencoba lagi

```
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Try again later.",
  "retryAfter": 60,
  "timestamp": 1640995140000
}
```

## Manajemen memori
<a name="ba-runtime-rate-limiting-memory"></a>

Sistem pembatas laju secara otomatis mengelola memori untuk mencegah kebocoran dalam aplikasi yang berjalan lama:

**Pembersihan Otomatis**  
+ Berjalan setiap `cleanupIntervalMinutes` menit
+ Menghapus ember yang tidak digunakan selama berjam-jam `bucketExpiryHours`
+ Aktivitas pembersihan log untuk pemantauan

**Efisiensi Memori**  
+ Menggunakan struktur data bersamaan untuk keamanan utas
+ Pembuatan ember malas (hanya bila diperlukan)
+ Implementasi token bucket yang efisien

### Memantau aktivitas pembersihan
<a name="ba-runtime-rate-limiting-memory-monitoring"></a>

Periksa log untuk pesan pembersihan:

```
INFO  RateLimitingService - Cleaned up 15 expired rate limiting buckets
```