Quiz 1 Flashcards

1
Q

Quelle est la fonction principale d’une application web ?

A

Traiter les requêtes HTTP et retourner des réponses HTTP.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Quelles sont les quatre couches de l’architecture en couches ?

A

Présentation, Application, Accès aux données, Données.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Quel est le rôle du contrôleur dans le modèle MVC ?

A

Le contrôleur reçoit la requête, utilise le modèle et retourne une réponse.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

En quoi un service web est-il différent d’une application web ?

A

Un service web répond aux critères d’une application web mais n’a pas d’interface graphique.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Que signifie l’acronyme CRUD ?

A

Create (Créer), Read (Lire), Update (Mettre à jour), Delete (Supprimer).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Qu’est-ce qu’un modèle de domaine riche ?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Quelle est la principale limitation d’un modèle CRUD ?

A

Il est principalement axé sur la gestion des données et ne convient pas aux logiques métier complexes.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Qu’est-ce qu’un domaine anémique ?

A

Un antipattern où les objets du domaine contiennent uniquement des données, sans logique métier.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Quels sont les six principes fondamentaux d’une API REST ?

A

Interface uniforme, Client-Serveur, Sans état, Caching, Couches, Code sur demande.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Quel format d’échange de données est utilisé par défaut dans Spring Boot ?

A

JSON.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Quelle est la différence entre une URI et une URL ?

A

Une URI (Uniform Resource Identifier) identifie une ressource, alors qu’une URL (Uniform Resource Locator) spécifie son emplacement.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Quel verbe HTTP est utilisé pour modifier une ressource partiellement ?

A

PATCH.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Quel code de réponse HTTP est retourné lorsqu’une ressource est créée avec succès ?

A

201 Created.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Pourquoi utiliser Spring Boot ?

A

Il simplifie la configuration, suit une approche “convention over configuration”, et inclut des outils pour REST, bases de données et tests.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Quelle annotation Spring est utilisée pour définir un contrôleur REST ?

A

@RestController.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Quel est le rôle d’un Repository dans Spring ?

A

Il permet l’accès aux données en encapsulant la logique de persistance.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Pourquoi utiliser des tests automatisés avec Mockito ?

A

Pour isoler des composants et tester leur comportement sans dépendances externes.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Qu’est-ce qu’un mock en test unitaire ?

A

Un objet simulé qui remplace une dépendance réelle pour tester un composant en isolation.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Quelle annotation Spring est utilisée pour injecter une dépendance dans un test ?

A

@MockBean (ou @Mock avec Mockito).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Quelle est la principale différence entre une application CRUD et une application basée sur un domaine riche ?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Dans quelle couche de l’architecture en couches se trouve le Repository ?

A

Dans la couche d’accès aux données.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Pourquoi l’architecture en couches est-elle utilisée ?

A

Pour séparer les responsabilités, faciliter la maintenance et rendre l’application plus évolutive.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Quelles sont les limites du modèle CRUD ?

A

Il ne gère pas bien les logiques métier complexes et est fortement couplé à la base de données.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Quelle est la principale caractéristique d’un modèle de domaine riche ?

A

Il combine les données et les comportements métier dans les objets du domaine.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Qu’est-ce qu’un domaine anémique ?

A

Un modèle qui contient uniquement des données sans logique métier, ce qui va à l’encontre du principe de l’encapsulation.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Comment identifier si une application doit être basée sur CRUD ou un domaine riche ?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Quels sont les six principes fondamentaux d’une API REST ?

A

Interface uniforme, Client-Serveur, Sans état, Caching, Couches, Code sur demande.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Quel est le rôle d’un @RestController dans Spring Boot ?

A

Il gère les requêtes HTTP et retourne des réponses sous forme de JSON ou d’autres formats.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Quelle annotation Spring est utilisée pour définir une route GET ?

A

@GetMapping(“/resource”)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Comment sécuriser une API REST avec Spring ?

A

En utilisant Spring Security pour l’authentification et l’autorisation.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Quelle est la différence entre @Controller et @RestController ?

A

@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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Quelle annotation est utilisée pour injecter une dépendance dans un service Spring ?

A

@Autowired

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Comment Spring Boot facilite-t-il la configuration d’une API REST ?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Quel format d’échange de données est utilisé par défaut dans Spring Boot ?

A

JSON.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

Quelle annotation est utilisée pour mapper une requête POST dans Spring Boot ?

A

@PostMapping(“/resource”)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

À quoi sert l’annotation @RequestBody ?

A

