Architectures de connexion et de session pour applications mobiles natives avec IdP
- Objectif et contexteCet article décrit des variantes d’architecture propres pour l’authentification et la gestion de session dans des applications mobiles natives utilisant un fournisseur d’identité externe (IdP) via OAuth 2.0 / OpenID Connect (OIDC).
Objectif :- séparation claire des mécanismes
- variantes comparables
- base de décision robuste
- séparation claire des mécanismes
- Fondements de l’architecture (termes précis)2.1 Composants impliqués
- Application mobile (client public)
- Serveur d’autorisation / IdP
- Serveur de ressources (API)
2.2 Artefacts de jetons- Jeton d’accès
- de courte durée (typique : minutes)
- accès aux API
- de courte durée (typique : minutes)
- Jeton de rafraîchissement
- durée de vie plus longue
- sert à renouveler les jetons d’accès
- hautement sensible
- durée de vie plus longue
2.3 Deux niveaux de session strictement séparés
(A) Session IdP- existe dans le navigateur système / ASWebAuthenticationSession / Custom Tabs
- permet le SSO
- non contrôlée directement par l’application
- basée sur des jetons stockés localement
- entièrement sous le contrôle de l’application
- Application mobile (client public)
- Dimensions du design (orthogonales !)Toutes les architectures pertinentes résultent de la combinaison de ces dimensions :
3.1 Dimension 1 : persistance de session (côté application)
Variante 1 : aucune persistance- jetons uniquement en mémoire (RAM)
- perdus après redémarrage de l’application
- jeton de rafraîchissement dans un stockage sécurisé :
- iOS : Keychain
- Android : Keystore
- iOS : Keychain
- renouvellement automatique des jetons
3.2 Dimension 2 : modèle de durée de session
S’applique au jeton de rafraîchissement / session :
Durée de vie absolue- limite maximale stricte (p. ex. 30 jours)
- expiration après inactivité (p. ex. 15 min)
- prolongation lors de l’utilisation
- généralement combinée avec :
- rotation
- durée de vie maximale
- rotation
3.3 Dimension 3 : renouvellement des jetons
Sans jeton de rafraîchissement- le jeton d’accès expire → nouvelle authentification requise
- renouvellement silencieux possible
- chaque renouvellement → nouveau jeton de rafraîchissement
- ancien jeton invalidé
3.4 Dimension 4 : protection d’accès côté application
Indépendamment de l’IdP :Aucune protection supplémentaire
Ré-authentification locale
- biométrie (Face ID / empreinte digitale)
- code PIN de l’appareil
- au démarrage de l’application
- au retour en premier plan
- lors d’actions sensibles (step-up)
3.5 Dimension 5 : niveau de sécurité des jetons
Jetons « bearer »- la possession suffit
(p. ex. DPoP)- jeton lié à une clé cryptographique
- protection contre le vol de jeton
- clé dans Secure Enclave / TEE
- liaison forte à l’appareil
3.6 Dimension 6 : utilisation de la session IdP (comportement SSO)
SSO actif- nouvelle connexion possible sans interaction utilisateur
- p. ex. prompt=login
- jetons uniquement en mémoire (RAM)
- Variantes d’architecture de référenceCombinaisons réalistes et pertinentes :Variante A : session éphémère (haute sécurité) ×
Configuration- aucune persistance
- pas de jeton de rafraîchissement
- jeton d’accès court
- la session se termine à la fermeture de l’application
- la session IdP peut accélérer la connexion
- risque minimal en cas de perte de l’appareil
- aucun stockage de jeton
- très mauvaise UX
- redirections fréquentes
- applications hautement sensibles spécialisées
Variante B : session persistante (standard)×
Configuration- jeton de rafraîchissement en stockage sécurisé
- jetons « bearer »
- durée de vie absolue
- « rester connecté »
- renouvellement silencieux
- très bonne UX
- implémentation standard
- risque en cas d’exfiltration de jetons
- révocation critique
Variante C : session persistante avec sliding + rotation (best practice)×
Configuration- jeton de rafraîchissement + rotation
- session glissante + limite absolue
- stockage sécurisé
- l’utilisation prolonge la session
- les jetons compromis sont rapidement invalidés
- excellent équilibre UX / sécurité
- largement utilisé aujourd’hui
- complexité accrue
- gestion d’état côté serveur nécessaire
Variante D : persistance + ré-authentification locale×
Configuration- comme variante B ou C
- en plus
- biométrie / PIN avant accès
- deux niveaux de protection :
- possession (jeton)
- présence utilisateur
- sécurité fortement améliorée avec bonne UX
- protège contre le « shoulder surfing » / appareil déverrouillé
- friction UX
- logique de fallback nécessaire
- banque
- cyberadministration
Variante E : session avec jetons liés (haute sécurité moderne)×
Configuration- DPoP ou mécanismes similaires
- clé dans Secure Enclave / Keystore
- souvent combiné avec C ou D
- le jeton seul ne suffit pas
- liaison à l’appareil
- très haute protection contre le vol de jeton
- état de l’art
- complexe
- interopérabilité / débogage exigeants
- aucune persistance
- Comparaison des variantes
Variante UX Sécurité Complexité Remarque A Éphémère ❌ ✅✅ ✅ rarement pertinent B Persistante ✅ ⚠️ ⚠️ base C Sliding + Rotation ✅ ✅ ⚠️⚠️ best practice D + Ré-auth ⚠️/✅ ✅✅ ⚠️⚠️ pour données sensibles E Sender-Constrained ✅ 🚀 ❌ haut de gamme - Thèmes critiques (souvent sous-estimés) 6.1 Sémantique de déconnexion
- déconnexion locale → suppression des jetons
- déconnexion globale → fin de la session IdP (navigateur)
- révocation → invalidation serveur des jetons de rafraîchissement
6.2 Perte d’appareil
Questions :- les jetons sont-ils protégés ?
- la biométrie est-elle active ?
- existe-t-il une révocation à distance ?
6.3 Comportement hors ligne- jeton d’accès valide → usage hors ligne possible ?
- rafraîchissement → nécessite le réseau
6.4 Multi-appareils- un jeton de rafraîchissement par appareil ?
- invalidation centralisée ?
6.5 Authentification step-up- ré-authentification pour actions critiques
- indépendante de la session
- déconnexion locale → suppression des jetons
- Recommandations
- applications standard → variante C
- applications sensibles (p. ex. eIAM / autorités) → variante D + option E
- sécurité maximale → combinaison C + D + E
- applications standard → variante C
- ConclusionL’idée clé est :Il n’existe pas « un seul pattern de connexion », mais un système modulaire de décisions orthogonales.
Une architecture propre signifie :- ne pas mélanger les dimensions
- choisir consciemment la combinaison
- adresser explicitement les risques
- ne pas mélanger les dimensions
Recommandation : architecture d’authentification et de session pour une application mobile hautement sensible
- ObjectifL’application doit :
- répondre à des exigences de sécurité élevées (prévenir les abus en cas de perte de l’appareil)
- rester efficace au quotidien
- fonctionner dans des conditions variables (utilisation irrégulière, connectivité limitée)
- répondre à des exigences de sécurité élevées (prévenir les abus en cas de perte de l’appareil)
- Architecture recommandée (combinaison)2.1 Stratégie de session
→ session persistante avec durée glissante et rotation
Implémentation- utilisation de jetons de rafraîchissement
- stockage dans un secure storage natif
- rotation du jeton de rafraîchissement à chaque renouvellement
- combinaison de :
- timeout d’inactivité (p. ex. heures)
- durée de vie absolue (p. ex. jours)
- timeout d’inactivité (p. ex. heures)
- réduit les connexions fréquentes
- limite l’impact d’un jeton compromis
- standard des systèmes modernes sécurisés
2.2 Protection d’accès côté application
→ ré-authentification locale obligatoire
Implémentation- accès à la session uniquement après :
- biométrie (principal)
- PIN de l’appareil (fallback)
- biométrie (principal)
- application :
- au démarrage
- après inactivité définie
- lors d’actions sensibles
- au démarrage
- protection contre :
- appareils déverrouillés non surveillés
- appareils partagés
- appareils déverrouillés non surveillés
- augmentation significative de la sécurité sans re-login complet
2.3 Niveau de sécurité des jetons
→ jetons liés à l’émetteur (recommandé)
Implémentation- liaison à une clé spécifique à l’appareil
- stockage :
- Secure Enclave (iOS)
- TEE (Android)
- Secure Enclave (iOS)
- empêche l’utilisation sur un autre appareil
- réduit le risque en cas de malware
2.4 Intégration IdP
→ login via navigateur système (best practice OIDC)
Implémentation- ASWebAuthenticationSession (iOS)
- Custom Tabs (Android)
- réutilisation de la session IdP (SSO)
- pas de gestion de credentials dans l’app
- utilisation du MFA existant
2.5 Stratégie de logout et révocation
Implémentation- logout local → suppression des jetons
- révocation serveur → invalidation des refresh tokens
- optionnel : logout global via IdP
- arrêt contrôlé de session en cas de :
- perte d’appareil
- changement de rôle
- incident de sécurité
- perte d’appareil
2.6 Comportement hors ligne
Recommandation- accès hors ligne aux données non sensibles déjà chargées
- pas de refresh sans réseau
- actions sensibles uniquement en ligne
- utilisation de jetons de rafraîchissement
- Niveau de sécurité (évaluation)Cette combinaison offre :
- haute protection contre la perte d’appareil
- haute protection contre le vol de jetons
- durée de session maîtrisée
- bonne utilisabilité opérationnelle
- haute protection contre la perte d’appareil
- Alternatives écartéesPas de re-login complet à chaque usage
- friction trop élevée
- non viable opérationnellement
- protection insuffisante en cas d’accès physique
- risque accru d’exfiltration
- friction trop élevée
- Mesures complémentaires (optionnelles)
- step-up authentication
- attestation de l’appareil
- kill de session à distance
- détection root/jailbreak (avec prudence)
- step-up authentication
- ConclusionArchitecture recommandée :Session persistante avec rotation
- ré-authentification locale
- jetons liés à l’appareil
Cette combinaison offre un équilibre robuste entre sécurité et utilisabilité pour des applications à exigences élevées. - ré-authentification locale