QCM : Architectures logicielles avancées — 59 questions

Questions et réponses du QCM

1. Quelle distinction décrit correctement une page Web et une application Web ?

Une page Web correspond au back-end, tandis qu’une application Web désigne uniquement son interface graphique côté client.
Une page Web fournit les services serveur, tandis qu’une application Web affiche un contenu HTML sans logique distribuée.
Une page Web est généralement statique, tandis qu’une application Web est un logiciel accessible par Internet, souvent organisé selon une séparation client-serveur.
Une page Web et une application Web sont deux appellations équivalentes pour un contenu HTML, CSS et JavaScript.

Une page Web est généralement statique, tandis qu’une application Web est un logiciel accessible par Internet, souvent organisé selon une séparation client-serveur.

Explication

Une page Web désigne généralement un contenu basique et statique, alors qu’une application Web est un logiciel accessible par Internet et souvent structuré selon une architecture client-serveur. Confondre les deux notions revient à ignorer la dimension logicielle et distribuée de l’application Web.

2. Quelle partie d’une application Web correspond à l’interface graphique avec laquelle l’utilisateur interagit ?

La base de données, stockée dans le serveur.
Le back-end, exécuté du côté serveur.
Le front-end, exécuté du côté client.
L’API, chargée de calculer les réponses.

Le front-end, exécuté du côté client.

Explication

Le front-end est la partie graphique côté client qui reçoit directement les interactions de l’utilisateur. Le back-end fonctionne côté serveur et fournit des services, tandis que la base de données et l’API ne constituent pas l’interface graphique elle-même.

3. Quel rôle caractérise principalement le back-end d’une application Web ?

Fournir des services serveur, comme l’accès aux données ou les calculs, au front-end.
Afficher les éléments graphiques avec lesquels l’utilisateur manipule directement l’application.
Définir exclusivement la mise en forme visuelle des pages affichées dans le navigateur.
Remplacer le protocole réseau afin d’assurer la communication entre plusieurs navigateurs.

Fournir des services serveur, comme l’accès aux données ou les calculs, au front-end.

Explication

Le back-end est la partie serveur qui réalise des calculs et donne accès aux données pour le front-end. L’affichage graphique relève du front-end, tandis que le back-end ne remplace pas le protocole réseau.

4. Comment faut-il caractériser REST ?

Comme un style d’architecture fondé sur une interface uniforme, la séparation client-serveur, l’absence d’état et la mise en cache.
Comme un langage de programmation destiné à décrire les modèles de données d’une application.
Comme un protocole réseau remplaçant HTTP pour transporter les données entre le client et le serveur.
Comme une bibliothèque Java fournissant des classes prédéfinies pour construire des interfaces graphiques.

Comme un style d’architecture fondé sur une interface uniforme, la séparation client-serveur, l’absence d’état et la mise en cache.

Explication

REST, ou Representational State Transfer, est un style d’architecture reposant notamment sur la séparation client-serveur, l’absence d’état des commandes, la mise en cache et une interface uniforme. Le réduire à une bibliothèque Java ou à un protocole réseau constitue une confusion de nature.

5. Quelle relation entre HTTP et une requête REST est correcte ?

HTTP et REST sont deux noms équivalents désignant exactement le même ensemble de règles.
REST utilise HTTP, mais une requête REST structure en plus une ressource, une action, des données d’entrée et une réponse.
Une requête REST ignore HTTP et s’appuie sur un protocole distinct pour identifier les ressources.
HTTP est un style d’architecture, tandis que REST est le protocole chargé de transmettre les réponses au client.

REST utilise HTTP, mais une requête REST structure en plus une ressource, une action, des données d’entrée et une réponse.

Explication

REST s’appuie sur le protocole HTTP, tout en organisant son utilisation autour d’une ressource, d’une action, de données d’entrée et d’une réponse. HTTP n’est donc pas un style d’architecture, et REST ne constitue pas un protocole indépendant qui remplacerait HTTP.

6. Qu’est-ce qu’une ressource REST ?

Un objet du back-end, souvent une classe Java, qui définit des routes et est identifiée par une partie de l’URI.
Un fichier de configuration qui décrit les outils utilisés pour lancer l’application Web.
Un verbe HTTP associé à une URI pour indiquer l’action exécutée sur une donnée.
Une page graphique du client qui présente les résultats renvoyés par plusieurs routes du serveur.

Un objet du back-end, souvent une classe Java, qui définit des routes et est identifiée par une partie de l’URI.

Explication

Une ressource REST représente un objet du back-end, souvent matérialisé par une classe Java, et elle est repérée par une partie de l’URI. Un verbe HTTP décrit l’action d’une route, mais ne constitue pas à lui seul une ressource.

7. Pourquoi GET foo/bar/{param1} et GET foo/bar/{param2} sont-elles considérées comme des routes en conflit ?

