Architetture di login e di sessione per applicazioni mobili native con IdP
- Obiettivo e contestoQuesto articolo descrive varianti architetturali pulite per l’autenticazione e la gestione delle sessioni in applicazioni mobili native che utilizzano un Identity Provider (IdP) esterno tramite OAuth 2.0 / OpenID Connect (OIDC).
Obiettivo:- chiara separazione dei meccanismi
- varianti comparabili
- base decisionale solida
- chiara separazione dei meccanismi
- Fondamenti dell’architettura (termini precisi)2.1 Componenti coinvolti
- App mobile (client pubblico)
- Authorization Server / IdP
- Resource Server (API)
2.2 Artefatti dei token- Access Token
- a breve durata (tipicamente: minuti)
- accesso alle API
- a breve durata (tipicamente: minuti)
- Refresh Token
- a durata più lunga
- serve per rinnovare gli access token
- altamente sensibile
- a durata più lunga
2.3 Due livelli di sessione rigorosamente separati
(A) Sessione IdP- esiste nel browser di sistema / ASWebAuthenticationSession / Custom Tabs
- consente il SSO
- non è direttamente controllata dall’app
- basata su token memorizzati localmente
- completamente sotto il controllo dell’app
- App mobile (client pubblico)
- Dimensioni del design (ortogonali!)Tutte le architetture significative derivano dalla combinazione di queste dimensioni:
3.1 Dimensione 1: Persistenza della sessione (lato app)
Variante 1: Nessuna persistenza- token solo in memoria (RAM)
- persi dopo il riavvio dell’app
- refresh token nel secure storage:
- iOS: Keychain
- Android: Keystore
- iOS: Keychain
- rinnovo automatico dei token
3.2 Dimensione 2: Modello di durata della sessione
Valido per refresh token / sessione:
Durata assoluta- limite massimo rigido (p. es. 30 giorni)
- scadenza dopo inattività (p. es. 15 min)
- estensione con l’utilizzo
- tipicamente combinata con:
- rotazione
- durata massima
- rotazione
3.3 Dimensione 3: Rinnovo dei token
Senza refresh token- l’access token scade → nuovo login necessario
- silent refresh possibile
- ogni rinnovo → nuovo refresh token
- il token precedente diventa invalido
3.4 Dimensione 4: Protezione dell’accesso lato app
Indipendentemente dall’IdP:Nessun blocco aggiuntivo
Ri-autenticazione locale
- biometria (Face ID / impronta digitale)
- PIN del dispositivo
- all’avvio dell’app
- al ritorno in primo piano
- per azioni sensibili (step-up)
3.5 Dimensione 5: Livello di sicurezza dei token
Bearer token- il possesso è sufficiente
(p. es. DPoP)- token legato a una chiave crittografica
- protezione contro il furto di token
- chiave nel Secure Enclave / TEE
- massimo legame al dispositivo
3.6 Dimensione 6: Utilizzo della sessione IdP (comportamento SSO)
SSO attivo- nuovo login possibile senza interazione utente
- p. es. prompt=login
- token solo in memoria (RAM)
- Varianti di architettura di riferimentoCombinazioni realistiche e sensate:Variante A: Sessione effimera (alta sicurezza) ×
Configurazione- nessuna persistenza
- nessun refresh token
- access token breve
- la sessione termina alla chiusura dell’app
- la sessione IdP può velocizzare il login
- rischio minimo in caso di perdita del dispositivo
- nessuna memorizzazione dei token
- UX molto scarsa
- redirect frequenti
- applicazioni altamente sensibili e specializzate
Variante B: Sessione persistente (standard)×
Configurazione- refresh token nel secure storage
- bearer token
- durata assoluta
- «restare connesso»
- silent refresh
- UX molto buona
- implementazione standard
- rischio in caso di esfiltrazione dei token
- revoca critica
Variante C: Sessione persistente con sliding + rotazione (best practice)×
Configurazione- refresh token + rotazione
- sessione sliding + limite assoluto
- secure storage
- l’utilizzo attivo prolunga la sessione
- i token compromessi vengono rapidamente invalidati
- ottimo equilibrio tra UX e sicurezza
- ampiamente diffusa oggi
- maggiore complessità
- il server deve gestire lo stato
Variante D: Persistenza + ri-autenticazione locale×
Configurazione- come variante B o C
- in aggiunta
- biometria / PIN prima dell’accesso
- due livelli di protezione:
- possesso (token)
- presenza dell’utente
- sicurezza significativamente maggiore con buona UX
- protegge da «shoulder surfing» / dispositivo sbloccato
- frizione UX
- necessaria logica di fallback
- banking
- eGovernment
Variante E: Sessione con token vincolati (alta sicurezza moderna)×
Configurazione- DPoP o meccanismi simili
- chiave nel Secure Enclave / Keystore
- spesso combinata con C o D
- il solo token non è sufficiente
- vincolo al dispositivo
- protezione molto elevata contro il furto di token
- stato dell’arte
- complessa
- interoperabilità / debugging impegnativi
- nessuna persistenza
- Confronto delle varianti
Variante UX Sicurezza Complessità Nota A Effimera ❌ ✅✅ ✅ raramente utile B Persistente ✅ ⚠️ ⚠️ base C Sliding + Rotazione ✅ ✅ ⚠️⚠️ best practice D + Re-Auth ⚠️/✅ ✅✅ ⚠️⚠️ per dati sensibili E Sender-Constrained ✅ 🚀 ❌ high-end - Temi critici (spesso sottovalutati) 6.1 Semantica del logout
- logout locale → eliminare i token
- logout globale → terminare la sessione IdP (browser)
- revoca → invalidare i refresh token lato server
6.2 Perdita del dispositivo
Domande:- i token sono protetti?
- la biometria è attiva?
- esiste una revoca remota?
6.3 Comportamento offline- access token valido → utilizzo offline possibile?
- refresh → richiede rete
6.4 Multi-dispositivo- refresh token separati per dispositivo?
- invalidazione centralizzata?
6.5 Step-up authentication- ri-autenticazione per azioni critiche
- indipendente dalla sessione
- logout locale → eliminare i token
- -Raccomandazioni
- applicazioni standard → variante C
- applicazioni sensibili (p. es. eIAM / autorità) → variante D + opzionale E
- massima sicurezza → combinazione C + D + E
- applicazioni standard → variante C
- ConclusioneIl punto chiave è:Non esiste «un unico pattern di login», ma un sistema modulare di decisioni ortogonali.
Un’architettura pulita significa:- non mescolare le dimensioni
- scegliere consapevolmente la combinazione
- affrontare esplicitamente i rischi
- non mescolare le dimensioni
Raccomandazione: architettura di autenticazione e sessione per un’app mobile altamente sensibile
- ObiettivoL’applicazione deve:
- soddisfare elevati requisiti di sicurezza (prevenire abusi in caso di perdita del dispositivo)
- rimanere efficiente nell’uso quotidiano
- funzionare in condizioni variabili (uso discontinuo, connettività limitata)
- soddisfare elevati requisiti di sicurezza (prevenire abusi in caso di perdita del dispositivo)
- Architettura raccomandata (combinazione)2.1 Strategia di sessione
→ Sessione persistente con durata sliding e rotazione
Implementazione- utilizzo di refresh token
- memorizzazione in secure storage della piattaforma
- rotazione del refresh token ad ogni rinnovo
- combinazione di:
- timeout di inattività (p. es. ore)
- durata assoluta (p. es. giorni)
- timeout di inattività (p. es. ore)
- evita login frequenti durante l’uso
- limita l’impatto di compromissione dei token
- standard per sistemi moderni e sicuri
2.2 Protezione dell’accesso lato app
→ Ri-autenticazione locale obbligatoria
Implementazione- accesso alla sessione solo dopo:
- biometria (principale)
- PIN del dispositivo (fallback)
- biometria (principale)
- applicazione:
- all’avvio
- dopo inattività definita
- per azioni sensibili
- all’avvio
- protezione contro:
- dispositivi sbloccati non sorvegliati
- dispositivi condivisi
- dispositivi sbloccati non sorvegliati
- aumento significativo della sicurezza senza re-login completo
2.3 Livello di sicurezza dei token
→ Token vincolati al mittente (raccomandato)
Implementazione- vincolo a una chiave specifica del dispositivo
- memorizzazione in:
- Secure Enclave (iOS)
- TEE (Android)
- Secure Enclave (iOS)
- impedisce l’uso su altri dispositivi
- riduce il rischio in caso di malware
2.4 Integrazione IdP
→ Login tramite browser di sistema (best practice OIDC)
Implementazione- ASWebAuthenticationSession (iOS)
- Custom Tabs (Android)
- uso della sessione IdP esistente (SSO)
- nessuna gestione di credenziali nell’app
- uso del MFA esistente
2.5 Strategia di logout e revoca
Implementazione- logout locale → eliminazione dei token
- revoca lato server → invalidazione dei refresh token
- opzionale: logout globale tramite IdP
- interruzione controllata della sessione in caso di:
- perdita del dispositivo
- cambio di ruolo
- incidenti di sicurezza
- perdita del dispositivo
2.6 Comportamento offline
Raccomandazione- consentire accesso offline a dati non sensibili già caricati
- nessun rinnovo token senza rete
- azioni sensibili solo online
- utilizzo di refresh token
- Livello di sicurezza (valutazione)La combinazione raccomandata offre:
- alta protezione contro la perdita del dispositivo
- alta protezione contro il furto di token
- durata della sessione controllata
- buona usabilità operativa
- alta protezione contro la perdita del dispositivo
- Alternative scartateNessun re-login completo ad ogni utilizzo
- troppa frizione
- non praticabile operativamente
- protezione insufficiente in caso di accesso fisico
- maggiore rischio di esfiltrazione
- troppa frizione
- Misure aggiuntive (opzionali)
- step-up authentication
- attestazione del dispositivo
- remote session kill
- rilevamento root/jailbreak (con cautela)
- step-up authentication
- ConclusioneArchitettura raccomandata:Sessione persistente con rotazione
- ri-autenticazione locale
- token legati al dispositivo
Questa combinazione garantisce un equilibrio robusto tra sicurezza e usabilità ed è adatta per applicazioni con elevati requisiti di protezione. - ri-autenticazione locale