Quiz 1 Flashcards
Quelle est la fonction principale d’une application web ?
Traiter les requêtes HTTP et retourner des réponses HTTP.
Quelles sont les quatre couches de l’architecture en couches ?
Présentation, Application, Accès aux données, Données.
Quel est le rôle du contrôleur dans le modèle MVC ?
Le contrôleur reçoit la requête, utilise le modèle et retourne une réponse.
En quoi un service web est-il différent d’une application web ?
Un service web répond aux critères d’une application web mais n’a pas d’interface graphique.
Que signifie l’acronyme CRUD ?
Create (Créer), Read (Lire), Update (Mettre à jour), Delete (Supprimer).
Qu’est-ce qu’un modèle de domaine riche ?
Une approche qui représente un domaine d’affaires avec des concepts, rôles et règles métier, en encapsulant les données et comportements.
Quelle est la principale limitation d’un modèle CRUD ?
Il est principalement axé sur la gestion des données et ne convient pas aux logiques métier complexes.
Qu’est-ce qu’un domaine anémique ?
Un antipattern où les objets du domaine contiennent uniquement des données, sans logique métier.
Quels sont les six principes fondamentaux d’une API REST ?
Interface uniforme, Client-Serveur, Sans état, Caching, Couches, Code sur demande.
Quel format d’échange de données est utilisé par défaut dans Spring Boot ?
JSON.
Quelle est la différence entre une URI et une URL ?
Une URI (Uniform Resource Identifier) identifie une ressource, alors qu’une URL (Uniform Resource Locator) spécifie son emplacement.
Quel verbe HTTP est utilisé pour modifier une ressource partiellement ?
PATCH.
Quel code de réponse HTTP est retourné lorsqu’une ressource est créée avec succès ?
201 Created.
Pourquoi utiliser Spring Boot ?
Il simplifie la configuration, suit une approche “convention over configuration”, et inclut des outils pour REST, bases de données et tests.
Quelle annotation Spring est utilisée pour définir un contrôleur REST ?
@RestController.
Quel est le rôle d’un Repository dans Spring ?
Il permet l’accès aux données en encapsulant la logique de persistance.
Pourquoi utiliser des tests automatisés avec Mockito ?
Pour isoler des composants et tester leur comportement sans dépendances externes.
Qu’est-ce qu’un mock en test unitaire ?
Un objet simulé qui remplace une dépendance réelle pour tester un composant en isolation.
Quelle annotation Spring est utilisée pour injecter une dépendance dans un test ?
@MockBean (ou @Mock avec Mockito).
Quelle est la principale différence entre une application CRUD et une application basée sur un domaine riche ?
Une application CRUD se concentre sur la gestion des données (Create, Read, Update, Delete), tandis qu’une application à domaine riche encapsule les règles métier et la logique dans les objets du domaine.
Dans quelle couche de l’architecture en couches se trouve le Repository ?
Dans la couche d’accès aux données.
Pourquoi l’architecture en couches est-elle utilisée ?
Pour séparer les responsabilités, faciliter la maintenance et rendre l’application plus évolutive.
Quelles sont les limites du modèle CRUD ?
Il ne gère pas bien les logiques métier complexes et est fortement couplé à la base de données.
Quelle est la principale caractéristique d’un modèle de domaine riche ?
Il combine les données et les comportements métier dans les objets du domaine.
Qu’est-ce qu’un domaine anémique ?
Un modèle qui contient uniquement des données sans logique métier, ce qui va à l’encontre du principe de l’encapsulation.
Comment identifier si une application doit être basée sur CRUD ou un domaine riche ?
Si les objets du domaine ont des comportements complexes et interagissent entre eux, un domaine riche est préférable. Si ce sont seulement des opérations simples sur la base de données, CRUD suffit.
Quels sont les six principes fondamentaux d’une API REST ?
Interface uniforme, Client-Serveur, Sans état, Caching, Couches, Code sur demande.
Quel est le rôle d’un @RestController dans Spring Boot ?
Il gère les requêtes HTTP et retourne des réponses sous forme de JSON ou d’autres formats.
Quelle annotation Spring est utilisée pour définir une route GET ?
@GetMapping(“/resource”)
Comment sécuriser une API REST avec Spring ?
En utilisant Spring Security pour l’authentification et l’autorisation.
Quelle est la différence entre @Controller et @RestController ?
@Controller est utilisé pour les applications web avec des vues HTML, tandis que @RestController est utilisé pour les API REST et retourne des objets JSON.
Quelle annotation est utilisée pour injecter une dépendance dans un service Spring ?
@Autowired
Comment Spring Boot facilite-t-il la configuration d’une API REST ?
Il suit une approche “convention over configuration” en fournissant des configurations automatiques et intégrées pour le serveur, les bases de données et les dépendances.
Quel format d’échange de données est utilisé par défaut dans Spring Boot ?
JSON.
Quelle annotation est utilisée pour mapper une requête POST dans Spring Boot ?
@PostMapping(“/resource”)
À quoi sert l’annotation @RequestBody ?
Elle permet de récupérer le corps d’une requête HTTP dans un contrôleur Spring.
Comment indiquer à Spring qu’une méthode renvoie une réponse HTTP 201 (Created) ?
En ajoutant @ResponseStatus(HttpStatus.CREATED).
Quel est l’avantage d’utiliser Spring Boot par rapport à Spring classique ?
Spring Boot réduit la configuration grâce aux conventions et permet un démarrage rapide des applications.
Quelle annotation est utilisée pour définir un service dans Spring ?
@Service
Quelle annotation est utilisée pour déclarer un repository en Spring Data JPA ?
@Repository
Comment définir une entité JPA en Spring Boot ?
En utilisant @Entity, @Table et @Id pour définir la clé primaire.
Quelle annotation est utilisée pour gérer la relation “un-à-plusieurs” dans JPA ?
@OneToMany
Quelle annotation est utilisée pour mapper une classe Java à une table de base de données avec Hibernate ?
@Entity
Pourquoi utiliser des DTO (Data Transfer Objects) en Spring Boot ?
Pour éviter d’exposer directement les entités de la base de données et améliorer la sécurité et la maintenabilité.
Pourquoi utiliser Mockito pour les tests ?
Pour simuler des dépendances et isoler les tests unitaires sans interagir avec une base de données ou d’autres services.
Quelle annotation est utilisée pour déclarer un mock en Mockito ?
@Mock
Quelle annotation est utilisée pour injecter un mock dans une classe testée avec Mockito ?
@InjectMocks
Que fait la méthode when().thenReturn() en Mockito ?
Elle permet de définir un comportement simulé pour une méthode d’un mock.
Quelle annotation Spring permet de créer un mock pour un composant Spring Boot ?
@MockBean
Pourquoi utiliser @MockBean au lieu de @Mock dans un test Spring Boot ?
@MockBean intègre le mock dans le contexte Spring, ce qui est utile pour tester des composants Spring.
Comment s’assurer qu’une méthode a bien été appelée dans un test Mockito ?
En utilisant verify(mock).methode();
Pourquoi est-il important d’écrire des tests unitaires ?
Pour détecter les bugs rapidement, garantir la qualité du code et éviter les régressions lors des modifications.
Qu’est-ce qu’un test d’intégration?
Un test d’intégration permet de tester l’interaction entre des unités de code en les mettant ensemble lors des tests. Il permet de valider le bon fonctionnement de plusieurs éléments à la fois et d’écrire MOINS de tests, mais ces tests sont généralement moins robustes (plus fragiles aux changements).
Pourquoi réaliser des tests d’intégration?
- S’assurer en permanence du bon fonctionnement d’éléments et de leurs interactions
S’assurer de tester en permanence les éléments clés d’un système
Réduire le nombre de tests à modifier à la suite d’un changement
Quels éléments a-t-on avantage à tester avec des tests d’intégration?
- Convertisseurs (DTO ↔ Domaine et Domaine ↔ Entités): car un changement dans un DTO, un objet du domaine ou une entité entraînera forcément un changement dans le convertisseur
Factories: car un changement dans la signature d’une classe gérée par une factory entraînera un changement dans celle-ci
Qu’est-ce que MockitoExtension.class permet dans les tests d’intégration?
C’est une approche pour les tests d’intégration qui permet:
La création du mock automatiquement (avec @Mock)
L’instanciation des classes concrètes et l’injection manuelle des dépendances/mocks
Quels sont les risques et limitations des tests d’intégration?
- Fragilisation des tests: un changement dans l’une des classes testées peut faire échouer plusieurs tests
Le bon fonctionnement des tests peut être influencé par plusieurs éléments
Qu’est-ce qu’un test bout-en-bout (E2E)?
Un test bout-en-bout permet de tester l’ensemble d’une application à partir des entrées jusqu’à la production de la réponse en passant par le stockage (BD). Il permet de valider le bon fonctionnement d’une fonctionnalité complète, permet d’écrire moins de tests, mais est plus fragile aux changements.
Pourquoi réaliser des tests bout-en-bout?
Pour s’assurer en permanence du bon fonctionnement d’une fonctionnalité critique de l’application (login, logout, inscription, etc.)
Qu’est-ce qu’on peut “mocker” dans un test bout-en-bout?
- Couche d’accès aux données, ce qui permet de simplifier les tests et de les accélérer
Classes candidates: Repository et DAO
Quelles annotations sont utilisées pour configurer Spring Boot Test MVC?
- @Tag: Pour différencier les tests E2E des autres types de tests (optionnel)
@SpringBootTest: Permet de lancer une application MVC dans le contexte de tests
@AutoConfigureMockMvc: Permet l’accès automatique au MockMvc
@ExtendWith: Donne accès au contexte interne de Spring (optionnel)
Quels sont les risques et limitations des tests bout-en-bout?
- Tests fragiles: un changement dans n’importe quelle classe peut briser ce test
Peuvent être difficiles à écrire
Peuvent être difficiles à maintenir
Pourquoi utiliser la pagination?
- Performance: moins de données = moins de charge pour le serveur, donc plus rapide
Plus intuitif: parcourir des données graduellement plutôt que d’avoir toutes les données d’un seul coup
Optimisation de la bande passante: réduire la taille des réponses
Prévention de la surcharge (DDoS): éviter la dégradation des performances
Protection contre l’exfiltration des données: empêcher la récupération de toutes les données en une seule requête
Pourquoi trier les données?
- Faciliter la lecture et la navigation: l’utilisateur s’attend à avoir des données organisées
Réduction de la charge cognitive: facilite la recherche
Personnalisation: l’utilisateur peut personnaliser le tri pour faciliter sa recherche
Déterminisme: les données seront toujours présentées de la même façon
Performance: le tri fait par les bases de données est plus efficace que le tri par programmation
Comment transporter une requête de pagination à travers les couches d’une application?
- Requête: Exposer un DTO pour la requête de pagination (API) → Transformer en configuration pour le repository (Domain) → Envoyer la requête au DAO (Spring)
Réponse: Recevoir les données paginées (Spring) → Transformer en données paginées du domaine (Domain) → Répondre à la requête avec les DTO de réponse (API)
Quelles sont les particularités de la pagination entre Spring et le standard REST?
- La pagination avec JPA/Spring commence à 0
Le standard REST est de commencer la pagination à 1
Les classes utilitaires fournies prennent en charge cette transformation
Comment ajouter une méthode paginée sur un repository?
En définissant une méthode qui accepte un paramètre de type PaginationOptions et retourne un type Paginated<T>. Par exemple:</T>
Paginated<Recipe> getAll(PaginationOptions options);</Recipe>
Comment trier des données avec Spring Data JPA?
PageRequest.of(PAGE, PAGE_SIZE, Sort.by(“title”).ascending());
Quelles sont les deux approches pour générer des requêtes complexes avec Spring Data JPA?
- Génération automatique du code (dérivée du nom de la méthode)
- Déclaration de requêtes
Comment fonctionne l’auto-génération de requêtes dans Spring Data JPA?
- Intégration à 100% avec l’ORM
Création des requêtes “auto-magiquement” pour tous les champs mappés
Format: préfixe (findBy) + nom du champ + spécification optionnelle
Exemples: findById, findByUsernameContainingIgnoreCase
Quelles sont les étapes pour créer une requête auto-générée?
- La méthode commence par findBy
- La méthode déclare ensuite un champ de l’entité pour une recherche stricte
- Ajout d’un prédicat (optionnel) pour affiner le mode de recherche (IsStartingWith, Contains, etc.)
Comment déclarer des requêtes personnalisées avec Spring Data JPA?
En utilisant l’annotation @Query et en écrivant la requête en:
HQL (dialecte Hibernate utilisant les entités)
SQL natif (avec le nom des tables et des champs de la BD) en spécifiant nativeQuery=true
Comment combiner pagination et requêtes avancées?
Les requêtes avancées supportent la pagination, il suffit d’ajouter un paramètre de type Pageable et d’avoir une Page comme type de retour:
Page<Recipe> findRecipesByTitle(String title, Pageable pageable);</Recipe>
Pourquoi documenter une API?
- Maintenance accrue: plus facile à mettre à jour
Améliore l’adoption: facilement compréhensible par les développeurs
Facilite l’intégration: permet aux utilisateurs de tester et d’intégrer rapidement l’API
Améliore la collaboration: utile pour les équipes de développement et les partenaires externes
Qu’est-ce qu’OpenAPI?
- Anciennement connu sous le nom de Swagger
Standard pour la documentation d’API REST
Transféré à l’OpenApi Initiative en 2015
Objectif: uniformiser la description des APIs REST et faciliter leur adoption
Quelles sont les bonnes pratiques pour la documentation d’API?
- Utiliser des standards (OpenAPI, RAML, etc.)
Fournir des exemples d’utilisation clairs
Inclure des descriptions détaillées des endpoints, paramètres et réponses
Maintenir la documentation à jour
Utiliser un outil interactif (Swagger UI, Redoc, Postman)
Que doit-on documenter dans une API?
- Ressources: décrire les ressources exposées par l’API
Routes (Endpoints): lister et décrire toutes les routes disponibles
Méthodes HTTP: GET, POST, PUT, DELETE et leur signification
Codes HTTP: documenter les codes 2xx (succès) et 4xx (erreurs de l’utilisateur)
Format des requêtes et des réponses
Comment ajouter OpenAPI à un projet Spring?
En ajoutant la dépendance:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.7.0</version>
</dependency>
Comment accéder à la documentation OpenAPI une fois configurée?
Après avoir lancé l’application Spring, la documentation est disponible à l’adresse:
http://localhost:8080/swagger-ui/
Quels sont les avantages de la génération de SDK à partir d’OpenAPI?
On peut se servir de la documentation OpenAPI pour auto-générer un client permettant de se connecter à l’API (ex: application mobile en Kotlin, application front-end en TypeScript), ce qui facilite l’intégration.
Qu’est-ce que la programmation défensive?
Une approche pour améliorer les logiciels et le code source en termes de:
Qualité générale: réduction des bogues et des problèmes
Augmentation de la lisibilité du code: lisible, compréhensible et auditable
Rendant le logiciel plus prévisible en dépit des opérations des utilisateurs
Que signifie “communiquer l’intention” dans le code?
Cela permet au lecteur de facilement et rapidement comprendre ce qu’un bout de code produit ou doit produire. Cela facilite:
La création d’un modèle mental du code
La modification du code
Le débogage
La collaboration
L’accueil de nouveaux développeurs
Comment communiquer l’intention dans le code?
- Utiliser des noms de variable clairs et explicites
Favoriser les méthodes courtes
Travailler avec les pré-conditions, invariants et post-conditions
Utiliser les tests automatisés pour documenter les comportements
Comment rendre testable un invariant comme “un numéro de série non modifiable”?
En brisant l’encapsulation de façon contrôlée, par exemple:
Créer un setter public
Gérer la contrainte en levant une exception si on tente de modifier le numéro de série
Ou gérer la contrainte silencieusement (ignorer les tentatives de modification)
Écrire un test qui vérifie que le comportement fonctionne
Pourquoi est-il important de rendre les invariants testables?
- Permet de rendre explicite une contrainte du domaine d’affaire
Permet de documenter la contrainte dans le code
Permet de facilement détecter un changement dans une revue de code
Ne sera jamais désuet face à une documentation changeante (si le requis change, le code changera)
Quels sont les codes HTTP standardisés pour indiquer le résultat d’une requête?
Les codes HTTP sont regroupés en 5 catégories:
1xx (100-199): Informations
2xx (200-299): Succès
3xx (300-399): Redirection
4xx (400-499): Erreurs du client
5xx (500-599): Erreurs du serveur
En quoi consiste une bonne réponse lors d’une erreur dans une API REST?
Une bonne réponse d’erreur doit:
Retourner du JSON bien structuré
Fournir suffisamment de contexte pour permettre à l’utilisateur de déterminer la source de l’erreur
Inclure un code d’état HTTP approprié
Pourquoi est-il important de faire une gestion d’erreur adéquate?
Pour plusieurs raisons:
Améliorer l’expérience utilisateur (messages clairs et exploitables)
Fournir un retour d’information précis pour corriger les erreurs
Faciliter le débogage (identifier rapidement la cause d’un problème)
Sécuriser l’application (éviter l’exposition de données sensibles)
Quelles précautions doit-on prendre lors de la gestion des erreurs?
Ne pas présenter de données sensibles (mots de passe, tokens, numéros de carte de crédit)
Limiter l’exposition des erreurs pour éviter les attaques (ex: pas de Stack Trace)
Quelles sont les bonnes pratiques pour la gestion des erreurs avec Spring?
Utiliser @RestControllerAdvice pour une gestion centralisée
Utiliser les ProblemDetail pour standardiser les réponses d’erreur
Différencier erreurs attendues (validation) et erreurs inattendues (bogues)
Retourner des erreurs spécifiques et parlantes (ex: 400 Bad Request avec des détails)
Ajouter un identifiant unique à chaque erreur pour faciliter le suivi
Documenter les erreurs via OpenAPI (Swagger)
Quelle est la différence entre une erreur attendue et une erreur inattendue?
Erreur attendue: liée aux règles d’affaires (contraintes, validation, etc.), comme une violation de contrainte ou un utilisateur invalide
Erreur inattendue: liée à un bogue ou une panne, comme un NullPointerException ou une erreur réseau
Qu’est-ce qu’un ID unique d’erreur (ou ID de corrélation) et à quoi sert-il?
C’est un identifiant unique (généralement un UUID) associé à chaque erreur
Permet de faire le suivi des erreurs entre les systèmes
Permet de faire le suivi entre une erreur reçue par un utilisateur et les logs
Facilite le débogage en liant les logs à une erreur spécifique
Comment implémenter une gestion d’erreurs centralisée avec Spring?
Utiliser l’annotation @RestControllerAdvice sur une classe dédiée
Implémenter des méthodes avec @ExceptionHandler pour chaque type d’exception à gérer
Retourner des ProblemDetail normalisés pour chaque type d’erreur
Qu’est-ce que le principe “fail fast” dans la gestion des erreurs?
Le principe “fail fast” consiste à échouer le plus rapidement possible pour limiter la consommation de ressources:
Au niveau API: échouer sur les formats invalides sans se rendre dans le domaine ou la base de données
Au niveau domaine: échouer sur les règles d’affaires sans se rendre à la base de données
Au niveau base de données: utiliser une sauvegarde optimiste (1 seule requête) quand approprié
Qu’est-ce que la journalisation (logging) en développement web?
La journalisation est l’enregistrement séquentiel dans un fichier ou une base de données de tous les événements affectant un processus particulier. Elle permet d’avoir de l’information détaillée sur les différentes erreurs survenues dans l’application (stacktrace).
Quels types d’informations doit-on inclure dans les logs?
Niveau (INFO, DEBUG, WARN, ERROR)
Timestamp (instant où l’événement s’est produit)
Si l’erreur est attendue ou non
L’IP de la personne ou du système ayant généré l’événement
L’ID de corrélation
Message d’erreur
Stacktrace lorsque pertinente
Quels sont les différents niveaux de logs et quand les utiliser?
INFO: événements normaux et pertinents pour l’audit (authentification réussie, action utilisateur réussie)
DEBUG: messages utiles pour le développement et le diagnostic détaillé (à désactiver en production)
WARN: avertissement sur un problème potentiel qui n’affecte pas encore le fonctionnement (service distant non disponible temporairement)
ERROR: événements indiquant un problème grave qui peut impacter le fonctionnement du système (erreur fatale, perte de connexion BD)
Quelles précautions doit-on prendre avec la journalisation?
Ne pas exposer d’informations sensibles
Exclure les traces de stack dans les réponses JSON
Masquer les informations de la base de données
Ne pas loguer des données sensibles (mots de passe, tokens, numéros de carte)
Mettre en place du monitoring et des alertes sur les erreurs critiques
Comment implémenter la journalisation avec Spring?
Utiliser une librairie de logging testée et éprouvée comme SLF4J (Simple Logging Facade for Java)
Configurer une implémentation comme Logback (par défaut avec Spring)
Instancier un logger avec LoggerFactory.getLogger(CurrentClass.class)
Utiliser les différentes méthodes (info, debug, warn, error) en fonction du niveau approprié
Pourquoi la sécurité des applications web est-elle importante?
Elle est importante car une faille de sécurité peut permettre à quelqu’un de voler des mots de passe, des données personnelles ou d’autres informations sensibles, compromettant ainsi la vie privée et la sécurité des utilisateurs.
Qu’est-ce que la sécurité selon le Larousse?
Situation dans laquelle quelqu’un, quelque chose n’est exposé à aucun danger, à aucun risque, en particulier d’agression physique, d’accidents, de vol, de détérioration.
Quels sont les différents niveaux de sécurité dans un système informatique?
La sécurité couvre un large spectre:
Gouvernance (politiques, gestion de risques, Loi 25)
Infrastructure (serveurs, configurations)
Environnement (WAF, IDS)
Applicatif (Authentification, Autorisation)
Quels sont les 2 éléments principaux de la sécurité applicative abordés dans le cours?
Authentification et Autorisation
Qu’est-ce que l’OWASP?
OWASP (Open Web Application Security Project) est un projet de grande envergure pour la sécurité à tous les niveaux, fournissant des ressources comme le Top 10 Web, Top 10 API, requis de sécurité (ASVS), tests de sécurité, etc.
Quelles sont les 3 principales vulnérabilités du Top 10 API d’OWASP sur lesquelles le cours se concentre?
Autorisation incorrecte (objet/ressource/propriété d’un objet)
Authentification incorrecte (objet/ressource)
Autorisation incorrecte (fonction/méthode)
Quelles sont les principales différences entre une application Web et une API en termes de sécurité?
Web: utilise des sessions et cookies, possède un front-end (HTML/CSS/JavaScript)
API: stateless (pas de session ou cookies), uniquement back-end
Qu’est-ce que l’authentification?
Processus par lequel un système informatique s’assure de l’identité d’un utilisateur.
Quelle est la différence clé entre authentification et autorisation?
Authentification → Qui êtes-vous?
Autorisation → Que pouvez-vous faire?
Quelles sont les principales méthodes d’authentification?
Basé sur ce que vous savez (Connaissance): mot de passe, code PIN, question secrète
Basé sur ce que vous possédez (Possession): clé USB de sécurité, code SMS, application d’authentification
Basé sur ce que vous êtes (Biométrie): empreinte digitale, reconnaissance faciale, scan rétinien
Basé sur votre localisation/comportement (Contexte): adresse IP, appareil utilisé, lieu de connexion
Quelles sont les faiblesses de l’authentification par mot de passe?
Les mots de passe sont souvent faibles et réutilisés
Vulnérabilité aux attaques (brute force, phishing, fuites de données)
En 2021, plus de 8,4 milliards de mots de passe ont été publiés sur le dark web après des fuites massives
Qu’est-ce que l’authentification multi-facteur (MFA) et pourquoi l’utiliser?
C’est une méthode qui combine plusieurs facteurs d’authentification distincts
Elle réduit les risques d’usurpation d’identité
Elle ajoute une seconde couche de protection
Exemples: code SMS, application d’authentification, clé physique de sécurité
Quels sont les 4 acteurs clés dans un système d’authentification?
Le demandant (client/utilisateur): celui qui veut accéder à une ressource
Le serveur d’authentification (Identity Provider): vérifie l’identité et émet un jeton
Le serveur de ressources (API Backend): stocke et protège les ressources, vérifie la validité du jeton
Le propriétaire de la ressource (Administrateur): définit les règles d’accès
Pourquoi est-il important de valider les données dans une application web?
Pour plusieurs raisons:
Sécurité: protection contre les attaques (injection SQL, XSS, CSRF)
Fiabilité et cohérence des données: empêcher les erreurs de format, assurer la validité des données
Expérience utilisateur améliorée: retour d’erreur immédiat et compréhensible
À quels niveaux peut-on effectuer la validation des données?
API: vérification des entrées reçues dans le controller à l’aide des DTOs
Domaine: implémentation des règles d’affaire spécifiques et validation contextuelle
Base de données: contraintes du schéma et validation au niveau de l’ORM
Quels sont les différents types de validations?
Validations simples: validation indépendante des champs (format courriel, longueur, valeur numérique)
Validations croisées: validation dépendant de plusieurs champs (confirmation de mot de passe, dates)
Nettoyage des données: transformation des données (trim, suppression HTML, filtrage caractères spéciaux)
Comment rendre un champ obligatoire avec les annotations de validation?
En utilisant l’annotation @NotNull, qui valide l’absence de valeur (champ absent ou null)
Comment activer la validation dans Spring?
Ajouter la dépendance spring-boot-starter-validation
Annoter les champs du DTO avec les annotations de validation (@NotNull, @Size, @Email, etc.)
Ajouter l’annotation @Valid sur le paramètre à valider dans le controller
Qu’est-ce que les groupes de validation et à quoi servent-ils?
Les groupes de validation permettent de définir des approches de validation granulaires
Ils sont utiles quand un même objet est utilisé dans différents contextes (création/modification)
On définit des interfaces pour chaque groupe, puis on spécifie le groupe dans les annotations de validation
Pour appliquer un groupe spécifique, on utilise @Validated(Group.class) au lieu de @Valid
Comment créer une validation personnalisée (custom) avec Spring?
Définir une nouvelle annotation (interface)
Implémenter la logique de validation avec ConstraintValidator
Appliquer l’annotation sur les champs à valider
Comment gérer les erreurs de validation?
Intercepter l’exception MethodArgumentNotValidException dans un @ControllerAdvice
Extraire les messages d’erreur avec exception.getBindingResult().getFieldErrors()
Ajouter ces erreurs dans la réponse ProblemDetail via setProperty
Retourner une réponse cohérente avec le code HTTP 400 (Bad Request)
Comment tester les validations?
Utiliser l’annotation @SpringBootTest pour configurer le contexte
Injecter un Validator avec @Autowired
Créer des DTOs avec des données valides/invalides
Valider avec validator.validate() et vérifier les erreurs retournées
Tester avec différents groupes de validation si nécessaire
Quelle est la dépendance à ajouter pour activer le module de sécurité de Spring?
La dépendance spring-boot-starter-security doit être ajoutée au projet.
Que se passe-t-il lorsqu’on ajoute la dépendance de sécurité Spring?
L’application est automatiquement sécurisée contre votre gré et il faut modifier la configuration pour autoriser l’accès.
Qu’est-ce qu’une chaîne de sécurité (security chain) dans Spring Security?
Une série de filtres au travers desquels passent toutes les requêtes. Seuls les filtres applicables sont activés.
Quels sont les composants principaux de la chaîne de sécurité Spring?
Filtre/Filter, Gestionnaire/Manager, Fournisseur/Provider, Service Utilisateur/UserDetailsService, et Encodeur/PasswordEncoder.
Quel est le rôle du UserDetailsService dans Spring Security?
Il est responsable de récupérer les informations de l’utilisateur.
Quelle est la méthode principale à implémenter dans UserDetailsService?
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
Quelles sont les recommandations OWASP pour la taille du mot de passe?
Au moins 12 caractères, permettant au moins 64 caractères (pour les pass phrases) et maximum 128 caractères.
Quelles sont les recommandations OWASP pour la composition du mot de passe?
Support UTF8 (caractères spéciaux et emojis), vérification que le mot de passe ne fait pas partie des dictionnaires de mots de passe courants, indicateur visuel de force, et pas de contraintes sur la composition (minuscules/majuscules/caractères spéciaux/nombres).
Quelle est la différence entre les annotations @PreAuthorize et @PostAuthorize?
@PreAuthorize permet de valider l’accès avant l’appel de la méthode, tandis que @PostAuthorize permet de valider l’accès après l’appel de la méthode.
Comment vérifier un rôle spécifique avec l’annotation @PreAuthorize?
Avec @PreAuthorize(“hasRole(‘ROLE_NAME’)”) ou simplement @PreAuthorize(“hasRole(‘NAME’)”).
Comment vérifier une permission spécifique avec l’annotation @PreAuthorize?
Avec @PreAuthorize(“hasAuthority(‘permission:action:scope’)”).
Quelle est la différence entre hasRole() et hasAuthority()?
hasRole(‘X’) est interprété par Spring comme hasAuthority(‘ROLE_X’), donc hasRole ajoute automatiquement le préfixe ROLE_.
Quelle est la différence entre encodage et chiffrement (encryption)?
L’encodage est un processus de transformation bidirectionnel pour le transport d’informations, tandis que le chiffrement est un processus bidirectionnel pour le transport d’informations confidentielles nécessitant une clé pour le déchiffrement.
Quelle est la principale caractéristique du hachage (hashing)?
C’est un processus de transformation unidirectionnel (irréversible) utilisé pour le stockage sécurisé d’informations et la garantie d’intégrité.
Citez des exemples d’encodages humains.
Langages parlés et écrits, Code morse.
Citez des exemples d’encodages machines.
UTF-8, MP3/MP4, Base64.
Pourquoi utilise-t-on le chiffrement (encryption)?
Pour rendre la compréhension d’un document impossible à toute personne qui n’a pas la clé de chiffrement.
Qu’est-ce qui distingue le chiffrement symétrique du chiffrement asymétrique?
Dans le chiffrement symétrique, on utilise la même clé pour le chiffrement et le déchiffrement. Dans le chiffrement asymétrique, on utilise une clé publique pour le chiffrement et une clé privée pour le déchiffrement.
Citez un algorithme de chiffrement symétrique courant.
AES (Advanced Encryption Standard) avec différentes tailles de clé (128, 192, 256 bits).
Citez un algorithme de chiffrement asymétrique courant.
RSA, souvent utilisé pour l’échange de clés symétriques.
Pourquoi le hachage est-il utilisé pour stocker les mots de passe?
Car c’est une transformation unidirectionnelle (irréversible) qui permet de vérifier si un mot de passe est correct sans jamais stocker le mot de passe original.
Quels algorithmes de hachage sont considérés comme sécuritaires pour le stockage des mots de passe?
bcrypt, Argon2 (recommandation OWASP), et Scrypt.
Quels algorithmes de hachage ne sont plus considérés comme sécuritaires?
MD5 et SHA-256 (pour les mots de passe).
Quelle est la différence clé entre authentification et autorisation?
L’authentification détermine qui vous êtes, tandis que l’autorisation détermine ce que vous pouvez faire.
Que signifie JWT?
JSON Web Token (prononcé “jot”).
Quel est l’avantage principal des jetons JWT par rapport aux sessions?
Les JWT sont stateless (sans état) et permettent de distribuer les requêtes à n’importe quel serveur.
Quel est le format d’un JWT?
[Header encodé en Base64].[Payload encodé en Base64].[Signature]
Quelles sont les trois parties d’un JWT?
Header (algorithme et type), Payload/Claims (contenu), et Signature.
Quelles informations sont typiquement incluses dans le Claims d’un JWT?
Le sujet (sub), les autorités/permissions, les dates d’émission (iat) et d’expiration (exp), et autres informations pertinentes.
Comment signer un JWT avec la bibliothèque JJWT?
Jwts.builder().setClaims().setIssuedAt().setExpiration().signWith(getSigningKey(), SignatureAlgorithm.HS384).compact()
Comment valider un JWT avec la bibliothèque JJWT?
Jwts.parserBuilder().setSigningKey(getSigningKey()).build().parseClaimsJws(token).getBody().
Qu’est-ce que RBAC?
Role Based Access Control - Gestion d’accès basée sur les rôles.
Qu’est-ce que PBAC?
Permission Based Access Control - Gestion d’accès basée sur les permissions.
Quel est l’avantage principal de RBAC?
Simple à comprendre, facile à gérer dans les organisations structurées, et peu de logique pour la gestion des accès.
Quel est l’avantage principal de PBAC?
Très granulaire, s’adapte aux cas complexes, et supporte les autorisations dynamiques.
Comment définir une permission dans PBAC?
Généralement au format resource:action:scope (ex: post:update:all ou post:update:self)
Dans quel cas RBAC est-il plus approprié?
Pour les petites équipes avec des règles d’accès simples.
Dans quel cas PBAC est-il plus approprié?
Pour les grandes équipes avec des règles d’accès complexes.
Quels sont les volets principaux à considérer pour la mise en production d’un service web?
Infrastructure, base de données, et application.
Quelle est une recommandation générale pour le déploiement d’infrastructures modernes?
Déployer à l’aide de conteneurs (Docker), utiliser des systèmes d’orchestration si nécessaire (Docker Compose, Kubernetes).
Qu’est-ce que CI/CD?
Continuous Integration/Continuous Deployment - l’automatisation du processus de déploiement de l’application.
Pourquoi automatiser le déploiement avec CI/CD?
Pour réduire les interventions humaines, diminuer le risque d’erreur, et automatiser les tests, la compilation, la vérification de sécurité, etc.
Comment gérer l’évolution de la base de données au fil du temps?
Avec des scripts de migration qui modifient le schéma et le comportement de la base de données.
Quelle bibliothèque est recommandée pour les migrations de base de données avec Spring?
Flyway.
Quelle configuration doit-on modifier dans Spring JPA lors de l’utilisation de migrations?
Changer spring.jpa.hibernate.ddl-auto=create à spring.jpa.hibernate.ddl-auto=validate.
Qu’est-ce qu’un feature toggle (ou feature flag)?
Un mécanisme permettant d’activer ou désactiver des fonctionnalités de l’application sans déployer de nouveau code.
Quel design pattern est utilisé pour implémenter les feature toggles?
Le pattern Strategy.
Quel est l’avantage principal des feature toggles pour le déploiement continu?
Permettre de déployer du code incomplet en production mais désactivé, puis de l’activer plus tard sans nouveau déploiement.
Comment gérer du code incomplet en production?
En le rendant inaccessible via des feature toggles jusqu’à ce qu’il soit complet.