Parce que le verbe GET impose une réponse en texte brut pour toutes les routes concernées.
Parce que deux routes GET ne peuvent pas partager une même ressource, même avec des URI distinctes.
Parce que les paramètres de chemin doivent être placés dans le corps d’une requête GET.
Parce que le couple verbe HTTP et URI est identique lorsque seuls les noms des paramètres changent.

Parce que le couple verbe HTTP et URI est identique lorsque seuls les noms des paramètres changent.

Explication

Une route REST est identifiée par le couple formé du verbe HTTP et de l’URI, et les noms des paramètres de chemin ne différencient pas ces deux modèles. En revanche, POST foo/bar et GET foo/bar ne sont pas en conflit, car leurs verbes diffèrent.

8. Quelles annotations Spring Boot permettent de déclarer une ressource REST et l’URI associée ?

@RestController marque la ressource et @RequestMapping définit son URI.
@GetMapping marque la ressource et @PostMapping définit l’URI générale de l’application.
@RestController fournit l’URI et @GetMapping active automatiquement toutes les opérations REST.
@RequestMapping marque la ressource et @RestController définit le format de sa réponse.

@RestController marque la ressource et @RequestMapping définit son URI.

Explication

La classe de la ressource est annotée avec @RestController, tandis que @RequestMapping permet de définir l’URI correspondante. Inverser ces responsabilités constitue la confusion principale entre les deux annotations.

9. Que définit l’annotation @GetMapping(path = "world", produces = MediaType.TEXT_PLAIN_VALUE) ?

Une route POST nommée world qui reçoit une réponse au format JSON.
Une route GET générale qui produit une réponse en HTML dans le navigateur.
Une route DELETE nommée world qui renvoie le contenu d’une ressource binaire.
Une route GET nommée world qui produit une réponse en texte brut.

Une route GET nommée world qui produit une réponse en texte brut.

Explication

L’annotation indique une route GET dont le chemin est world et dont le type de réponse est du texte brut. Le paramètre produces ne transforme pas la route en POST, en DELETE ou en réponse HTML.

10. Comment une route POST et une route GET se distinguent-elles généralement dans l’échange de données ?

POST place généralement la donnée à créer dans le corps de la requête, tandis que GET sert à récupérer des données en lecture seule.
POST remplace un objet complet, tandis que GET modifie les attributs fournis dans un document JSON.
POST récupère une donnée en lecture seule, tandis que GET place généralement la nouvelle donnée dans le corps de la requête.
POST transmet la donnée dans l’URI, tandis que GET crée une ressource à partir des paramètres de chemin.

POST place généralement la donnée à créer dans le corps de la requête, tandis que GET sert à récupérer des données en lecture seule.

Explication

Une route POST reçoit généralement dans le corps la donnée destinée à être créée, alors qu’une route GET sert à récupérer des données en lecture seule. Le remplacement complet et la modification partielle relèvent plutôt des distinctions entre PUT et PATCH.

11. Quelle différence entre PATCH et PUT est correcte lors de la modification d’une ressource ?

PATCH supprime les attributs absents, tandis que PUT modifie uniquement ceux présents dans le JSON.
PATCH sert à récupérer les données, tandis que PUT crée l’objet complet dans le corps de la requête.
PATCH peut conserver les attributs absents du JSON, tandis que PUT reçoit théoriquement l’objet complet et le remplace.
PATCH remplace l’objet complet fourni, tandis que PUT conserve les attributs absents du JSON reçu.

PATCH peut conserver les attributs absents du JSON, tandis que PUT reçoit théoriquement l’objet complet et le remplace.

Explication

Avec PATCH, les attributs absents du JSON peuvent rester inchangés, ce qui convient à une modification partielle. PUT est théoriquement associé à la réception d’un objet complet destiné à remplacer l’objet ciblé, contrairement à l’idée d’une conservation partielle.

12. Pour transmettre les critères détaillés d’une recherche REST, quel emplacement est le plus approprié ?

Le message d’erreur applicatif
Le code de statut HTTP
Le chemin principal de la route
Le corps HTTP de la requête

Le corps HTTP de la requête

Explication

Le corps HTTP convient aux données complexes, comme les critères détaillés d’une recherche. L’URI est davantage adaptée aux données simples et à l’identification de ressources.

13. Que reçoit un client lorsqu’une méthode Java appelée par une requête REST retourne void ?

Une réponse limitée au nom de la méthode Java exécutée
Une absence complète de communication entre le serveur et le client
Une réponse HTTP pouvant contenir un code, des données et un message
Une nouvelle requête automatique destinée à remplacer la réponse manquante

Une réponse HTTP pouvant contenir un code, des données et un message

Explication

Toute requête REST reçoit une réponse HTTP, même si la méthode Java retourne void. Le retour void ne supprime donc pas la réponse ni ses éléments éventuels.

14. Quel code HTTP indique qu’une ressource demandée n’a pas été trouvée ?