Elle permet de récupérer le corps d’une requête HTTP dans un contrôleur Spring.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Comment indiquer à Spring qu’une méthode renvoie une réponse HTTP 201 (Created) ?

A

En ajoutant @ResponseStatus(HttpStatus.CREATED).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

Quel est l’avantage d’utiliser Spring Boot par rapport à Spring classique ?

A

Spring Boot réduit la configuration grâce aux conventions et permet un démarrage rapide des applications.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

Quelle annotation est utilisée pour définir un service dans Spring ?

A

@Service

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Quelle annotation est utilisée pour déclarer un repository en Spring Data JPA ?

A

@Repository

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
41
Q

Comment définir une entité JPA en Spring Boot ?

A

En utilisant @Entity, @Table et @Id pour définir la clé primaire.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
42
Q

Quelle annotation est utilisée pour gérer la relation “un-à-plusieurs” dans JPA ?

A

@OneToMany

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
43
Q

Quelle annotation est utilisée pour mapper une classe Java à une table de base de données avec Hibernate ?

A

@Entity

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

Pourquoi utiliser des DTO (Data Transfer Objects) en Spring Boot ?

A

Pour éviter d’exposer directement les entités de la base de données et améliorer la sécurité et la maintenabilité.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
45
Q

Pourquoi utiliser Mockito pour les tests ?

A

Pour simuler des dépendances et isoler les tests unitaires sans interagir avec une base de données ou d’autres services.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
46
Q

Quelle annotation est utilisée pour déclarer un mock en Mockito ?

A

@Mock

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
47
Q

Quelle annotation est utilisée pour injecter un mock dans une classe testée avec Mockito ?

A

@InjectMocks

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
48
Q

Que fait la méthode when().thenReturn() en Mockito ?

A

Elle permet de définir un comportement simulé pour une méthode d’un mock.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
49
Q

Quelle annotation Spring permet de créer un mock pour un composant Spring Boot ?

A

@MockBean

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
50
Q

Pourquoi utiliser @MockBean au lieu de @Mock dans un test Spring Boot ?

A

@MockBean intègre le mock dans le contexte Spring, ce qui est utile pour tester des composants Spring.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
51
Q

Comment s’assurer qu’une méthode a bien été appelée dans un test Mockito ?

A

En utilisant verify(mock).methode();

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
52
Q

Pourquoi est-il important d’écrire des tests unitaires ?

A

Pour détecter les bugs rapidement, garantir la qualité du code et éviter les régressions lors des modifications.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
53
Q

Qu’est-ce qu’un test d’intégration?

A

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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
54
Q

Pourquoi réaliser des tests d’intégration?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
55
Q

Quels éléments a-t-on avantage à tester avec des tests d’intégration?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
56
Q

Qu’est-ce que MockitoExtension.class permet dans les tests d’intégration?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
57
Q

Quels sont les risques et limitations des tests d’intégration?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
58
Q

Qu’est-ce qu’un test bout-en-bout (E2E)?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
59
Q

Pourquoi réaliser des tests bout-en-bout?

A

Pour s’assurer en permanence du bon fonctionnement d’une fonctionnalité critique de l’application (login, logout, inscription, etc.)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
60
Q

Qu’est-ce qu’on peut “mocker” dans un test bout-en-bout?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
61
Q

Quelles annotations sont utilisées pour configurer Spring Boot Test MVC?

A
  • @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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
62
Q

Quels sont les risques et limitations des tests bout-en-bout?

A
  • Tests fragiles: un changement dans n’importe quelle classe peut briser ce test

Peuvent être difficiles à écrire
Peuvent être difficiles à maintenir

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
63
Q

Pourquoi utiliser la pagination?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
64
Q

Pourquoi trier les données?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
65
Q

Comment transporter une requête de pagination à travers les couches d’une application?

A
  • 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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
66
Q

Quelles sont les particularités de la pagination entre Spring et le standard REST?

A
  • 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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
67
Q

Comment ajouter une méthode paginée sur un repository?

A

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>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
68
Q

Comment trier des données avec Spring Data JPA?

A

PageRequest.of(PAGE, PAGE_SIZE, Sort.by(“title”).ascending());

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
69
Q

Quelles sont les deux approches pour générer des requêtes complexes avec Spring Data JPA?

A
  1. Génération automatique du code (dérivée du nom de la méthode)
  2. Déclaration de requêtes
70
Q

Comment fonctionne l’auto-génération de requêtes dans Spring Data JPA?

A
  • 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

71
Q

Quelles sont les étapes pour créer une requête auto-générée?

