À quoi servent les Data Transfer Objects (DTO) ?
Vous exposez des données au travers d'une API disponible sur Internet ? Cet article devrait vous intéresser !
Article publié le 24/07/2023, dernière mise à jour le 19/09/2023
Si vous créez des APIs, et que ces dernières sont accessibles depuis internet, le concept de DTO (Data Transfer Object) est vraiment indispensable pour sécuriser vos données !
Prenons l'exemple d'une API Rest, dans laquelle vous manipulez des données utilisateur. Prenons une entité de données très simplifiée comme celle-ci :
public class UserEntity {
public int id;
public string? email;
public string username;
public string? password;
}
Cette entité, vous allez sûrement la récupérer depuis une base de données, effectuer quelques traitements si besoin, et la retourner dans votre réponse HTTP.
Vous pensez que c'est sécurisé...
Car vous avez bien fait attention à ne jamais demander le mot de passe ou l'email dans votre requête SQL, donc ces deux champs sont toujours vides quand le client récupère les données de profil d'un utilisateur.
Sauf qu'un jour, quelqu'un de votre équipe modifie la requête, et rajoute ces données.
Et en quelques heures, les emails et les mots de passe se retrouvent dans la nature...
La solution : DTO
Les DTO sont des objets qui représentent un sous-ensemble de vos entités, et ne contenant uniquement les informations qui sont transférées entre le client et l'API, afin d'éviter toute fuite de données.
Voici un exemple de DTO pour un objet User qui sera retourné dans une liste publique par exemple :
public class PublicUserDto {
public int id;
public string username;
}
Ici, aucun risque de renvoyer le mot de passe par inadvertance, même si la requête à la base de données est modifiée.
Avant chaque réponse du serveur, les entités seront transformées en dto, et inversement lors de la réception de la requête !
Voilà par exemple un DTO spécifique pour recevoir les données lors de l'inscription d'un utilisateur.
public class UserCreateDto {
public string email;
public string username;
public string password;
}
En bonus
En plus de sécuriser les transferts de données, les DTO peuvent être utilisés pour documenter plus clairement les entrées/sorties de votre API, en générant automatiquement la doc OpenAPI par exemple !
En conclusion
Toutes les données qui naviguent entre vos services et votre base de données sont des entités, et tout ce qui passe par les requêtes HTTP de votre API sont des DTO (des sous-ensembles sécurisés de vos entités).
Aucun commentaire pour l'instant