404 Not Found
500 Internal Server Error
405 Method Not Allowed
400 Bad Request

404 Not Found

Explication

Le code 404 Not Found signale que la ressource demandée n’a pas été trouvée. Le code 400 concerne une requête incorrecte, tandis que 405 concerne une méthode non autorisée.

15. Comment une API REST doit-elle signaler une erreur applicative prévisible ?

En utilisant un code HTTP adapté avec ResponseEntity ou ResponseStatusException
En renvoyant systématiquement une réponse 200 avec le détail de l’erreur
En plaçant le message d’erreur dans l’URI sans modifier la réponse HTTP
En laissant l’exception produire le code 500 dans toutes les situations

En utilisant un code HTTP adapté avec ResponseEntity ou ResponseStatusException

Explication

ResponseEntity et ResponseStatusException permettent d’associer l’erreur à un code HTTP adapté. Laisser toute erreur applicative devenir une erreur 500 fournit une information trop générale au client.

16. Quel est l’objectif principal d’un DTO dans une API ?

Reproduire tous les attributs de l’entité dans chaque réponse
Conserver les données confidentielles dans le corps de la réponse
Remplacer la base de données par une structure destinée au client
Adapter les attributs transférés et exclure les données sensibles

Adapter les attributs transférés et exclure les données sensibles

Explication

Un DTO représente les attributs nécessaires au transfert entre le back-end et le client, tout en pouvant exclure les données sensibles. Une entité complète risque au contraire d’exposer des attributs confidentiels.

17. Quelle réponse réduit le risque d’exposer le mot de passe d’un utilisateur ?

Un UserDTO contenant name, address et id
Un objet User contenant name, address, id et pwd
Un UserDTO reprenant les attributs publics et confidentiels de User
Un objet User contenant pwd avec un identifiant de session

Un UserDTO contenant name, address et id

Explication

Le UserDTO transfère name, address et id sans inclure pwd. Retourner directement User peut exposer cet attribut confidentiel dans la réponse.

18. Quelle transformation correspond au marshalling ?

Convertir un code HTTP en message destiné à l’interface utilisateur
Transformer le texte de body reçu en objet Java exploitable
Transformer un objet Java en JSON puis en texte de body
Remplacer un DTO par une entité persistée dans la base de données

Transformer un objet Java en JSON puis en texte de body

Explication

Le marshalling transforme un objet en un format transmissible, par exemple un objet Java en JSON placé dans le body. La transformation inverse, du format transmis vers l’objet, est le démarshalling.

19. Quelle affirmation décrit correctement le rôle d’OpenAPI ?

Exécuter les requêtes des clients sans description préalable des routes
Modéliser une API REST avant son implémentation et générer notamment du code et des tests
Implémenter directement les contrôleurs REST à la place de Spring Boot
Remplacer le format JSON par un protocole réservé aux bases de données

Modéliser une API REST avant son implémentation et générer notamment du code et des tests

Explication

OpenAPI sert à décrire et modéliser l’API avant son implémentation, puis peut aider à générer un squelette de back-end et des tests. Spring Boot reste le framework chargé de l’implémentation.

20. Quels éléments sont associés à la description d’une route dans la section paths d’OpenAPI ?

Une URI, un verbe, des paramètres éventuels, une requête, des réponses et un schéma
Une classe Java, un constructeur, une interface et une méthode privée
Un nom de base de données, une table, une transaction et une procédure stockée
Une page web, une feuille de style, une image et un script d’interface

Une URI, un verbe, des paramètres éventuels, une requête, des réponses et un schéma

Explication

Dans paths, une route est décrite par son URI, son verbe, ses paramètres éventuels, sa requête, ses réponses HTTP et le schéma du contenu. Les éléments liés à la base de données ne constituent pas la structure de cette description.

21. Quelle différence caractérise une API orientée CRUD par rapport à une API orientée application ?

La première adapte chaque route à l’écran, tandis que la seconde applique les opérations standard aux objets
La première décrit les réponses HTTP, tandis que la seconde supprime les verbes des routes
La première propose des routes génériques pour les objets, tandis que la seconde répond aux besoins précis du front-end
La première utilise OpenAPI, tandis que la seconde repose sur un format différent de description

La première propose des routes génériques pour les objets, tandis que la seconde répond aux besoins précis du front-end

Explication

Une API CRUD organise des routes génériques autour de Create, Read, Update et Delete. Une API orientée application adapte ses routes aux besoins concrets du front-end, par exemple pour fournir une vue particulière.

22. Quelle annotation caractérise une classe de service Spring qu’un contrôleur peut utiliser par injection de dépendances ?

@Service
@Entity
@Repository
@Controller

@Service

Explication

L’annotation @Service identifie une classe dédiée à la logique ou à l’accès aux données, utilisable par injection. @Controller sert plutôt à gérer les routes HTTP et ne caractérise pas la couche de service.

23. Dans une application respectant la séparation des préoccupations, quelle responsabilité revient principalement au service ?