A
  1. La méthode commence par findBy
  2. La méthode déclare ensuite un champ de l’entité pour une recherche stricte
  3. Ajout d’un prédicat (optionnel) pour affiner le mode de recherche (IsStartingWith, Contains, etc.)
72
Q

Comment déclarer des requêtes personnalisées avec Spring Data JPA?

A

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

73
Q

Comment combiner pagination et requêtes avancées?

A

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>

74
Q

Pourquoi documenter une API?

A
  • 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

75
Q

Qu’est-ce qu’OpenAPI?

A
  • 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

76
Q

Quelles sont les bonnes pratiques pour la documentation d’API?

A
  • 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)

77
Q

Que doit-on documenter dans une API?

A
  • 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

78
Q

Comment ajouter OpenAPI à un projet Spring?

A

En ajoutant la dépendance:

<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.7.0</version>
</dependency>

79
Q

Comment accéder à la documentation OpenAPI une fois configurée?

A

Après avoir lancé l’application Spring, la documentation est disponible à l’adresse:
http://localhost:8080/swagger-ui/

80
Q

Quels sont les avantages de la génération de SDK à partir d’OpenAPI?

A

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.

81
Q

Qu’est-ce que la programmation défensive?

A

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

82
Q

Que signifie “communiquer l’intention” dans le code?

A

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

83
Q

Comment communiquer l’intention dans le code?

A
  • 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

84
Q

Comment rendre testable un invariant comme “un numéro de série non modifiable”?

A

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

85
Q

Pourquoi est-il important de rendre les invariants testables?

A
  • 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)

86
Q

Quels sont les codes HTTP standardisés pour indiquer le résultat d’une requête?

A

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

87
Q

En quoi consiste une bonne réponse lors d’une erreur dans une API REST?

A

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é

88
Q

Pourquoi est-il important de faire une gestion d’erreur adéquate?

A

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)

89
Q

Quelles précautions doit-on prendre lors de la gestion des erreurs?

A

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)

90
Q

Quelles sont les bonnes pratiques pour la gestion des erreurs avec Spring?

A

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)

91
Q

Quelle est la différence entre une erreur attendue et une erreur inattendue?

A

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

92
Q

Qu’est-ce qu’un ID unique d’erreur (ou ID de corrélation) et à quoi sert-il?

A

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

93
Q

Comment implémenter une gestion d’erreurs centralisée avec Spring?

A

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

94
Q

Qu’est-ce que le principe “fail fast” dans la gestion des erreurs?

A

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é

95
Q

Qu’est-ce que la journalisation (logging) en développement web?

A

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).

96
Q

Quels types d’informations doit-on inclure dans les logs?

A

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

97
Q

Quels sont les différents niveaux de logs et quand les utiliser?

A

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)

98
Q

Quelles précautions doit-on prendre avec la journalisation?

A

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

99
Q

Comment implémenter la journalisation avec Spring?

A

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é

100
Q

Pourquoi la sécurité des applications web est-elle importante?

A

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.

101
Q

Qu’est-ce que la sécurité selon le Larousse?

A

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.

102
Q

Quels sont les différents niveaux de sécurité dans un système informatique?

A

La sécurité couvre un large spectre:

Gouvernance (politiques, gestion de risques, Loi 25)
Infrastructure (serveurs, configurations)
Environnement (WAF, IDS)
Applicatif (Authentification, Autorisation)

103
Q

Quels sont les 2 éléments principaux de la sécurité applicative abordés dans le cours?

A

Authentification et Autorisation

104
Q

Qu’est-ce que l’OWASP?

A

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.

105
Q

Quelles sont les 3 principales vulnérabilités du Top 10 API d’OWASP sur lesquelles le cours se concentre?

A

Autorisation incorrecte (objet/ressource/propriété d’un objet)
Authentification incorrecte (objet/ressource)
Autorisation incorrecte (fonction/méthode)

106
Q

Quelles sont les principales différences entre une application Web et une API en termes de sécurité?

A

Web: utilise des sessions et cookies, possède un front-end (HTML/CSS/JavaScript)
API: stateless (pas de session ou cookies), uniquement back-end

107
Q

Qu’est-ce que l’authentification?

A

Processus par lequel un système informatique s’assure de l’identité d’un utilisateur.

108
Q

Quelle est la différence clé entre authentification et autorisation?

A

Authentification → Qui êtes-vous?
Autorisation → Que pouvez-vous faire?

109
Q

Quelles sont les principales méthodes d’authentification?

A

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

110
Q

