

AWS Il servizio di modernizzazione del mainframe (esperienza Managed Runtime Environment) non è più aperto a nuovi clienti. Per funzionalità simili a AWS Mainframe Modernization Service (esperienza Managed Runtime Environment), esplora AWS Mainframe Modernization Service (Self-Managed Experience). I clienti esistenti possono continuare a utilizzare il servizio normalmente. [Per ulteriori informazioni, consulta AWS Modifica della disponibilità di Mainframe Modernization.](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Configurare la sicurezza per le applicazioni Gapwalk
<a name="ba-runtime-security"></a>

I seguenti argomenti descrivono come proteggere le applicazioni Gapwalk.

È responsabilità dell'utente fornire la configurazione corretta per garantire che l'uso del framework AWS Transform for mainframe sia sicuro.

Tutte le funzionalità relative alla sicurezza sono disattivate per impostazione predefinita. Per abilitare l'autenticazione (e CSRF, XSS, CSP e così via), imposta su e su. `gapwalk-application.security` `enabled` `gapwalk-application.security.identity` `oauth`

**Topics**
+ [Configurare l'accessibilità degli URI per le applicazioni Gapwalk](ba-runtime-filteringURIs.md)
+ [Configurare l'autenticazione per le applicazioni Gapwalk](ba-runtime-auth.md)
+ [Configurare la limitazione della velocità per AWS Transform for mainframe Runtime](ba-runtime-rate-limiting.md)

# Configurare l'accessibilità degli URI per le applicazioni Gapwalk
<a name="ba-runtime-filteringURIs"></a>

Questo argomento descrive come configurare il filtraggio delle URIs applicazioni Gapwalk. Questa funzionalità non richiede un provider di identità (IdP).

Per bloccare un elenco di URIs, aggiungi le due righe seguenti all'`application-main.yml`applicazione modernizzata, sostituendole *URI-1**URI-2*, e così via, con quella URIs che desideri bloccare.

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

# Configurare l'autenticazione per le applicazioni Gapwalk
<a name="ba-runtime-auth"></a>

Per configurare OAuth2 l'autenticazione per l'applicazione Gapwalk, è necessario configurare un provider di identità (IdP) e integrarlo con l'applicazione. Questa guida illustra i passaggi per utilizzare Amazon Cognito o Keycloak come IdP. Con Amazon Cognito, puoi aggiornare il file di configurazione dell'applicazione con i dettagli del pool di utenti Cognito. Con Keycloak, puoi controllare l'accesso alle tue applicazioni APIs e alle tue risorse in base ai ruoli assegnati all'utente.

**Topics**
+ [Configura l' OAuth2 autenticazione Gapwalk con Amazon Cognito](ba-runtime-auth-cognito.md)
+ [Configura l'autenticazione OAuth2 Gapwalk con Keycloak](ba-runtime-auth-keycloak.md)

# Configura l' OAuth2 autenticazione Gapwalk con Amazon Cognito
<a name="ba-runtime-auth-cognito"></a>

Questo argomento descrive come configurare OAuth2 l'autenticazione per le applicazioni Gapwalk utilizzando Amazon Cognito come provider di identità (IdP).

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

In questo tutorial utilizzeremo Amazon Cognito come IdP e PlanetDemo come progetto modernizzato.

Puoi utilizzare qualsiasi altro provider di identità esterno. Le ClientRegistration informazioni devono essere ottenute dal tuo IdP e sono necessarie per l'autenticazione di Gapwalk. Per ulteriori informazioni, consulta la [Guida per sviluppatori di Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/) .

**Le informazioni: ClientRegistration **

client-id  
L'ID del ClientRegistration. Nel nostro esempio lo sarà. PlanetsDemo

segreto del cliente  
Il segreto del tuo cliente.

endpoint di autorizzazione  
L'URI dell'endpoint di autorizzazione per il server di autorizzazione.

endpoint del token  
L'URI dell'endpoint del token per il server di autorizzazione.

endpoint jwks  
L'URI utilizzato per ottenere la chiave Web JSON (JWK) che contiene le chiavi per la convalida della firma web JSON emessa dal server di autorizzazione.

URI di reindirizzamento  
L'URI a cui il server di autorizzazione reindirizza l'utente finale se l'accesso viene concesso.

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

Per prima cosa creeremo e configureremo un pool di utenti e utenti Amazon Cognito che utilizzeremo con la nostra applicazione Gapwalk distribuita a scopo di test.

**Nota**  
Se utilizzi un altro IdP, puoi saltare questo passaggio.

**Crea un pool di utenti**

1. Accedi ad Amazon Cognito in Console di gestione AWS ed esegui l'autenticazione utilizzando le tue credenziali. AWS 

1. Scegli **User Pools** (Pool di utenti).

1. Scegli **Create a User Pool (Crea un bacino d'utenza)**.

1. In **Configura l'esperienza di accesso**, mantieni il tipo di provider predefinito del pool di **utenti Cognito**. **Puoi scegliere una o più **opzioni di accesso al pool di utenti di Cognito**; per ora, scegli **Nome utente**, quindi scegli Avanti.**  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/cog-auth-provider.png)

1. **In **Configura i requisiti di sicurezza**, mantieni le impostazioni predefinite e disabilita **l'autenticazione a più fattori** scegliendo Nessuna **MFA**, quindi scegli Avanti.**  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/cog-sec-requirements.png)

1. **Come misura di sicurezza, disattiva **Abilita l'autoregistrazione**, quindi scegli Avanti.**  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/cog-config-sign-up.png)

1. **Scegli **Invia email con Cognito**, quindi scegli Avanti.**  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/cog-email.png)

1. In **Integra la tua app**, specifica un nome per il tuo pool di utenti. Nelle **pagine di autenticazione ospitate**, scegli **Usa l'interfaccia utente ospitata da Cognito**.  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/cog-domain.png)

1. Per semplicità, in **Dominio**, scegli **Usa un dominio Cognito** e inserisci un prefisso di dominio, ad esempio. `https://planetsdemo` L'app demo deve essere aggiunta come client.

   1. Nel **client iniziale dell'app**, scegli **Client riservato**. Inserisci il nome del client dell'app, ad esempio**planetsdemo**, quindi scegli **Genera un segreto client**.

   1. In **URL di callback consentito**, inserisci l'URL a cui reindirizzare l'utente dopo l'autenticazione. L'URL deve terminare con. `/login/oauth2/code/cognito` Ad esempio, per la nostra applicazione e le applicazioni di backend Gapwalk e 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
      ```

      Puoi modificare l'URL in un secondo momento.  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/cog-urls.png)

   1. In **Connessione consentita**, URLs inserisci l'URL della pagina di disconnessione a cui desideri reindirizzare Amazon Cognito quando l'applicazione disconnette gli utenti. Ad esempio, per le applicazioni backend Gapwalk e BAC:

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

      Puoi modificare l'URL in un secondo momento.

   1. Mantieni i valori predefiniti nelle sezioni **Impostazioni avanzate del client dell'app** e **Attribuisci autorizzazioni di lettura e scrittura**.

   1. Scegli **Next (Successivo)**.

1. In **Rivedi e crea**, verifica le tue scelte, quindi scegli **Crea pool di utenti**.

Per ulteriori informazioni, consulta [Creare un pool di utenti](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html).

**Creazione di utenti**

Poiché l'autoregistrazione è disabilitata, crea un utente Amazon Cognito. Accedi ad Amazon Cognito in. Console di gestione AWS Scegli il pool di utenti che hai creato, quindi in **Utenti** scegli **Crea utente**.

In **Informazioni utente**, scegli **Invia un invito via e-mail**, inserisci un nome utente e un indirizzo e-mail e scegli **Genera una password**. Selezionare **Create user (Crea utente)**.

**Creazione del ruolo**

Nella scheda **Gruppi**, crea 3 gruppi (SUPER\$1ADMIN, ADMIN e USER) e associa il tuo utente a uno o più di questi gruppi. Questi ruoli vengono successivamente mappati su ROLE\$1SUPER\$1ADMIN, ROLE\$1ADMIN e ROLE\$1USER dall'applicazione Gapwalk per consentire l'accesso ad alcune chiamate REST API con restrizioni.

L'applicazione scope-to-role implementa una mappatura OAuth2 gerarchica che funziona con più provider di identità. Quando i token JWT emessi da Cognito vengono utilizzati per l'autorizzazione del server di risorse, gli ambiti definiti nel token vengono mappati automaticamente ai ruoli corrispondenti.

## Integra Amazon Cognito nell'applicazione Gapwalk
<a name="integrate-cognito"></a>

Ora che il pool di utenti e gli utenti di Amazon Cognito sono pronti, vai al `application-main.yml` file della tua applicazione modernizzata e aggiungi il codice seguente:

```
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
```

Sostituisci i seguenti segnaposto come descritto:

1. Accedi ad Amazon Cognito in Console di gestione AWS ed esegui l'autenticazione utilizzando le tue credenziali. AWS 

1. Scegli **User Pools** e scegli il pool di utenti che hai creato. Puoi trovare il tuo **ID *pool-id* del pool di utenti**.

1. Scegli **l'integrazione delle app** dove puoi trovare la tua*your-cognito-domain*, quindi vai su **App client e analisi** e scegli la tua app.

1. Nel **client App: YourApp** puoi trovare *client-name**client-id*, e *client-secret* (**Mostra il segreto del client**).

1. *region-id*corrisponde all'ID della AWS regione in cui hai creato l'utente e il pool di utenti di Amazon Cognito. Esempio: `eu-west-3`.

1. Per *redirect-uri* inserisci l'URI che hai specificato per **Allowed callback** URL. Nel nostro esempio lo è`http://localhost:8080/planetsdemo/login/oauth2/code/cognito`.

Ora puoi distribuire la tua applicazione Gapwalk e utilizzare l'utente creato in precedenza per accedere alla tua app.

# Configura l'autenticazione OAuth2 Gapwalk con Keycloak
<a name="ba-runtime-auth-keycloak"></a>

Questo argomento descrive come configurare OAuth2 l'autenticazione per le applicazioni Gapwalk utilizzando Keycloak come provider di identità (IdP). In questo tutorial utilizziamo Keycloak 24.0.0.

## Prerequisiti
<a name="ba-runtime-auth-keycloak-prereq"></a>
+ [Keycloak](https://www.keycloak.org/)
+ Applicazione Gapwalk

## Configurazione Keycloak
<a name="keycloak-setup"></a>

1. Vai alla dashboard di Keycloak nel tuo browser web. Le credenziali predefinite sono admin/admin. Vai alla barra di navigazione in alto a sinistra e crea un realm con il nome**demo**, come mostrato nell'immagine seguente.  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_2.png)

1. Crea un client con il nome**app-demo**.  
![\[User interface for creating a new client in an authentication management system.\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_3.jpg)

   `localhost:8080`Sostituiscilo con l'indirizzo della tua applicazione Gapwalk  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_4.png)  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_5.png)

1. **Per rendere segreto il tuo client, scegli **Clients**, poi **app-demo, quindi Credenziali**.**  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_6.jpg)

1. **Scegli **Clienti**, quindi Ambiti **client, quindi Aggiungi mappatore** predefinito.** **Scegli i ruoli del realm.**  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_7.jpg)

1. Modifica il tuo ruolo di realm con la configurazione mostrata nell'immagine seguente.  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_8.jpg)

1. Ricorda il **Token Claim Name** definito. Avrai bisogno di questo valore nella definizione delle impostazioni Gapwalk per la `gapwalk-application.security.claimGroupName` proprietà.  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_9.jpg)

1. Scegli **i ruoli di Realms** e crea 3 ruoli:**SUPER\$1ADMIN**, **ADMIN** e. **USER** Questi ruoli vengono successivamente mappati su `ROLE_SUPER_ADMIN` e `ROLE_USER` dall'applicazione Gapwalk per poter accedere ad alcune chiamate API REST con restrizioni. `ROLE_ADMIN`  
![\[alt_text\]](http://docs.aws.amazon.com/it_it/m2/latest/userguide/images/ba-runtime-auth-keycloak_10.jpg)

## Integra Keycloak nell'applicazione Gapwalk
<a name="gapwalk-setup"></a>

Modifica il tuo come segue: `application-main.yml`

```
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
```

Sostituisci *<KEYCLOAK\$1SERVER\$1HOSTNAME>**<YOUR\$1REALM\$1NAME>*,*<YOUR\$1CLIENT\$1ID>*, e *<YOUR\$1CLIENT\$1SECRET>* con il nome host del server Keycloak, il nome dell'area, l'ID cliente e il segreto del cliente.

# Configurare la limitazione della velocità per AWS Transform for mainframe Runtime
<a name="ba-runtime-rate-limiting"></a>

AWS Transform for mainframe Runtime include funzionalità integrate di limitazione della velocità per proteggere l'applicazione gapwalk da richieste eccessive e potenziali abusi. Il sistema di limitazione della velocità utilizza l'algoritmo Token Bucket per fornire sia una capacità di burst che una limitazione sostenuta della velocità.

**Topics**
+ [Panoramica sulla limitazione della velocità](#ba-runtime-rate-limiting-overview)
+ [Proprietà della configurazione](#ba-runtime-rate-limiting-config)
+ [Abilita la limitazione della velocità](#ba-runtime-rate-limiting-enable)
+ [Identificazione del cliente](#ba-runtime-rate-limiting-client-id)
+ [Intestazioni relative ai limiti di velocità](#ba-runtime-rate-limiting-headers)
+ [Gestione della memoria](#ba-runtime-rate-limiting-memory)

## Panoramica sulla limitazione della velocità
<a name="ba-runtime-rate-limiting-overview"></a>

Il sistema di limitazione della velocità offre le seguenti funzionalità:

**Algoritmo Token Bucket**  
+ Consente il traffico burst fino alla capacità di burst configurata
+ Ricarica i token a una velocità costante in base alle richieste al minuto
+ Fornisce una limitazione fluida della velocità senza bloccare i picchi di traffico legittimi

**Identificazione del cliente**  
+ Identifica i client in base all'indirizzo IP con supporto proxy
+ Supporti X-Forwarded-For e X-Real-IP intestazioni
+ Gestisce scenari di bilanciamento del carico e proxy inverso

**Gestione automatica della memoria**  
+ Pulisce automaticamente i periodi con limiti di velocità scaduti
+ Intervalli di pulizia e tempi di scadenza configurabili
+ Previene le perdite di memoria nelle applicazioni a esecuzione prolungata

**Integrazione HTTP**  
+ Restituisce HTTP 429 (Troppe richieste) quando i limiti vengono superati
+ Include le intestazioni dei limiti di velocità standard nelle risposte
+ Fornisce ai clienti informazioni da riprovare

## Proprietà della configurazione
<a name="ba-runtime-rate-limiting-config"></a>

Configura la limitazione della velocità nel tuo file: `application-main.yaml`

```
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)
```

### Descrizioni delle proprietà
<a name="ba-runtime-rate-limiting-config-properties"></a>

**abilitato**  
Switch principale per abilitare o disabilitare la funzionalità di limitazione della velocità. Impostazione predefinita: `false`

**requestsPerMinute**  
Numero di richieste consentite al minuto per la limitazione sostenuta della velocità. Rappresenta la frequenza di ricarica del token. Impostazione predefinita: `1000`

**Burst Capacity**  
Numero massimo di richieste consentite in un burst prima dell'applicazione del limite di velocità. Dovrebbe essere superiore `requestsPerMinute` a quello necessario per consentire picchi di traffico. Impostazione predefinita: `1500`

**Includi le intestazioni**  
Se includere le intestazioni dei limiti di velocità standard (`X-RateLimit-Limit`,`X-RateLimit-Remaining`,`X-RateLimit-Reset`) nelle risposte HTTP. Impostazione predefinita: `true`

**cleanupIntervalMinutes**  
Intervallo in minuti tra la pulizia automatica dei periodi limite di velocità scaduti. Aiuta a prevenire perdite di memoria. Impostazione predefinita: `5`

**bucketExpiryHours**  
Tempo in ore dopo il quale i periodi limite di velocità non utilizzati vengono considerati scaduti e idonei alla pulizia. Impostazione predefinita: `1`

**errorMessage**  
Messaggio di errore personalizzato restituito nella risposta JSON quando viene superato il limite di velocità. Impostazione predefinita: `"Too many requests. Try again later."`

**Suggerimenti sulla lista bianca**  
Elenco separato da virgole di indirizzi IP che aggirano completamente la limitazione della velocità. Utile per controlli sanitari o sistemi affidabili. Impostazione predefinita: `empty`

**perEndpointLimiting**  
Se applicare limiti di velocità separati per endpoint anziché solo per client. Attualmente non implementato. Impostazione predefinita: `false`

## Abilita la limitazione della velocità
<a name="ba-runtime-rate-limiting-enable"></a>

Per abilitare la limitazione della velocità con le impostazioni predefinite:

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

## Identificazione del cliente
<a name="ba-runtime-rate-limiting-client-id"></a>

Il sistema di limitazione della velocità identifica i client utilizzando il seguente ordine di priorità:

1. **X-Forwarded-For intestazione** (primo IP se separato da virgole)

1. **X-Real-IP intestazione**

1. **Indirizzo remoto** dalla richiesta HTTP

Ciò garantisce una corretta identificazione del client quando l'applicazione è responsabile:
+ Sistemi di load balancer
+ Proxy inversi
+ CDNs
+ Gateway API

### Esempio di identificazione del cliente
<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
```

## Intestazioni relative ai limiti di velocità
<a name="ba-runtime-rate-limiting-headers"></a>

Quando `includeHeaders` è abilitata, le seguenti intestazioni vengono aggiunte alle risposte HTTP:

**X- RateLimit -Limite**  
Il limite di velocità per il cliente (richieste al minuto)

**X- RateLimit -Rimanente**  
Il numero di richieste rimanenti nella finestra del limite di velocità corrente

**X- RateLimit -Ripristina**  
L'ora in cui viene ripristinata la finestra del limite di velocità (timestamp Unix)

### Esempi di intestazioni di risposta
<a name="ba-runtime-rate-limiting-headers-example"></a>

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

### Il limite di frequenza ha superato la risposta
<a name="ba-runtime-rate-limiting-headers-exceeded"></a>

Quando viene superato il limite di velocità, il sistema restituisce:

**Stato HTTP**  
429 Troppe richieste

**Content-Type**  
application/json

**Riprova dopo**  
Numero di secondi di attesa prima di riprovare

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

## Gestione della memoria
<a name="ba-runtime-rate-limiting-memory"></a>

Il sistema di limitazione della velocità gestisce automaticamente la memoria per prevenire perdite nelle applicazioni con esecuzione prolungata:

**Pulizia automatica**  
+ Funziona ogni minuto `cleanupIntervalMinutes`
+ Rimuove i secchi inutilizzati da ore `bucketExpiryHours`
+ Registra l'attività di pulizia per il monitoraggio

**Efficienza della memoria**  
+ Utilizza strutture di dati simultanee per la sicurezza dei thread
+ Creazione di Lazy Bucket (solo quando necessario)
+ Implementazione efficiente del token bucket

### Monitoraggio dell'attività di pulizia
<a name="ba-runtime-rate-limiting-memory-monitoring"></a>

Controlla i registri per i messaggi di pulizia:

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