Générer les identifiants des entités
Gérer la logique métier et les données
Décrire les colonnes de la table principale
Déclarer les routes et les paramètres HTTP

Gérer la logique métier et les données

Explication

Le service prend en charge la logique métier ou la gestion des données, tandis que le contrôleur s’occupe des routes. La déclaration des routes relève donc du contrôleur et non du service.

24. Que réalise le mapping objet-relationnel entre une application orientée objet et une base relationnelle ?

Il regroupe toutes les entités de l’application dans une table unique
Il convertit les attributs des objets en valeurs stockables et inversement
Il transforme chaque requête HTTP en méthode automatiquement exécutable
Il remplace les classes Java par des procédures stockées dans la base

Il convertit les attributs des objets en valeurs stockables et inversement

Explication

L’ORM assure la conversion entre les attributs des objets et les valeurs des tables relationnelles, dans les deux sens. Il ne remplace pas les classes par des procédures et ne concerne pas directement les requêtes HTTP.

25. Quelles annotations sont nécessaires pour qu’une classe et son identifiant soient correctement persistés par JPA ?

@Service sur la classe et @GeneratedValue sur chaque attribut
@Embeddable sur la classe et @OneToMany sur son identifiant
@Controller sur la classe et @Repository sur la clé primaire
@Entity sur la classe et @Id sur la clé primaire

@Entity sur la classe et @Id sur la clé primaire

Explication

@Entity indique que la classe doit être persistée et @Id désigne l’attribut servant de clé primaire. @GeneratedValue peut gérer la génération de cette clé, mais ne remplace pas l’annotation @Id.

26. Quel rôle joue l’annotation @Id dans une entité JPA ?

Elle indique que la classe peut être intégrée dans une autre
Elle établit une relation plusieurs-à-un
Elle choisit la stratégie de génération de l’identifiant
Elle désigne l’attribut utilisé comme clé primaire

Elle désigne l’attribut utilisé comme clé primaire

Explication

@Id marque l’attribut qui sert de clé primaire pour l’entité. Le choix de la génération automatique de sa valeur relève plutôt de @GeneratedValue.

27. Lorsqu’un identifiant doit être initialisé et incrémenté automatiquement, quelle annotation convient ?

@EmbeddedId
@MappedSuperclass
@ManyToOne
@GeneratedValue

@GeneratedValue

Explication

@GeneratedValue contrôle la génération automatique de la valeur d’un attribut identifiant. @EmbeddedId sert plutôt à représenter une clé composée dans un attribut intégrable.

28. Comment déclare-t-on correctement une relation entre une TodoList et plusieurs Todo ?

@OneToMany(mappedBy = "list") sur TodoList et @ManyToOne sur Todo
@ManyToOne sur TodoList et @OneToMany(mappedBy = "list") sur Todo
@ManyToMany sur TodoList et @OneToOne sur Todo
@EmbeddedId sur TodoList et @GeneratedValue sur Todo

@OneToMany(mappedBy = "list") sur TodoList et @ManyToOne sur Todo

Explication

La collection de Todo dans TodoList correspond à une relation un-à-plusieurs, déclarée avec @OneToMany(mappedBy = "list"). Chaque Todo possède la relation inverse plusieurs-à-un avec @ManyToOne.

29. Quelle stratégie JPA d’héritage utilise une table unique pour l’ensemble de la hiérarchie de classes ?

TABLE_PER_CLASS
SINGLE_TABLE
JOINED
EMBEDDED_TABLE

SINGLE_TABLE

Explication

SINGLE_TABLE regroupe les instances de la hiérarchie dans une seule table. TABLE_PER_CLASS crée une table par classe, tandis que JOINED répartit les colonnes entre des tables liées.

30. Que définit CrudRepository dans une application Spring ?

Une classe métier qui contient automatiquement toutes les règles de validation
Un repository CRUD pour un type d’objet et un type de clé donnés
Un contrôleur qui expose automatiquement les opérations HTTP
Une entité JPA qui décrit les colonnes et les relations d’une table

Un repository CRUD pour un type d’objet et un type de clé donnés

Explication

CrudRepository fournit les opérations de persistance pour un type d’objet identifié par un type de clé. Il ne constitue ni une classe métier, ni une entité, ni un contrôleur HTTP.

31. Quelle association entre les méthodes de base d’un repository et leurs fonctions est correcte ?

save supprime, delete retourne tous les objets, findById enregistre et findAll recherche une clé
save enregistre, delete supprime, findById recherche une clé et findAll retourne tous les objets
save recherche une clé, delete enregistre, findById supprime et findAll modifie tous les objets
save retourne tous les objets, delete recherche une clé, findById modifie et findAll supprime

save enregistre, delete supprime, findById recherche une clé et findAll retourne tous les objets

Explication