Quelles sont les faiblesses de l’authentification par mot de passe?

A

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

111
Q

Qu’est-ce que l’authentification multi-facteur (MFA) et pourquoi l’utiliser?

A

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é

112
Q

Quels sont les 4 acteurs clés dans un système d’authentification?

A

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

113
Q

Pourquoi est-il important de valider les données dans une application web?

A

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

114
Q

À quels niveaux peut-on effectuer la validation des données?

A

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

115
Q

Quels sont les différents types de validations?

A

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)

116
Q

Comment rendre un champ obligatoire avec les annotations de validation?

A

En utilisant l’annotation @NotNull, qui valide l’absence de valeur (champ absent ou null)

117
Q

Comment activer la validation dans Spring?

A

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

118
Q

Qu’est-ce que les groupes de validation et à quoi servent-ils?

A

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

119
Q

Comment créer une validation personnalisée (custom) avec Spring?

A

Définir une nouvelle annotation (interface)
Implémenter la logique de validation avec ConstraintValidator
Appliquer l’annotation sur les champs à valider

120
Q

Comment gérer les erreurs de validation?

A

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)

121
Q

Comment tester les validations?

A

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

122
Q

Quelle est la dépendance à ajouter pour activer le module de sécurité de Spring?

A

La dépendance spring-boot-starter-security doit être ajoutée au projet.

123
Q

Que se passe-t-il lorsqu’on ajoute la dépendance de sécurité Spring?

A

L’application est automatiquement sécurisée contre votre gré et il faut modifier la configuration pour autoriser l’accès.

124
Q

Qu’est-ce qu’une chaîne de sécurité (security chain) dans Spring Security?

A

Une série de filtres au travers desquels passent toutes les requêtes. Seuls les filtres applicables sont activés.

125
Q

Quels sont les composants principaux de la chaîne de sécurité Spring?

A

Filtre/Filter, Gestionnaire/Manager, Fournisseur/Provider, Service Utilisateur/UserDetailsService, et Encodeur/PasswordEncoder.

126
Q

Quel est le rôle du UserDetailsService dans Spring Security?

A

Il est responsable de récupérer les informations de l’utilisateur.

127
Q

Quelle est la méthode principale à implémenter dans UserDetailsService?

A

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

128
Q

Quelles sont les recommandations OWASP pour la taille du mot de passe?

A

Au moins 12 caractères, permettant au moins 64 caractères (pour les pass phrases) et maximum 128 caractères.

129
Q

Quelles sont les recommandations OWASP pour la composition du mot de passe?

A

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).

130
Q

Quelle est la différence entre les annotations @PreAuthorize et @PostAuthorize?

A

@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.

131
Q

Comment vérifier un rôle spécifique avec l’annotation @PreAuthorize?

A

Avec @PreAuthorize(“hasRole(‘ROLE_NAME’)”) ou simplement @PreAuthorize(“hasRole(‘NAME’)”).

132
Q

Comment vérifier une permission spécifique avec l’annotation @PreAuthorize?

A

Avec @PreAuthorize(“hasAuthority(‘permission:action:scope’)”).

133
Q

Quelle est la différence entre hasRole() et hasAuthority()?

A

hasRole(‘X’) est interprété par Spring comme hasAuthority(‘ROLE_X’), donc hasRole ajoute automatiquement le préfixe ROLE_.

134
Q

Quelle est la différence entre encodage et chiffrement (encryption)?

A

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.

135
Q

Quelle est la principale caractéristique du hachage (hashing)?

A

C’est un processus de transformation unidirectionnel (irréversible) utilisé pour le stockage sécurisé d’informations et la garantie d’intégrité.

136
Q

Citez des exemples d’encodages humains.

A

Langages parlés et écrits, Code morse.

137
Q

Citez des exemples d’encodages machines.

A

UTF-8, MP3/MP4, Base64.

138
Q

Pourquoi utilise-t-on le chiffrement (encryption)?

A

Pour rendre la compréhension d’un document impossible à toute personne qui n’a pas la clé de chiffrement.

139
Q

Qu’est-ce qui distingue le chiffrement symétrique du chiffrement asymétrique?

A

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.

140
Q

Citez un algorithme de chiffrement symétrique courant.

A

AES (Advanced Encryption Standard) avec différentes tailles de clé (128, 192, 256 bits).

141
Q

Citez un algorithme de chiffrement asymétrique courant.

A

RSA, souvent utilisé pour l’échange de clés symétriques.

142
Q

Pourquoi le hachage est-il utilisé pour stocker les mots de passe?

A

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.

