Compare commits
2 Commits
4fa163b542
...
329a150ff8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
329a150ff8
|
||
|
|
4372f75025
|
@@ -86,13 +86,17 @@
|
|||||||
|
|
||||||
- [Veille technologique et de sécurité](#veille-technologique-et-de-sécurité)
|
- [Veille technologique et de sécurité](#veille-technologique-et-de-sécurité)
|
||||||
|
|
||||||
- 4.3 [Maquettage](#43-maquettage)
|
- 4.3 Maquettage
|
||||||
|
|
||||||
- [Choix de l'outil : Pourquoi PenPot ?](#choix-de-loutil--pourquoi-penpot-)
|
- [Choix de l'outil : Pourquoi PenPot ?](#choix-de-loutil--pourquoi-penpot-)
|
||||||
|
|
||||||
- [Workflow de Design](#workflow-de-design)
|
- [Workflow de Design](#workflow-de-design)
|
||||||
|
|
||||||
- 4.4 [Frontend](#44-frontend)
|
- 4.4 [Analyse et Conception](#44-analyse-et-conception)
|
||||||
|
- [Analyse des besoins et Personas](#analyse-des-besoins-et-personas)
|
||||||
|
- [User Stories](#user-stories)
|
||||||
|
- [Diagramme de Cas d'Utilisation (Use Case)](#diagramme-de-cas-dutilisation-use-case)
|
||||||
|
- [Diagramme de Séquence (Flux d'Upload)](#diagramme-de-séquence-flux-dupload)
|
||||||
|
|
||||||
|
- 4.5 [Frontend](#45-frontend)
|
||||||
|
|
||||||
- [F.1 - Stack technique (Next.js 16, React 19, Tailwind CSS 4)](#f1---stack-technique-nextjs-16-react-19-tailwind-css-4)
|
- [F.1 - Stack technique (Next.js 16, React 19, Tailwind CSS 4)](#f1---stack-technique-nextjs-16-react-19-tailwind-css-4)
|
||||||
|
|
||||||
@@ -130,12 +134,6 @@
|
|||||||
|
|
||||||
- [Annexe 4 - Licences et bibliothèques](#annexe-4---licences-et-bibliothèques)
|
- [Annexe 4 - Licences et bibliothèques](#annexe-4---licences-et-bibliothèques)
|
||||||
|
|
||||||
- [Annexe 5 - Dossier technique (Backend)](#annexe-5---dossier-technique-backend)
|
|
||||||
|
|
||||||
- [Annexe 6 - Dossier technique (Frontend)](#annexe-6---dossier-technique-frontend)
|
|
||||||
|
|
||||||
- [Annexe 7 - Démonstration et accès](#annexe-7---démonstration-et-accès)
|
|
||||||
|
|
||||||
# 1. Introduction au projet
|
# 1. Introduction au projet
|
||||||
|
|
||||||
Memegoat est une plateforme numérique innovante dédiée à la création, au partage et à la découverte de contenus multimédias éphémères et viraux, tels que les mèmes et les GIFs. Développé dans le cadre du titre professionnel **Concepteur Développeur d'Applications (CDA)**, ce projet transcende la simple fonctionnalité de partage social pour devenir une démonstration technique d'architecture logicielle moderne, de sécurité proactive et de conformité réglementaire.
|
Memegoat est une plateforme numérique innovante dédiée à la création, au partage et à la découverte de contenus multimédias éphémères et viraux, tels que les mèmes et les GIFs. Développé dans le cadre du titre professionnel **Concepteur Développeur d'Applications (CDA)**, ce projet transcende la simple fonctionnalité de partage social pour devenir une démonstration technique d'architecture logicielle moderne, de sécurité proactive et de conformité réglementaire.
|
||||||
@@ -217,6 +215,9 @@ L'utilisation de Helmet permet d'injecter automatiquement les protections suivan
|
|||||||
- **Strict-Transport-Security (HSTS)** : Force le navigateur à utiliser uniquement des connexions HTTPS sécurisées.
|
- **Strict-Transport-Security (HSTS)** : Force le navigateur à utiliser uniquement des connexions HTTPS sécurisées.
|
||||||
- **X-Content-Type-Options** : Empêche le navigateur d'interpréter un fichier autrement que par son type MIME déclaré, neutralisant certaines attaques par upload de fichiers.
|
- **X-Content-Type-Options** : Empêche le navigateur d'interpréter un fichier autrement que par son type MIME déclaré, neutralisant certaines attaques par upload de fichiers.
|
||||||
|
|
||||||
|
#### Détection de Crawlers et Protection contre le Scraping
|
||||||
|
Un middleware dédié (`CrawlerDetectionMiddleware`) analyse les motifs de requêtes et les User-Agents. Il identifie les comportements suspects (tentatives d'accès à des fichiers sensibles comme `.env`, scans de vulnérabilités PHP) et les robots connus pour optimiser la charge serveur et protéger le contenu des mèmes contre le pillage automatique.
|
||||||
|
|
||||||
### Scalabilité (Stockage S3/Minio)
|
### Scalabilité (Stockage S3/Minio)
|
||||||
L'architecture sépare les serveurs d'application du stockage des actifs numériques via le protocole **S3** (MinIO). Cette approche facilite la scalabilité horizontale et permet de servir les médias via un réseau de diffusion de contenu (CDN).
|
L'architecture sépare les serveurs d'application du stockage des actifs numériques via le protocole **S3** (MinIO). Cette approche facilite la scalabilité horizontale et permet de servir les médias via un réseau de diffusion de contenu (CDN).
|
||||||
|
|
||||||
@@ -624,6 +625,12 @@ Chaque fichier téléversé subit un flux de vérification rigoureux avant trait
|
|||||||
- **Scan ClamAV** : Utilisation d'un démon ClamAV pour analyser le binaire de chaque image ou GIF à la recherche de malwares ou de scripts malveillants encapsulés.
|
- **Scan ClamAV** : Utilisation d'un démon ClamAV pour analyser le binaire de chaque image ou GIF à la recherche de malwares ou de scripts malveillants encapsulés.
|
||||||
- **Validation Zod** : Toutes les entrées de l'API sont validées par des schémas Zod, empêchant les injections de données malformées ou les attaques par pollution de prototypes.
|
- **Validation Zod** : Toutes les entrées de l'API sont validées par des schémas Zod, empêchant les injections de données malformées ou les attaques par pollution de prototypes.
|
||||||
|
|
||||||
|
#### Amorçage Sécurisé (Bootstrap Service)
|
||||||
|
Le système intègre un mécanisme d'amorçage unique (`BootstrapService`) qui génère un jeton à usage unique au premier démarrage si aucun administrateur n'est détecté. Cela permet de créer le premier compte "Admin" de manière sécurisée sans exposer d'identifiants par défaut dans le code ou la base de données.
|
||||||
|
|
||||||
|
#### Purge et Maintenance Automatisée (RGPD)
|
||||||
|
Un service de purge automatique (`PurgeService`) s'exécute quotidiennement pour garantir que les données supprimées (Soft Delete) ou expirées (Sessions, Signalements) sont physiquement retirées du système après 30 jours, assurant une conformité stricte avec le principe de limitation de la conservation du RGPD.
|
||||||
|
|
||||||
### Veille technologique et de sécurité
|
### Veille technologique et de sécurité
|
||||||
|
|
||||||
#### OWASP Top Ten : Priorité à la sécurité applicative
|
#### OWASP Top Ten : Priorité à la sécurité applicative
|
||||||
@@ -645,14 +652,76 @@ Utilisation de **PenPot** comme alternative Open-Source à Figma, favorisant la
|
|||||||
2. **Maquettes Haute Fidélité** : Application de l'identité visuelle.
|
2. **Maquettes Haute Fidélité** : Application de l'identité visuelle.
|
||||||
3. **Prototypage** : Simulation du parcours utilisateur complet.
|
3. **Prototypage** : Simulation du parcours utilisateur complet.
|
||||||
|
|
||||||
## 4.4 Frontend
|
## 4.4 Analyse et Conception
|
||||||
|
|
||||||
|
### Analyse des besoins et Personas
|
||||||
|
La phase d'analyse a permis d'identifier les besoins des utilisateurs cibles :
|
||||||
|
- **Le Consommateur** : Recherche un divertissement rapide, fluide et accessible sur mobile.
|
||||||
|
- **Le Créateur** : Souhaite partager ses contenus facilement tout en ayant l'assurance que ses données sont protégées.
|
||||||
|
- **Le Modérateur/Admin** : Nécessite des outils robustes pour maintenir un environnement sain.
|
||||||
|
|
||||||
|
### User Stories
|
||||||
|
Les fonctionnalités ont été priorisées via la méthode **MoSCoW** :
|
||||||
|
- **Must (Indispensable)** : Inscription sécurisée (MFA), Upload de mèmes, Consultation des tendances.
|
||||||
|
- **Should (Important)** : Mise en favoris, Recherche par tags, Signalement de contenu.
|
||||||
|
- **Could (Optionnel)** : Profils personnalisés avancés, Statistiques de vues.
|
||||||
|
|
||||||
|
### Diagramme de Cas d'Utilisation (Use Case)
|
||||||
|
Le diagramme suivant illustre les interactions des acteurs avec le système :
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
V[Visiteur]
|
||||||
|
U[Utilisateur Authentifié]
|
||||||
|
A[Administrateur]
|
||||||
|
|
||||||
|
V --- C1(Consulter les tendances)
|
||||||
|
V --- C2(S'inscrire / Se connecter)
|
||||||
|
|
||||||
|
U --- C3(Poster un mème)
|
||||||
|
U --- C4(Ajouter aux favoris)
|
||||||
|
U --- C5(Signaler un contenu)
|
||||||
|
|
||||||
|
A --- C6(Modérer les contenus)
|
||||||
|
A --- C7(Gérer les utilisateurs)
|
||||||
|
A --- C8(Consulter les statistiques)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Diagramme de Séquence (Flux d'Upload)
|
||||||
|
Détail des interactions lors de la publication d'un contenu, intégrant la sécurité et l'optimisation :
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant User as Utilisateur
|
||||||
|
participant API as Backend (NestJS)
|
||||||
|
participant AV as Scanner (ClamAV)
|
||||||
|
participant P as Processeur (Sharp/FFmpeg)
|
||||||
|
participant S3 as Stockage (MinIO)
|
||||||
|
participant DB as PostgreSQL
|
||||||
|
|
||||||
|
User->>API: POST /contents/upload (Multipart)
|
||||||
|
API->>AV: Scan Antivirus du buffer
|
||||||
|
AV-->>API: Résultat: Sain
|
||||||
|
|
||||||
|
par Optimisation et Stockage
|
||||||
|
API->>P: Conversion WebP / Transcodage
|
||||||
|
P-->>API: Média optimisé
|
||||||
|
API->>S3: Transfert vers le bucket
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>DB: INSERT INTO contents (Metadata + S3 Key)
|
||||||
|
DB-->>API: Confirmation (ID)
|
||||||
|
API-->>User: 201 Created (Affichage)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.5 Frontend
|
||||||
|
|
||||||
### F.1 - Stack technique (Next.js 16, React 19, Tailwind CSS 4)
|
### F.1 - Stack technique (Next.js 16, React 19, Tailwind CSS 4)
|
||||||
|
|
||||||
L'interface de Memegoat repose sur une stack à la pointe de l'écosystème web, choisie pour ses performances et sa maintenabilité :
|
L'interface de Memegoat repose sur une stack à la pointe de l'écosystème web, choisie pour ses performances et sa maintenabilité :
|
||||||
- **Next.js 16 (App Router)** : Utilisation du framework de référence pour React, permettant un rendu hybride. Les pages sont pré-rendues côté serveur (SSR) pour le SEO, tandis que les interactions dynamiques sont gérées côté client.
|
- **Next.js 16 (App Router)** : Utilisation du framework de référence pour React, permettant un rendu hybride. Les pages sont pré-rendues côté serveur (SSR) pour le SEO, tandis que les interactions dynamiques sont gérées côté client.
|
||||||
- **React 19** : Cette version majeure introduit des améliorations significatives, notamment dans la gestion des formulaires avec les **Server Actions** et le support natif de l'asynchronisme, réduisant drastiquement le code "boilerplate" de gestion d'état.
|
- **React 19** : Cette version majeure introduit des améliorations significatives, notamment dans la gestion des formulaires avec les **Server Actions** et le support natif de l'asynchronisme (use, transition API), réduisant drastiquement le code "boilerplate" de gestion d'état.
|
||||||
- **Tailwind CSS 4** : La nouvelle itération de ce framework "Utility-First" offre une compilation plus rapide et une syntaxe simplifiée, permettant de construire des interfaces complexes sans quitter le fichier HTML/JSX.
|
- **Tailwind CSS 4** : La nouvelle itération de ce framework "Utility-First" offre une compilation ultra-rapide et une configuration simplifiée via CSS-native variables, permettant de construire des interfaces complexes sans quitter le fichier HTML/JSX.
|
||||||
|
|
||||||
### F.2 - Architecture et Interfaces
|
### F.2 - Architecture et Interfaces
|
||||||
|
|
||||||
@@ -742,13 +811,21 @@ L'inclusion est au cœur du développement. Memegoat suit les recommandations du
|
|||||||
# 5. Respect de la réglementation (RGPD)
|
# 5. Respect de la réglementation (RGPD)
|
||||||
|
|
||||||
### Registre des traitements
|
### Registre des traitements
|
||||||
Collecte limitée aux données strictement nécessaires (Username, Email chiffré) pour le fonctionnement du service.
|
L'application tient à jour un registre des traitements limitant la collecte aux données strictement nécessaires au fonctionnement du service :
|
||||||
|
- **Utilisateur** : Pseudonyme, Email (chiffré PGP), Mot de passe (haché Argon2id).
|
||||||
|
- **Médias** : Mèmes et GIFs téléversés, métadonnées associées.
|
||||||
|
- **Sécurité** : Logs d'audit (actions sensibles), Sessions (chiffrées).
|
||||||
|
|
||||||
### Droits des personnes
|
### Droits des personnes
|
||||||
Mécanismes d'export de données (portabilité) et de suppression définitive (droit à l'oubli).
|
Memegoat intègre nativement des mécanismes pour répondre aux sollicitations des utilisateurs :
|
||||||
|
- **Droit d'accès et portabilité** : Possibilité d'exporter l'intégralité des données rattachées à un compte via un service dédié (`exportUserData`).
|
||||||
|
- **Droit à l'effacement (Droit à l'oubli)** : Implémentation du **Soft Delete** permettant une suppression logique immédiate pour l'utilisateur, suivie d'une purge physique automatisée après 30 jours par le `PurgeService`.
|
||||||
|
- **Droit d'opposition et de rectification** : Interface de gestion de compte permettant la mise à jour ou la suppression des informations personnelles à tout moment.
|
||||||
|
|
||||||
### Sécurité par défaut (Privacy by Design)
|
### Sécurité par défaut (Privacy by Design)
|
||||||
Minimisation des données et chiffrement systématique des informations identifiables.
|
- **Minimisation des données** : Seules les informations essentielles sont conservées.
|
||||||
|
- **Chiffrement systématique** : Les données identifiables (PII) sont chiffrées dès leur réception et avant stockage en base de données.
|
||||||
|
- **Transparence** : Information claire de l'utilisateur sur l'usage de ses données lors de l'inscription.
|
||||||
|
|
||||||
# 6. Conclusion
|
# 6. Conclusion
|
||||||
|
|
||||||
@@ -761,65 +838,18 @@ Je tiens à remercier l'équipe pédagogique pour son accompagnement tout au lon
|
|||||||
|
|
||||||
### Annexe 1 - Schéma de classe POO du backend
|
### Annexe 1 - Schéma de classe POO du backend
|
||||||
|
|
||||||
Le diagramme suivant représente les entités principales du domaine et leurs relations au sein du backend NestJS.
|
Le schéma suivant représente l'architecture logicielle du backend NestJS, mettant en évidence la modularité du système et les relations entre les contrôleurs, services et repositories.
|
||||||
|
|
||||||
```mermaid
|

|
||||||
classDiagram
|
|
||||||
class User {
|
|
||||||
+UUID uuid
|
|
||||||
+String username
|
|
||||||
+String email (Encrypted)
|
|
||||||
+String emailHash
|
|
||||||
+String passwordHash
|
|
||||||
+String avatarUrl
|
|
||||||
+Enum status
|
|
||||||
+Boolean isTwoFactorEnabled
|
|
||||||
+DateTime createdAt
|
|
||||||
+softDelete()
|
|
||||||
}
|
|
||||||
|
|
||||||
class Content {
|
*Note : Le diagramme complet est disponible au format PlantUML dans le fichier `backend.plantuml` à la racine du projet.*
|
||||||
+UUID id
|
|
||||||
+UUID userId
|
|
||||||
+Enum type
|
|
||||||
+String title
|
|
||||||
+String slug
|
|
||||||
+String storageKey
|
|
||||||
+Int views
|
|
||||||
+Int usageCount
|
|
||||||
+DateTime createdAt
|
|
||||||
+incrementViews()
|
|
||||||
}
|
|
||||||
|
|
||||||
class Category {
|
|
||||||
+UUID id
|
|
||||||
+String name
|
|
||||||
+String slug
|
|
||||||
}
|
|
||||||
|
|
||||||
class Tag {
|
|
||||||
+UUID id
|
|
||||||
+String name
|
|
||||||
}
|
|
||||||
|
|
||||||
class Report {
|
|
||||||
+UUID id
|
|
||||||
+UUID contentId
|
|
||||||
+String reason
|
|
||||||
+Enum status
|
|
||||||
+DateTime createdAt
|
|
||||||
}
|
|
||||||
|
|
||||||
User "1" -- "0..*" Content : owns
|
|
||||||
Content "0..*" -- "1" Category : categorized_in
|
|
||||||
Content "0..*" -- "0..*" Tag : tagged_with
|
|
||||||
Content "1" -- "0..*" Report : has_reports
|
|
||||||
```
|
|
||||||
|
|
||||||
### Annexe 2 - Sources et ressources
|
### Annexe 2 - Sources et ressources
|
||||||
- [Documentation NestJS](https://docs.nestjs.com/)
|
- [Documentation NestJS](https://docs.nestjs.com/)
|
||||||
- [Documentation Next.js](https://nextjs.org/docs)
|
- [Documentation Next.js](https://nextjs.org/docs)
|
||||||
- [Guide de sécurité OWASP](https://owasp.org/www-project-top-ten/)
|
- [Guide de sécurité OWASP](https://owasp.org/www-project-top-ten/)
|
||||||
|
- [Standard NIST Post-Quantum (ML-KEM)](https://csrc.nist.gov/pubs/fips/203/final)
|
||||||
|
- [Référentiel Général d'Accessibilité (RGAA)](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/)
|
||||||
|
|
||||||
### Annexe 3 - Glossaire technique
|
### Annexe 3 - Glossaire technique
|
||||||
|
|
||||||
@@ -827,6 +857,10 @@ classDiagram
|
|||||||
* **Définition :** Contraction du mot "Accessibility" (11 lettres entre le A et le Y).
|
* **Définition :** Contraction du mot "Accessibility" (11 lettres entre le A et le Y).
|
||||||
* **Explication :** Désigne l'ensemble des pratiques visant à rendre les services numériques utilisables par tous, y compris les personnes en situation de handicap (visuel, moteur, auditif, etc.). Dans Memegoat, cela se traduit par l'utilisation de composants sémantiques et le respect des normes WCAG.
|
* **Explication :** Désigne l'ensemble des pratiques visant à rendre les services numériques utilisables par tous, y compris les personnes en situation de handicap (visuel, moteur, auditif, etc.). Dans Memegoat, cela se traduit par l'utilisation de composants sémantiques et le respect des normes WCAG.
|
||||||
|
|
||||||
|
* **ANSSI (Agence Nationale de la Sécurité des Systèmes d'Information) :**
|
||||||
|
* **Définition :** Autorité nationale française en matière de cybersécurité.
|
||||||
|
* **Explication :** Memegoat suit les recommandations de l'ANSSI pour le choix des algorithmes de hachage (Argon2id) et la configuration des protocoles TLS afin de garantir un niveau de sécurité étatique.
|
||||||
|
|
||||||
* **API (Interface de Programmation d'Application) :**
|
* **API (Interface de Programmation d'Application) :**
|
||||||
* **Définition :** Ensemble de règles et de protocoles permettant à deux logiciels de communiquer entre eux.
|
* **Définition :** Ensemble de règles et de protocoles permettant à deux logiciels de communiquer entre eux.
|
||||||
* **Explication :** Dans ce projet, l'API NestJS sert de pont entre le frontend (Next.js) et les données stockées en base. Elle expose des points d'accès (endpoints) sécurisés pour récupérer ou modifier les mèmes et les profils utilisateurs.
|
* **Explication :** Dans ce projet, l'API NestJS sert de pont entre le frontend (Next.js) et les données stockées en base. Elle expose des points d'accès (endpoints) sécurisés pour récupérer ou modifier les mèmes et les profils utilisateurs.
|
||||||
@@ -839,6 +873,10 @@ classDiagram
|
|||||||
* **Définition :** Chaîne d'outils (toolchain) ultra-rapide pour le web.
|
* **Définition :** Chaîne d'outils (toolchain) ultra-rapide pour le web.
|
||||||
* **Explication :** Il remplace ESLint et Prettier pour assurer le formatage et le linting du code. Son utilisation garantit une base de code propre, homogène et performante, tout en accélérant le workflow de développement.
|
* **Explication :** Il remplace ESLint et Prettier pour assurer le formatage et le linting du code. Son utilisation garantit une base de code propre, homogène et performante, tout en accélérant le workflow de développement.
|
||||||
|
|
||||||
|
* **Blind Indexing (Indexation Aveugle) :**
|
||||||
|
* **Définition :** Technique permettant de rechercher des données chiffrées sans les déchiffrer.
|
||||||
|
* **Explication :** Utilisé pour l'unicité des emails. On stocke un hash de l'email à côté de l'email chiffré PGP. Cela permet de vérifier si un email existe déjà en base sans avoir à déchiffrer tous les emails de la table.
|
||||||
|
|
||||||
* **CSP (Content Security Policy) :**
|
* **CSP (Content Security Policy) :**
|
||||||
* **Définition :** Couche de sécurité supplémentaire qui aide à détecter et atténuer certains types d'attaques, comme le XSS.
|
* **Définition :** Couche de sécurité supplémentaire qui aide à détecter et atténuer certains types d'attaques, comme le XSS.
|
||||||
* **Explication :** En définissant quelles sources de contenu (scripts, images) sont autorisées, Memegoat empêche l'exécution de code malveillant injecté par un tiers.
|
* **Explication :** En définissant quelles sources de contenu (scripts, images) sont autorisées, Memegoat empêche l'exécution de code malveillant injecté par un tiers.
|
||||||
@@ -930,13 +968,4 @@ Le projet Memegoat repose exclusivement sur des technologies Open-Source respect
|
|||||||
- **Sharp** : Licence Apache 2.0.
|
- **Sharp** : Licence Apache 2.0.
|
||||||
- **FFmpeg** : Licence LGPL / GPL (utilisé via wrapper fluent-ffmpeg).
|
- **FFmpeg** : Licence LGPL / GPL (utilisé via wrapper fluent-ffmpeg).
|
||||||
- **ClamAV** : Licence GPL.
|
- **ClamAV** : Licence GPL.
|
||||||
- **MinIO** : Licence GNU AGPL v3.
|
- **MinIO** : Licence GNU AGPL v3.
|
||||||
|
|
||||||
### Annexe 5 - Dossier technique (Backend)
|
|
||||||
*Documentation détaillée des API et de la logique serveur.*
|
|
||||||
|
|
||||||
### Annexe 6 - Dossier technique (Frontend)
|
|
||||||
*Documentation détaillée des composants et de la gestion d'état client.*
|
|
||||||
|
|
||||||
### Annexe 7 - Démonstration et accès
|
|
||||||
*Liens vers l'instance de démonstration et codes d'accès de test.*
|
|
||||||
Reference in New Issue
Block a user