save, delete, findById et findAll correspondent respectivement à l’enregistrement, la suppression, la recherche par clé et la récupération de tous les objets. En particulier, findById vise une clé donnée alors que findAll parcourt l’ensemble.

32. Pourquoi une entité doit-elle déclarer son attribut de clé avec @Id lorsqu’elle est utilisée par un repository ?

Pour obliger chaque requête JPQL à retourner une collection complète
Pour transformer l’entité en service injectable dans un contrôleur
Pour permettre au repository d’identifier la clé utilisée par save et findById
Pour permettre à Spring de choisir automatiquement la table d’héritage

Pour permettre au repository d’identifier la clé utilisée par save et findById

Explication

L’annotation @Id indique au repository quel attribut représente l’identité de l’entité lors des opérations comme save et findById. Elle ne détermine ni la stratégie d’héritage, ni le type de résultat des requêtes, ni l’injection comme service.

33. À quel moment une entité devient-elle persistante dans le contexte JPA ?

Dès que la classe reçoit l’annotation @Entity, sans autre opération
Lorsque l’application appelle notamment persist ou merge
Quand le repository est créé, même sans interaction avec l’entité
Lorsque le contrôleur déclare une nouvelle route HTTP

Lorsque l’application appelle notamment persist ou merge

Explication

Une entité devient persistante lorsqu’une opération telle que persist ou merge est appelée. L’annotation @Entity décrit la classe persistable, mais ne déclenche pas à elle seule la persistance.

34. Quelle séquence décrit correctement un test de route REST réalisé avec MockMvc ?

Afficher la réponse avec andDo, exécuter la requête avec andExpect, puis vérifier le statut avec mvc.perform
Vérifier le résultat avec andExpect, créer la requête avec andDo, puis l’exécuter avec mvc.perform
Créer une session avec mvc.perform, valider l’utilisateur avec andDo, puis contrôler la route avec andExpect
Exécuter la requête avec mvc.perform, vérifier le résultat avec andExpect, puis afficher la réponse avec andDo si nécessaire

Exécuter la requête avec mvc.perform, vérifier le résultat avec andExpect, puis afficher la réponse avec andDo si nécessaire

Explication

MockMvc utilise mvc.perform pour exécuter la requête, andExpect pour contrôler le statut ou le contenu, et andDo peut afficher la réponse. andDo ne crée pas la requête et andExpect ne sert pas à l’exécuter.

35. Quel est l’intérêt principal de combiner @ParameterizedTest avec @MethodSource dans JUnit ?

Exécuter plusieurs méthodes source dans une seule requête HTTP sans répéter les assertions
Remplacer les données de test par une authentification générée avant chaque exécution
Créer automatiquement une structure de test différente pour chaque donnée fournie par la méthode source
Réutiliser une même structure de test pour chaque donnée fournie par la méthode source

Réutiliser une même structure de test pour chaque donnée fournie par la méthode source

Explication

Le test paramétré réutilise la même structure pour chacune des données produites par la méthode source. Des tests séparés reproduiraient cette structure au lieu de mutualiser son exécution.

36. Quel ensemble de vérifications correspond à une couverture complète des tests d’une API REST ?

Fonctionnement nominal, formats d’entrée, réponses, requêtes malformées, injections, sécurité et comportement sous charge
Fonctionnement nominal, apparence des pages, textes affichés, navigation utilisateur et compatibilité des navigateurs
Formats d’entrée, réponses valides, documentation, noms des classes et organisation des packages Java
Authentification, création des tables, déploiement, configuration réseau et sauvegarde des journaux serveur

Fonctionnement nominal, formats d’entrée, réponses, requêtes malformées, injections, sécurité et comportement sous charge

Explication

Les tests REST couvrent notamment les cas nominaux, les entrées, les réponses, les requêtes malformées, les injections, l’authentification, la performance et la montée en charge. L’apparence des pages et l’organisation du code ne constituent pas le périmètre principal de cette liste.