143
Q

Quels algorithmes de hachage sont considérés comme sécuritaires pour le stockage des mots de passe?

A

bcrypt, Argon2 (recommandation OWASP), et Scrypt.

144
Q

Quels algorithmes de hachage ne sont plus considérés comme sécuritaires?

A

MD5 et SHA-256 (pour les mots de passe).

145
Q

Quelle est la différence clé entre authentification et autorisation?

A

L’authentification détermine qui vous êtes, tandis que l’autorisation détermine ce que vous pouvez faire.

146
Q

Que signifie JWT?

A

JSON Web Token (prononcé “jot”).

147
Q

Quel est l’avantage principal des jetons JWT par rapport aux sessions?

A

Les JWT sont stateless (sans état) et permettent de distribuer les requêtes à n’importe quel serveur.

148
Q

Quel est le format d’un JWT?

A

[Header encodé en Base64].[Payload encodé en Base64].[Signature]

149
Q

Quelles sont les trois parties d’un JWT?

A

Header (algorithme et type), Payload/Claims (contenu), et Signature.

150
Q

Quelles informations sont typiquement incluses dans le Claims d’un JWT?

A

Le sujet (sub), les autorités/permissions, les dates d’émission (iat) et d’expiration (exp), et autres informations pertinentes.

151
Q

Comment signer un JWT avec la bibliothèque JJWT?

A

Jwts.builder().setClaims().setIssuedAt().setExpiration().signWith(getSigningKey(), SignatureAlgorithm.HS384).compact()

152
Q

Comment valider un JWT avec la bibliothèque JJWT?

A

Jwts.parserBuilder().setSigningKey(getSigningKey()).build().parseClaimsJws(token).getBody().

153
Q

Qu’est-ce que RBAC?

A

Role Based Access Control - Gestion d’accès basée sur les rôles.

154
Q

Qu’est-ce que PBAC?

A

Permission Based Access Control - Gestion d’accès basée sur les permissions.

155
Q

Quel est l’avantage principal de RBAC?

A

Simple à comprendre, facile à gérer dans les organisations structurées, et peu de logique pour la gestion des accès.

156
Q

Quel est l’avantage principal de PBAC?

A

Très granulaire, s’adapte aux cas complexes, et supporte les autorisations dynamiques.

157
Q

Comment définir une permission dans PBAC?

A

Généralement au format resource:action:scope (ex: post:update:all ou post:update:self)

158
Q

Dans quel cas RBAC est-il plus approprié?

A

Pour les petites équipes avec des règles d’accès simples.

159
Q

Dans quel cas PBAC est-il plus approprié?

A

Pour les grandes équipes avec des règles d’accès complexes.

160
Q

Quels sont les volets principaux à considérer pour la mise en production d’un service web?

A

Infrastructure, base de données, et application.

161
Q

Quelle est une recommandation générale pour le déploiement d’infrastructures modernes?

A

Déployer à l’aide de conteneurs (Docker), utiliser des systèmes d’orchestration si nécessaire (Docker Compose, Kubernetes).

162
Q

Qu’est-ce que CI/CD?

A

Continuous Integration/Continuous Deployment - l’automatisation du processus de déploiement de l’application.

163
Q

Pourquoi automatiser le déploiement avec CI/CD?

A

Pour réduire les interventions humaines, diminuer le risque d’erreur, et automatiser les tests, la compilation, la vérification de sécurité, etc.

164
Q

Comment gérer l’évolution de la base de données au fil du temps?

A

Avec des scripts de migration qui modifient le schéma et le comportement de la base de données.

165
Q

Quelle bibliothèque est recommandée pour les migrations de base de données avec Spring?

166
Q

Quelle configuration doit-on modifier dans Spring JPA lors de l’utilisation de migrations?

A

Changer spring.jpa.hibernate.ddl-auto=create à spring.jpa.hibernate.ddl-auto=validate.

167
Q

Qu’est-ce qu’un feature toggle (ou feature flag)?

A

Un mécanisme permettant d’activer ou désactiver des fonctionnalités de l’application sans déployer de nouveau code.

168
Q

Quel design pattern est utilisé pour implémenter les feature toggles?

A

Le pattern Strategy.

169
Q

Quel est l’avantage principal des feature toggles pour le déploiement continu?

A

Permettre de déployer du code incomplet en production mais désactivé, puis de l’activer plus tard sans nouveau déploiement.

170
Q

Comment gérer du code incomplet en production?

A

En le rendant inaccessible via des feature toggles jusqu’à ce qu’il soit complet.