Non penso che intendesse "design cattivo" tanto quanto "cattiva pratica". In generale, un'applicazione web dovrebbe essere il più apolida possibile. Anche se, ad esempio, potrebbe essere necessario conoscere le informazioni dell'utente per autorizzare la visualizzazione della pagina, tali informazioni potrebbero essere salvate sul computer client sotto forma di cookie e il server convalida semplicemente le informazioni dell'utente ogni volta.
Sarebbe l'ideale, ma non puoi sempre contare sul fatto che il client sia in grado di salvare i cookie. Inoltre, comporta la convalida dell'utente in modo apolide, il che comporta potenzialmente la ricerca di informazioni dal database per una semplice richiesta di pagina. Spesso è più semplice salvare tali informazioni nella sessione.
Tuttavia, una volta attraversato Rubicon, molti programmatori sono tentati di salvare non solo le informazioni di autenticazione nella sessione, ma anche molte altre cose. Questo è un anti-schema e tende a rendere la tua applicazione web fortemente dipendente dallo stato, che è precisamente ciò che si supponeva fosse evitato in primo luogo.
Alcuni programmatori si baserebbero su una tecnologia come Spring (se si utilizza Java) per districare ciò che altrimenti sarebbe un casino di dipendenze, ma direi che ciò semplifica la creazione di dipendenze anziché eliminarle. Tali tecnologie dovrebbero aiutare il tuo sviluppo, non rendere il tuo anti-pattern meno un problema.
Pertanto, una buona regola empirica è che se riesci a scriverlo senza stato, è probabilmente una buona idea farlo o rischi di cadere in questa trappola. Ovviamente ti imbatterai in situazioni in cui ciò è richiesto, ma in generale, dovresti solo salvare informazioni che altrimenti sarebbero difficili da riacquisire.