Quiz 1 Flashcards

(170 cards)

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
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.
26
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.
27
Quels sont les six principes fondamentaux d’une API REST ?
Interface uniforme, Client-Serveur, Sans état, Caching, Couches, Code sur demande.
28
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.
29
Quelle annotation Spring est utilisée pour définir une route GET ?
@GetMapping("/resource")
30
Comment sécuriser une API REST avec Spring ?
En utilisant Spring Security pour l’authentification et l’autorisation.
31
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.
32
Quelle annotation est utilisée pour injecter une dépendance dans un service Spring ?
@Autowired
33
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.
34
Quel format d’échange de données est utilisé par défaut dans Spring Boot ?
JSON.
35
Quelle annotation est utilisée pour mapper une requête POST dans Spring Boot ?
@PostMapping("/resource")
36
À quoi sert l’annotation @RequestBody ?
Elle permet de récupérer le corps d’une requête HTTP dans un contrôleur Spring.
37
Comment indiquer à Spring qu’une méthode renvoie une réponse HTTP 201 (Created) ?
En ajoutant @ResponseStatus(HttpStatus.CREATED).
38
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.
39
Quelle annotation est utilisée pour définir un service dans Spring ?
@Service
40
Quelle annotation est utilisée pour déclarer un repository en Spring Data JPA ?
@Repository
41
Comment définir une entité JPA en Spring Boot ?
En utilisant @Entity, @Table et @Id pour définir la clé primaire.
42
Quelle annotation est utilisée pour gérer la relation "un-à-plusieurs" dans JPA ?
@OneToMany
43
Quelle annotation est utilisée pour mapper une classe Java à une table de base de données avec Hibernate ?
@Entity
44
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é.
45
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.
46
Quelle annotation est utilisée pour déclarer un mock en Mockito ?
@Mock
47
Quelle annotation est utilisée pour injecter un mock dans une classe testée avec Mockito ?
@InjectMocks
48
Que fait la méthode when().thenReturn() en Mockito ?
Elle permet de définir un comportement simulé pour une méthode d’un mock.
49
Quelle annotation Spring permet de créer un mock pour un composant Spring Boot ?
@MockBean
50
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.
51
Comment s’assurer qu’une méthode a bien été appelée dans un test Mockito ?
En utilisant verify(mock).methode();
52
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.
53
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).
54
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
55
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
56
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
57
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
58
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.
59
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.)
60
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
61
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)
62
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
63
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
64
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
65
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)
66
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
67
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. Par exemple: Paginated getAll(PaginationOptions options);
68
Comment trier des données avec Spring Data JPA?
PageRequest.of(PAGE, PAGE_SIZE, Sort.by("title").ascending());
69
Quelles sont les deux approches pour générer des requêtes complexes avec Spring Data JPA?
1. Génération automatique du code (dérivée du nom de la méthode) 2. Déclaration de requêtes
70
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
71
Quelles sont les étapes pour créer une requête auto-générée?
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
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
73
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 findRecipesByTitle(String title, Pageable pageable);
74
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
75
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
76
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)
77
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
78
Comment ajouter OpenAPI à un projet Spring?
En ajoutant la dépendance: org.springdoc springdoc-openapi-starter-webmvc-ui 2.7.0
79
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/
80
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.
81
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
82
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
83
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
84
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
85
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)
86
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
87
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é
88
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)
89
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)
90
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)
91
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
92
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
93
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
94
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é
95
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).
96
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
97
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)
98
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
99
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é
100
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.
101
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.
102
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)
103
Quels sont les 2 éléments principaux de la sécurité applicative abordés dans le cours?
Authentification et Autorisation
104
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.
105
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)
106
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
107
Qu'est-ce que l'authentification?
Processus par lequel un système informatique s'assure de l'identité d'un utilisateur.
108
Quelle est la différence clé entre authentification et autorisation?
Authentification → Qui êtes-vous? Autorisation → Que pouvez-vous faire?
109
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
110
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
111
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é
112
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
113
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
114
À 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
115
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)
116
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)
117
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
118
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
119
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
120
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)
121
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
122
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.
123
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.
124
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.
125
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.
126
Quel est le rôle du UserDetailsService dans Spring Security?
Il est responsable de récupérer les informations de l'utilisateur.
127
Quelle est la méthode principale à implémenter dans UserDetailsService?
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
128
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.
129
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).
130
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.
131
Comment vérifier un rôle spécifique avec l'annotation @PreAuthorize?
Avec @PreAuthorize("hasRole('ROLE_NAME')") ou simplement @PreAuthorize("hasRole('NAME')").
132
Comment vérifier une permission spécifique avec l'annotation @PreAuthorize?
Avec @PreAuthorize("hasAuthority('permission:action:scope')").
133
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_.
134
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.
135
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é.
136
Citez des exemples d'encodages humains.
Langages parlés et écrits, Code morse.
137
Citez des exemples d'encodages machines.
UTF-8, MP3/MP4, Base64.
138
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.
139
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.
140
Citez un algorithme de chiffrement symétrique courant.
AES (Advanced Encryption Standard) avec différentes tailles de clé (128, 192, 256 bits).
141
Citez un algorithme de chiffrement asymétrique courant.
RSA, souvent utilisé pour l'échange de clés symétriques.
142
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.
143
Quels algorithmes de hachage sont considérés comme sécuritaires pour le stockage des mots de passe?
bcrypt, Argon2 (recommandation OWASP), et Scrypt.
144
Quels algorithmes de hachage ne sont plus considérés comme sécuritaires?
MD5 et SHA-256 (pour les mots de passe).
145
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.
146
Que signifie JWT?
JSON Web Token (prononcé "jot").
147
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.
148
Quel est le format d'un JWT?
[Header encodé en Base64].[Payload encodé en Base64].[Signature]
149
Quelles sont les trois parties d'un JWT?
Header (algorithme et type), Payload/Claims (contenu), et Signature.
150
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.
151
Comment signer un JWT avec la bibliothèque JJWT?
Jwts.builder().setClaims().setIssuedAt().setExpiration().signWith(getSigningKey(), SignatureAlgorithm.HS384).compact()
152
Comment valider un JWT avec la bibliothèque JJWT?
Jwts.parserBuilder().setSigningKey(getSigningKey()).build().parseClaimsJws(token).getBody().
153
Qu'est-ce que RBAC?
Role Based Access Control - Gestion d'accès basée sur les rôles.
154
Qu'est-ce que PBAC?
Permission Based Access Control - Gestion d'accès basée sur les permissions.
155
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.
156
Quel est l'avantage principal de PBAC?
Très granulaire, s'adapte aux cas complexes, et supporte les autorisations dynamiques.
157
Comment définir une permission dans PBAC?
Généralement au format resource:action:scope (ex: post:update:all ou post:update:self)
158
Dans quel cas RBAC est-il plus approprié?
Pour les petites équipes avec des règles d'accès simples.
159
Dans quel cas PBAC est-il plus approprié?
Pour les grandes équipes avec des règles d'accès complexes.
160
Quels sont les volets principaux à considérer pour la mise en production d'un service web?
Infrastructure, base de données, et application.
161
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).
162
Qu'est-ce que CI/CD?
Continuous Integration/Continuous Deployment - l'automatisation du processus de déploiement de l'application.
163
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.
164
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.
165
Quelle bibliothèque est recommandée pour les migrations de base de données avec Spring?
Flyway.
166
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.
167
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.
168
Quel design pattern est utilisé pour implémenter les feature toggles?
Le pattern Strategy.
169
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.
170
Comment gérer du code incomplet en production?
En le rendant inaccessible via des feature toggles jusqu'à ce qu'il soit complet.