37. Quelle configuration d’accès convient à une API dont les routes /api/public/** sont ouvertes et les autres routes protégées ?

Associer permitAll à toutes les routes et vérifier l’identité dans chaque réponse JSON
Associer permitAll à /api/public/** et exiger authenticated pour les autres routes
Associer authenticated à /api/public/** et appliquer permitAll aux autres routes
Associer authenticated à toutes les routes, y compris celles destinées à l’accès public

Associer permitAll à /api/public/** et exiger authenticated pour les autres routes

Explication

permitAll permet l’accès aux routes publiques sans connexion, tandis qu'authenticated impose une authentification aux autres routes. Inverser ces règles protégerait les routes publiques et ouvrirait les routes privées.

38. Quel rôle joue le cookie JSESSIONID lors de l’accès à une route privée ?

Il définit les permissions de l’utilisateur et détermine les propriétés modifiables
Il identifie la session et sert de preuve d’identité pour les requêtes privées
Il contient le corps de la requête POST utilisée pour créer le compte utilisateur
Il contient le mot de passe chiffré et remplace la vérification de l’identité par le serveur

Il identifie la session et sert de preuve d’identité pour les requêtes privées

Explication

JSESSIONID est l’identifiant confidentiel de session transmis dans un cookie et utilisé pour reconnaître l’utilisateur lors de l’accès privé. Le mot de passe sert à établir l’authentification, mais il n’est pas le rôle du JSESSIONID.

39. Quel enchaînement décrit correctement l’utilisation d’une session après authentification ?

Le client crée JSESSIONID, le serveur le transforme en mot de passe, puis le client ouvre les routes publiques
Le serveur crée ou récupère une session, renvoie JSESSIONID, puis le client le transmet dans ses requêtes privées
Le serveur renvoie un mot de passe temporaire, puis le client le transmet comme identifiant de session privée
Le client transmet JSESSIONID avant l’authentification, puis le serveur crée une session à partir de ce cookie

Le serveur crée ou récupère une session, renvoie JSESSIONID, puis le client le transmet dans ses requêtes privées

Explication

L’authentification crée ou récupère une session, dont l’identifiant JSESSIONID est renvoyé au client et réutilisé dans les requêtes privées. Le client ne fabrique pas normalement cet identifiant avant l’établissement de la session.

40. Quelle pratique protège correctement les mots de passe dans une application web ?

Les transmettre dans le body d’un POST via HTTPS et les stocker sous forme de hash avec bcrypt côté serveur
Les placer dans l’URL d’une requête GET et les enregistrer en clair afin de faciliter leur récupération
Les transmettre dans un cookie non chiffré et les stocker réversiblement pour permettre leur restitution
Les envoyer dans les en-têtes HTTP via une connexion non chiffrée et les conserver dans la session active

Les transmettre dans le body d’un POST via HTTPS et les stocker sous forme de hash avec bcrypt côté serveur

Explication

Les mots de passe doivent être envoyés dans le corps d’un POST via HTTPS et stockés sous forme de hash, par exemple avec bcrypt. Le stockage en clair ou l’utilisation d’un transport non chiffré expose directement les identifiants.

41. Quelle vérification faut-il ajouter à l’authentification pour contrôler l’accès à une commande personnelle ?

Récupérer l’identité avec Principal, transmettre son login au service et vérifier que la commande lui appartient
Vérifier que l’utilisateur possède une session active, puis autoriser toute commande trouvée dans la base
Demander le login dans le corps de la requête et accepter la commande dès que ce login est syntaxiquement valide
Récupérer l’identité avec Principal et vérifier que la commande existe, sans comparer son propriétaire

Récupérer l’identité avec Principal, transmettre son login au service et vérifier que la commande lui appartient

Explication

Le contrôle d’accès récupère l’identité via Principal, transmet son login au service et vérifie la propriété de l’objet demandé. Une session valide prouve l’authentification, mais elle ne démontre pas que la commande appartient à cet utilisateur.

42. Quelle situation illustre une vulnérabilité API1 Broken Object Level Authorization ?

Alice demande une liste trop volumineuse parce que le serveur n’impose aucune pagination
Alice obtient une réponse sans session parce que l’endpoint ne demande aucune authentification
Alice modifie un champ interdit parce que le serveur accepte toutes les propriétés envoyées dans le JSON
Alice accède à la commande de Bob parce que le serveur vérifie son existence sans contrôler son propriétaire

Alice accède à la commande de Bob parce que le serveur vérifie son existence sans contrôler son propriétaire

Explication

API1 apparaît lorsque le serveur contrôle l’existence de l’objet mais pas son appartenance à l’utilisateur demandeur. Les autres situations relèvent respectivement des propriétés d’objet, de l’authentification et de la consommation de ressources.

43. Quelle mesure corrige principalement une vulnérabilité API2 Broken Authentication sur un endpoint privé ?

Exiger une session authentifiée et renvoyer 401 Unauthorized lorsqu’aucune session valide n’est présentée
Limiter le nombre d’éléments renvoyés avec une pagination imposée par le serveur
Filtrer les propriétés modifiables avec un DTO contrôlé par le serveur avant l’enregistrement
Exiger le rôle ADMIN et renvoyer 403 Forbidden lorsqu’un utilisateur standard tente l’opération

Exiger une session authentifiée et renvoyer 401 Unauthorized lorsqu’aucune session valide n’est présentée

Explication

API2 concerne l’absence ou la faiblesse de l’authentification ; l’endpoint doit donc exiger une session valide et retourner 401 sans elle. Le code 403 et l’exigence d’un rôle concernent plutôt une restriction d’autorisation déjà authentifiée.

44. Comment empêcher un client de modifier des propriétés qu’il ne devrait pas contrôler dans une API ?

Accepter toutes les propriétés du JSON puis ignorer les erreurs après l’écriture en base de données
Autoriser les modifications selon l’existence de l’objet sans filtrer les champs transmis par le client
Vérifier la présence d’une session puis recopier automatiquement chaque propriété reçue dans l’entité
Utiliser un DTO contrôlé par le serveur qui n’accepte explicitement que les propriétés modifiables

Utiliser un DTO contrôlé par le serveur qui n’accepte explicitement que les propriétés modifiables

Explication

Un DTO contrôlé permet de définir précisément les propriétés que le client peut modifier et de refuser les autres. La présence d’une session ou l’existence de l’objet ne contrôle pas les champs autorisés.

45. Quel risque décrit API6 « Unrestricted Access to Sensitive Business Flows » ?

La modification d’une réponse après son envoi par le serveur
L’exposition d’un endpoint interne dépourvu de documentation publique
La transmission de données sensibles sans chiffrement entre deux services
L’automatisation massive d’une fonctionnalité métier pourtant correctement authentifiée

L’automatisation massive d’une fonctionnalité métier pourtant correctement authentifiée

Explication

API6 concerne l’automatisation massive d’un processus métier sensible, même lorsque l’accès est correctement authentifié. Une réponse non chiffrée relève d’un autre type de faiblesse et ne définit pas ce risque.

46. Quelle mesure réduit le risque d’API7 « Server Side Request Forgery » lorsqu’une URL est fournie par le client ?

Accepter l’URL si elle respecte une syntaxe valide et un protocole connu
Rediriger la requête vers une version publique du même service
Vérifier que l’URL contient le nom attendu avant de contacter sa cible
Contrôler les destinations autorisées et bloquer les destinations internes

Contrôler les destinations autorisées et bloquer les destinations internes

Explication

La prévention de SSRF repose sur une liste de destinations autorisées et sur le blocage des cibles internes pour les URL fournies par le client. Une URL fournie par le client reste une entrée non fiable, même si sa syntaxe est correcte.

47. Comment protéger une application contre API10 « Unsafe Consumption of APIs » lors de la réception de données externes ?

Faire confiance aux données puisque l’API externe les a déjà produites
Valider leur format et leurs valeurs avec des DTO et des contraintes comme @Valid
Vérifier l’identité du serveur distant sans contrôler le contenu reçu
Convertir les données en chaîne de caractères avant de les transmettre au client

Valider leur format et leurs valeurs avec des DTO et des contraintes comme @Valid

Explication

API10 se corrige en contrôlant la structure et le contenu des données externes à l’aide de DTO et de contraintes de validation. L’identité du serveur distant ne garantit pas que les données reçues respectent le format ou les valeurs attendus.

48. Que désigne la vulnérabilité API9 « Improper Inventory Management » ?

Une validation insuffisante des valeurs reçues dans une requête
Une mauvaise gestion des endpoints et des versions d’API
Une autorisation excessive accordée à une fonctionnalité métier
Une requête serveur envoyée vers une destination interne

Une mauvaise gestion des endpoints et des versions d’API

Explication

API9 désigne une gestion défaillante de l’inventaire des endpoints et des versions d’API. La validation des valeurs concerne plutôt la consommation sûre des données externes, notamment dans API10.

49. Quelle séquence correspond à une bonne gestion du cycle de vie d’une API REST ?

Supprimer, inventorier, puis déprécier les versions encore utilisées
Déprécier, exposer de nouvelles routes, puis conserver toutes les anciennes versions
Inventorier, conserver les versions, puis désactiver la politique de dépréciation
Inventorier, définir la dépréciation, puis supprimer les versions inutiles

Inventorier, définir la dépréciation, puis supprimer les versions inutiles

Explication

La gestion du cycle de vie commence par l’inventaire des endpoints et des versions, se poursuit par une politique de dépréciation, puis aboutit à la suppression des versions inutiles. La dépréciation annonce et planifie une fin de vie, tandis que la suppression retire effectivement la version.

50. Pourquoi une API oubliée augmente-t-elle la surface d’attaque d’une application ?

Elle ajoute un endpoint potentiellement exploitable qui échappe au suivi de sécurité
Elle réduit le nombre de chemins accessibles en regroupant plusieurs fonctionnalités
Elle garantit qu’une ancienne version bénéficie de contrôles plus stricts
Elle empêche les utilisateurs authentifiés d’atteindre les services documentés

Elle ajoute un endpoint potentiellement exploitable qui échappe au suivi de sécurité

Explication

Une API oubliée peut rester accessible et présenter des faiblesses sans bénéficier d’un suivi ou de protections à jour, ce qui accroît la surface d’attaque. Une version ancienne non surveillée ne bénéficie pas automatiquement de contrôles plus stricts.

51. Que signifie API10 « Unsafe Consumption of APIs » ?

Refuser toute donnée externe avant d’avoir remplacé l’API distante par un service interne
Autoriser une API externe à appeler directement les composants internes du back-end
Chiffrer les données externes sans examiner leur structure ni leur contenu
Faire confiance sans vérification aux données d’une API externe dont le format peut évoluer

Faire confiance sans vérification aux données d’une API externe dont le format peut évoluer

Explication

Cette vulnérabilité apparaît lorsque le back-end fait confiance aux données externes sans vérifier leur structure et leur contenu, alors que leur format peut changer. Le chiffrement protège la confidentialité, mais ne remplace pas la validation des données reçues.

52. Avant d’utiliser dans le back-end des données reçues d’une API externe, que faut-il vérifier ?

Leur format et leurs valeurs afin de détecter une structure ou un contenu inattendu
Leur longueur approximative avant de les convertir dans le modèle interne
Leur provenance administrative sans analyser la structure des champs transmis
Leur compatibilité avec l’interface graphique avant de les envoyer au client

Leur format et leurs valeurs afin de détecter une structure ou un contenu inattendu

Explication

Les données externes doivent être vérifiées à la fois sur leur format et sur leurs valeurs avant leur utilisation par le back-end. Contrôler seulement la provenance ou la longueur ne permet pas de détecter toutes les structures et valeurs invalides.

53. Quelle annotation demande à Spring d’exécuter les contraintes définies dans un DTO reçu par un contrôleur ?

@Check
@Valid
@Constraint
@Validated

@Valid

Explication

L’annotation @Valid déclenche l’évaluation des contraintes de validation présentes dans le DTO. @Validated sert notamment à sélectionner certains groupes de contraintes, ce qui répond à un besoin différent.

54. Que se passe-t-il lorsqu’un DTO ne respecte pas une contrainte de validation dans une méthode de contrôleur Spring ?

La méthode du contrôleur n’est pas exécutée et Spring renvoie 400 Bad Request.
La méthode s’exécute avec des valeurs corrigées et Spring renvoie 200 OK.
La méthode s’exécute puis Spring renvoie 201 Created au client.
Le DTO est accepté et Spring renvoie 204 No Content au client.

La méthode du contrôleur n’est pas exécutée et Spring renvoie 400 Bad Request.

Explication

Une contrainte non respectée interrompt l’exécution de la méthode et entraîne une réponse 400 Bad Request. Le code 201 correspond à la création d’une ressource, tandis que 204 signale une réussite sans contenu.

55. Quelle annotation convient pour vérifier qu’une chaîne respecte une expression régulière lors de la validation d’un DTO ?

@Positive
@NotEmpty
@Pattern
@Past

@Pattern

Explication

@Pattern vérifie qu’une valeur correspond à un motif défini, généralement une expression régulière. @Past concerne une date antérieure, @Positive une valeur numérique et @NotEmpty l’absence de chaîne ou collection vide.

56. Quelle méthode HTTP convient pour remplacer intégralement une ressource existante tout en conservant un comportement idempotent ?

PATCH
POST
PUT
GET

PUT

Explication

PUT remplace la représentation complète d’une ressource et produit le même état final lorsqu’une même requête est répétée. PATCH sert plutôt à une modification partielle, tandis que POST est généralement utilisé pour créer une nouvelle ressource.

57. Quelle URI respecte le mieux les conventions REST pour filtrer des utilisateurs administrateurs actifs ?

GET /retrieveUsersByRoleAndStatus
GET /users?role=admin&status=active
GET /users/getActiveAdministrators
GET /getAllActiveAdminUsers

GET /users?role=admin&status=active

Explication

Cette URI utilise le nom pluriel de la collection et réserve les paramètres de requête au filtrage. Les autres formes introduisent des verbes ou encodent l’action directement dans le chemin.

58. Quel statut HTTP indique qu’une authentification est requise pour accéder à une ressource ?

401 Unauthorized
400 Bad Request
403 Forbidden
404 Not Found

401 Unauthorized

Explication

Le statut 401 indique que le client doit fournir une authentification valide. Le statut 403 signifie que l’accès est interdit malgré une requête identifiée ou comprise, tandis que 404 signale une ressource introuvable.

59. Laquelle de ces solutions illustre un versioning d’API placé dans un header HTTP ?

GET /users avec le header Content-Type: application/json
Accept: application/vnd.company.v1+json
GET /users?version=1
GET /v1/users

Accept: application/vnd.company.v1+json

Explication

Le versioning par header peut utiliser l’en-tête Accept pour demander la représentation correspondant à la version 1. Le chemin /v1/users place la version dans l’URI, tandis que ?version=1 la place dans les paramètres de requête.

Révisez avec les flashcards

Mémorisez les réponses avec 81 flashcards sur Architectures logicielles avancées.

Quelle différence principale existe entre une page Web et une application Web ?

Une page Web est statique, une application Web est un logiciel accessible par Internet.

Qu'est-ce que le front-end dans une application Web ?

La partie graphique côté client avec laquelle l'utilisateur interagit.

Qu'est-ce que le back-end dans une application Web ?

La partie serveur qui fournit des services Web au front-end.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Architectures logicielles avancées.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM