★ À maîtriser
📌 Une page Web désigne généralement un contenu HTML, CSS et JavaScript basique et statique, tandis qu’une application Web est un logiciel ou groupement de logiciels accessible par Internet, souvent organisé selon une séparation client-serveur.
Compléments
Un backend moderne recherche notamment: la simplicité et la maintenabilité, l’abstraction et l’extensibilité, la réutilisation et l’optimisation des ressources, la modularité et la séparation des préoccupations, une bonne API et le passage à l’échelle, la fiabilité
Les outils à utiliser comprennent Java 21, Maven 3, IntelliJ ou Visual Studio Code, Swagger Editor et le dépôt GitLab du cours.
Page Web statique ≠ application Web distribuée
REST utilise le protocole HTTP, mais une requête REST est un sur-ensemble d’une requête HTTP car elle organise notamment une ressource, une action, des données d’entrée et une réponse.
Une route REST est identifiée par le couple unique verbe HTTP et URI ; ainsi POST foo/bar et GET foo/bar ne sont pas en conflit, tandis que GET foo/bar/{param1} et GET foo/bar/{param2} sont en conflit car les noms de paramètres ne comptent pas.
Verbe → URI → données → réponse
★ À maîtriser
Pour créer une ressource REST avec Spring Boot, il faut créer une classe annotée avec @RestController et définir l’URI de la ressource avec @RequestMapping.
Dans Spring Boot, @GetMapping(path = "world", produces = MediaType.TEXT_PLAIN_VALUE) définit une route GET dont l’URI est world et dont la réponse est du texte brut.
📌 Une route POST place généralement la donnée à créer dans le corps de la requête, tandis qu’une route GET sert à récupérer des données en lecture seule.
📌 Avec PATCH, les attributs absents du JSON reçu ne sont pas définis et peuvent rester inchangés, tandis qu’avec PUT la route reçoit théoriquement un objet complet et remplace l’objet ciblé.
Compléments
CRUD : Create, Read, Update, Delete
★ À maîtriser
Les données d’une requête REST peuvent être transmises dans le corps HTTP, dans l’URI de la route ou dans les paramètres de l’URI.
Toute requête REST reçoit toujours une réponse HTTP, même lorsque la méthode Java retourne void ; cette réponse peut contenir un code, des données et un message.
Les principaux codes HTTP sont:
📌 Une API REST doit utiliser des codes HTTP adaptés, notamment ResponseEntity ou ResponseStatusException, plutôt que de laisser une erreur applicative produire systématiquement le code 500.
Compléments
📌 Le body permet de transmettre des données complexes et de moins exposer les données, tandis que l’URI est simple mais pollue l’adresse et affiche les données en clair.
Body complexe et discret, URI simple mais exposée
★ À maîtriser
📌 Le marshalling transforme un objet en format adapté à la transmission, par exemple un objet Java en JSON puis en texte de body, tandis que le démarshalling effectue la transformation inverse.
Compléments
📌 Pour marshaller une hiérarchie comprenant une interface Animal, @JsonTypeInfo ajoute un attribut type au JSON et @JsonSubTypes indique les classes concrètes utilisables lors du démarshalling.
Objet adapté → transfert maîtrisé → données sensibles exclues
★ À maîtriser
📌 Dans OpenAPI, une route est décrite sous paths avec une URI, un verbe, des paramètres éventuels, une requête, des réponses HTTP et le schéma de son contenu.
📌 Une API orientée CRUD définit des routes génériques Create-Read-Update-Delete pour les objets, tandis qu’une API orientée application adapte ses routes aux besoins précis du front-end.
Compléments
Une spécification OpenAPI peut être écrite en YAML ou en JSON ; le cours utilise YAML et l’outil Swagger Editor pour la consulter et la modifier.
La route /albumsSummary est un exemple de route orientée application, car elle fournit les données optimisées nécessaires à l’affichage résumé des albums.
Modéliser → documenter → générer → tester
★ À maîtriser
📌 La séparation des préoccupations consiste à faire gérer les routes par le contrôleur et les données ou la logique métier par un service, plutôt que de stocker directement ces données dans le contrôleur.
📌 Une classe dont les instances doivent être stockées en base doit être annotée avec @Entity et posséder une clé primaire annotée avec @Id.
Compléments
📌 L’annotation @GeneratedValue permet d’initialiser et d’incrémenter automatiquement la valeur d’un identifiant, avec notamment les stratégies AUTO, SEQUENCE, IDENTITY, TABLE et UUID.
Contrôleur = routes ; service = logique ; ORM = objets ↔ tables
★ À maîtriser
📌 Une relation un-à-plusieurs se déclare avec @OneToMany(mappedBy = "list") du côté TodoList et une relation plusieurs-à-un avec @ManyToOne du côté Todo.
📌 JPA peut mapper les héritages avec SINGLE_TABLE, TABLE_PER_CLASS ou JOINED, qui utilisent respectivement une table unique, une table par classe avec duplication des colonnes ou une table par classe avec colonnes factorisées et clé étrangère.
Compléments
Les stratégies de génération d’identifiant sont:
FetchType.LAZY charge les données à la demande, tandis que fetch EAGER charge toujours les données.
Identifiant → relation → héritage
★ À maîtriser
📌 Une entité doit déclarer explicitement son attribut de clé avec @Id pour que le repository sache quelle clé utiliser lors de save et findById.
📌 La persistance d’une entité n’est pas transparente : elle devient persistante lorsque l’application appelle notamment persist ou merge, tandis que Spring Boot automatise la création des gestionnaires d’entités.
Compléments
CrudRepository pour le CRUD, JpaRepository pour le relationnel
★ À maîtriser
Un test de route REST avec MockMvc exécute une requête avec mvc.perform, vérifie le statut et le contenu avec andExpect, puis peut afficher la réponse avec andDo.
Un test paramétré JUnit avec @ParameterizedTest et @MethodSource exécute le même test pour chaque donnée fournie par la méthode source.
Les tests REST vérifient:
Compléments
jsonPath("$") désigne la racine du JSON, jsonPath("$[0]") un élément de tableau et jsonPath("$[0].name") une propriété de cet élément.
Le produit cartésien de deux animaux et de deux formats d’entrée, JSON et XML, produit quatre exécutions : chat-JSON, chat-XML, chien-JSON et chien-XML.
Requête → réponse → assertions
★ À maîtriser
📌 Dans Spring Security, les routes correspondant à /api/public/** peuvent être accessibles sans authentification avec permitAll, tandis que les autres routes peuvent exiger authenticated.
📌 Les mots de passe doivent être transmis dans le body d’un POST via HTTPS et stockés sous forme de hash côté back-end, avec bcrypt dans l’exemple présenté.
Compléments
📌 OAuth 2.0 délègue l’autorisation, tandis qu’un système d’authentification vérifie l’identité de l’utilisateur.
Connexion → session JSESSIONID → accès privé
Le contrôle d’accès à un objet suit trois étapes:
API1 Broken Object Level Authorization permet à Alice d’accéder à une commande appartenant à Bob lorsque le serveur vérifie l’existence de la commande mais pas son propriétaire.
API2 Broken Authentication se corrige en exigeant une session authentifiée pour l’endpoint, ce qui produit 401 Unauthorized sans session valide.
API3 Broken Object Property Level Authorization se corrige avec un DTO contrôlé par le serveur qui n’accepte explicitement que les propriétés modifiables.
API4 Unrestricted Resource Consumption se corrige en imposant une pagination et des limites serveur afin que le client ne puisse pas demander une consommation illimitée de ressources.
API5 Broken Function Level Authorization se corrige en exigeant le rôle nécessaire, par exemple ADMIN avec @PreAuthorize("hasRole('ADMIN')"), ce qui renvoie 403 Forbidden à un utilisateur standard.
Authentification identifie, autorisation décide
★ À maîtriser
📌 API7 Server Side Request Forgery se corrige en contrôlant les destinations autorisées et en bloquant notamment les destinations internes pour toute URL fournie par le client.
📌 API10 Unsafe Consumption of APIs se corrige en validant le format et les valeurs reçues d’une API externe avec des DTO et des contraintes telles que @Valid.
Compléments
📌 API8 Security Misconfiguration se corrige en n’exposant que les Actuator nécessaires, en protégeant les routes par rôle et en utilisant une configuration restrictive en production.
📌 API9 Improper Inventory Management se corrige en inventoriant les endpoints, en planifiant leur dépréciation et en supprimant les anciennes versions inutiles.
Limiter, contrôler, valider, retirer
📌 Une API oubliée augmente la surface d’attaque de l’application.
API oubliée → surface d’attaque augmentée
★ À maîtriser
📌 Les données provenant d’une API externe doivent être vérifiées sur leur format et leurs valeurs avant d’être utilisées par le back-end.
Compléments
📌 Les annotations @Valid et les contraintes placées sur un DTO permettent de valider les données reçues d’une API externe ou d’une requête entrante.
Recevoir → vérifier le format → valider les valeurs
★ À maîtriser
📌 L’annotation @Valid demande à Spring d’exécuter les contraintes définies dans le DTO passé en entrée.
📌 Si une contrainte de validation n’est pas respectée, la méthode du contrôleur n’est pas exécutée et Spring renvoie une erreur 400 Bad Request.
Compléments
★ À maîtriser
📌 Une URI REST doit utiliser des noms au pluriel pour les collections, des noms descriptifs et cohérents, éviter les verbes et réserver les paramètres de requête aux filtres.
Compléments
GET récupère ; POST crée ; PUT remplace ; PATCH modifie ; DELETE supprime
★ À maîtriser
Les codes de statut HTTP courants sont:
Le versioning d’une API peut être placé dans l’URI, dans les paramètres de requête ou dans les headers.
Compléments
| Verbe | Opération | Données typiques |
|---|---|---|
| POST | Créer | Corps de la requête |
| GET | Lire | Paramètres ou URI |
| PUT | Remplacer | Objet complet |
| PATCH | Modifier | Objet partiel |
| DELETE | Supprimer | URI ou corps |
| Risque | Problème | Protection |
|---|---|---|
| API1 | Objet appartenant à un autre utilisateur | Vérifier le propriétaire avec Principal |
| API2 | Endpoint accessible sans authentification | Exiger une session authentifiée |
| API3 | Client contrôle une propriété sensible | Utiliser un DTO contrôlé |
| API4 | Consommation illimitée de ressources | Imposer pagination et limites |
| API5 | Fonction sensible sans contrôle de rôle | Exiger le rôle nécessaire |
| API6 | Automatisation massive d’un processus | Limiter la fréquence et le contexte |
Teste tes connaissances sur Architectures logicielles avancées avec 59 questions à choix multiples et corrections détaillées.
1. Quelle distinction décrit correctement une page Web et une application Web ?
2. Quelle partie d’une application Web correspond à l’interface graphique avec laquelle l’utilisateur interagit ?
Mémorisez les concepts clés de Architectures logicielles avancées avec 81 flashcards interactives.
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.
Importe ton cours et l'IA génère fiches, QCM et flashcards en 30 secondes.
Générateur de fiches