21-01-2020, 11:12 AM
Je relance le sujet: finalement, j'ai craqué... La complexité amenée par le mutualisé et le fait de devoir stocker un "backup" des sessions en DB pour éviter le garbage collect sauvage s'est téléscopée avec le besoin d'une cron task pour faire le garbage collect sur la DB (et ne pas garder les sessions d'il y a 2 semaines) plus le fait de requérir des connexions à la DB dans la page à des moments qui ne me plaisent pas (hors de la transaction principale de la page)... Et j'ai évidemment planté des trucs au milieu (la session n'était pas restaurée de la DB par exemple: si la session du client n'existe plus chez OVH, je regardais dans la DB si j'avais un backup de session, et si oui, j'en prenais les données... sans recréer la session PHP).
Bref, du coup, j'ai voulu dégager ce concept lourd et je l'ai remplacé par un cookie signé: json_encode([id joueur, date expiration, signature])
La date d'expiration est réglée à T+48H, et le cookie est renouvelé à 24H de l'expiration (donc à T+24H)
De cette façon, pas de soucis de garbage collect côté OVH (je n'ai même plus de session: elles me serviront éventuellement de "cache" peut-être.. c'est pas adapté, mais on verra bien, pour le moment, elles servent pas de toute façon!), et plus de cron task.
Pour la signature, je suis parti sur hmac(SHA256, concaténer(id paddé de 0 à gauche à 10 digits, date expiration paddée de 0 à 10 digits), token commun à tout le serveur)
Ca me permet pas de couper une session précise. Cela m'empêche même de déconnecter un éventuel "pirate" à cause du renouvellement automatique du cookie de session. Cela me permet de couper toutes les sessions si besoin (en changeant le token). Cela m'évite tout accès à la DB pour l'authentication. Cela me permet de couper toutes les sessions d'un compte (difficilement) si besoin (je change alors l'id du compte en DB: les cookies référenceront un compte inexistant et donc, les sessions actives de ce compte ne marcheront plus).
Je pense que ce sera suffisant, et simple, pour un jeu web
Bref, du coup, j'ai voulu dégager ce concept lourd et je l'ai remplacé par un cookie signé: json_encode([id joueur, date expiration, signature])
La date d'expiration est réglée à T+48H, et le cookie est renouvelé à 24H de l'expiration (donc à T+24H)
De cette façon, pas de soucis de garbage collect côté OVH (je n'ai même plus de session: elles me serviront éventuellement de "cache" peut-être.. c'est pas adapté, mais on verra bien, pour le moment, elles servent pas de toute façon!), et plus de cron task.
Pour la signature, je suis parti sur hmac(SHA256, concaténer(id paddé de 0 à gauche à 10 digits, date expiration paddée de 0 à 10 digits), token commun à tout le serveur)
Ca me permet pas de couper une session précise. Cela m'empêche même de déconnecter un éventuel "pirate" à cause du renouvellement automatique du cookie de session. Cela me permet de couper toutes les sessions si besoin (en changeant le token). Cela m'évite tout accès à la DB pour l'authentication. Cela me permet de couper toutes les sessions d'un compte (difficilement) si besoin (je change alors l'id du compte en DB: les cookies référenceront un compte inexistant et donc, les sessions actives de ce compte ne marcheront plus).
Je pense que ce sera suffisant, et simple, pour un jeu web