Esiste un tipo di codice che ogni team finisce per scrivere senza fare domande: lo strato di colla tra il modulo e il database. Un endpoint che riceve POST, convalida il corpo, chiama il servizio, restituisce un JSON. Dall'altro lato, un fetch sul client che assembla questo corpo, gestisce l'errore, aggiorna lo stato. Moltiplicalo per ciascuna azione di scrittura del prodotto e avrai centinaia di righe che esistono solo per spostare i dati da un lato all'altro.
Le Server Actions, in Next.js, attaccano esattamente questo collante. La proposta è semplice: eseguire mutazioni (scrittura, aggiornamento, eliminazione) da una funzione che gira sul server, chiamata direttamente dal componente, senza che sia necessario progettare, versione e mantenere una REST API dedicata per questo. L'endpoint esiste ancora, ma il framework lo genera e lo connette per te.
Cosa cambia nella pratica
Un'azione server è una funzione asincrona contrassegnata per l'esecuzione sul server. Lo associ a un modulo o a un evento e Next.js si occupa del trasporto: serializza gli argomenti, effettua la chiamata di rete, restituisce il risultato. Dal punto di vista di chi scrive lo schermo, sembra che tu stia semplicemente chiamando una funzione locale.
La differenza rispetto al modello precedente è meno codice e meno punti di sincronizzazione. Non esiste più un contratto API per mantenere allineati i due lati, né uno schema di richiesta che deve corrispondere a ciò che invia il client. La funzione che registra la richiesta e lo schermo che attiva questa registrazione vivono vicini l'uno all'altro e il tipo di ritorno è lo stesso su entrambe le estremità.
Ciò è importante perché la maggior parte degli attriti nei team di prodotto non risiede nella logica aziendale, ma nel collante. Ogni mutazione che in precedenza richiedeva un file di route, un gestore, un client di recupero e un tipo condiviso ora rientra in una funzione. Meno superficie su cui commettere errori, meno file da aprire quando qualcosa si rompe.
L'aumento di produttività è reale, ma non è il punto centrale
È forte la tentazione di vendere le azioni del server come una scorciatoia per la produttività, e lo sono. Ma ridurre il discorso a “meno standard” sottovaluta ciò che sta accadendo. Il vantaggio più importante è di tipo architettonico: la logica sensibile non passa più attraverso il client.
Quando la mutazione viene eseguita sul server, la chiave API, le credenziali bancarie, la regola del prezzo, il calcolo della commissione, niente di tutto questo deve essere inviato al browser. Il client attiva l'intento ("crea questa richiesta") e il server decide cosa significa. Il codice che conta non lascia mai l'ambiente che controlli.
Ciò risolve un’intera classe di perdite che il tradizionale modello SPA ha reso comuni. I team diffondono la logica aziendale sul front-end perché era lì che era più conveniente e poi scoprono che le regole di sconto o le convalide dei limiti erano esposte nel pacchetto. Con la mutazione predefinita sul server, la tentazione scompare: non c'è nessun posto dove mettere questa logica sul client, perché il client conosce solo la chiamata.
Per capire perché il server è diventato il luogo naturale di questa logica, vale la pena rivisitare l'idea più ampia di architettura server-first sul web4, di cui le Server Actions sono una parte.
L'avvertenza che nessuno può ignorare: considerare l'ingresso come ostile
Ecco la parte che separa chi usa bene Server Actions da chi crea una bella falla nella sicurezza. Un'azione server è un endpoint pubblico. Il fatto che lo chiami solo da un bel modulo nella tua applicazione non cambia la situazione.
Quando Next.js genera l'azione, espone un percorso che accetta chiamate. Chiunque abbia lo strumento giusto può creare una richiesta in tal senso, con qualunque argomento voglia e nell'ordine che preferisce. L'interfaccia che hai progettato non è una barriera: è solo uno dei modi per chiamare quella funzione. Pensare "ma il mio frontale non trasmetterebbe mai quel valore" è il classico errore, perché l'attaccante non sta usando il suo frontale.
Ciò si traduce in due obblighi non negoziabili. Il primo è la convalida. Ogni argomento che arriva deve essere controllato sul server, con uno schema esplicito, prima di toccare qualsiasi regola aziendale. Tipo, formato, range di valori, presenza di campi. La digitazione di TypeScript aiuta durante lo sviluppo, ma scompare in fase di runtime; non convalida nulla da parte di chi chiama la tratta dall'esterno.
Il secondo è l'autorizzazione ed è distinto dalla convalida. Validate risponde “questi dati hanno senso?”. Autorizza risponde "questa persona può farlo?". Ogni azione del server che cambia stato necessita, al suo interno, di verificare chi è l'utente e se ha l'autorizzazione per quell'operazione su quella risorsa. Non fare affidamento sul fatto di aver nascosto il pulsante nell'interfaccia. Il pulsante nascosto non protegge la funzione; solo controllarne l'interno lo protegge.
Perché questi controlli devono vivere all'interno dell'azione
C'è la tentazione di centralizzare l'autorizzazione nel middleware e considerare la questione risolta. Il middleware aiuta, ma spesso opera a livello di percorso, non a livello di risorsa. Può dire "questo utente ha effettuato l'accesso" e raramente "questo utente possiede esattamente l'ordine che sta tentando di annullare".
Questa differenza è dove risiedono i guasti più costosi. Un utente autenticato e legittimo può provare ad agire su una risorsa che non è sua semplicemente modificando un identificatore nell'argomento della chiamata. autenticazione superata; l'autorizzazione sull'oggetto specifico non è riuscita. Ecco perché il controllo dei permessi deve essere inserito nel corpo dell'azione, vicino alla regola aziendale, dove si ha il contesto completo di cosa viene modificato e per chi.
Il principio è vecchio e vale la pena leggerlo più ampiamente sui fondamenti di sicurezza nelle applicazioni web: ogni confine tra ciò che chiede l'utente e ciò che fa il sistema è un punto di controllo. Le Azioni del Server non creano questo confine, lo rendono più discreto, e il discreto è proprio ciò che si dimentica di proteggere.
##Come pensare all'adozione senza diventare un disastro
Le azioni server non eliminano la necessità di un livello di servizio. Se inserisci tutta la logica aziendale nelle azioni, ricreerai il problema del fat controller, solo con un nome diverso. L'azione deve essere sottile: riceve la chiamata, la valida, la autorizza e la delega a una funzione di dominio che non sa nulla di HTTP o Next.js.
Questa separazione mantiene la logica testabile e riutilizzabile. La stessa regola dell'ordine di creazione può essere richiamata da un'azione, un lavoro in coda e uno script di importazione, purché risieda all'esterno dell'azione. Tratta l'azione del server come una porta d'ingresso, non come l'intera stanza.
Vale anche la pena essere onesti su quando un'API tradizionale ha ancora senso. Se disponi di clienti esterni, di un'app mobile nativa o di integrazioni di terze parti, un'API con versione e documentata è comunque la risposta giusta. Le Azioni del Server brillano nell'accoppiamento tra la tua parte anteriore e quella posteriore; non sono stati progettati per essere il contratto pubblico che un partner consumerà. Il modo in cui questo si inserisce nel resto del framework è più chiaro nella guida Next.js App Router.
Cosa prendere in considerazione nella decisione
Le azioni server riducono la confusione del codice e inviano logica sensibile al server per impostazione predefinita, il che rappresenta allo stesso tempo un aumento di produttività e sicurezza. Questo è l'argomento a favore, ed è forte per la maggior parte delle applicazioni che, alla fine, sono la tua parte anteriore a parlare con la tua schiena.
Il prezzo è la disciplina. Ogni azione è una porta pubblica e deve essere trattata come tale: validazione esplicita, autorizzazione a livello di risorsa, logica di dominio al di fuori di essa. Coloro che trattano tutto questo come un dettaglio scambiano il modello visibile con il rischio invisibile, e il rischio invisibile è quello che appare nella produzione nel momento peggiore.
Se stai progettando l'architettura di una nuova applicazione Next.js], vale la pena modellare fin dall'inizio dove si trovano i confini di fiducia prima di distribuire le azioni in tutto il codice. Se vuoi scambiare idee su questo disegno, chiamami nei commenti o sulle reti.
Leggi anche
- Next.js 15 e Azioni del server: la guida definitiva alle mutazioni moderne
- Cache e streaming in Next.js: le prestazioni sono diventate una decisione architetturale
- Router per app Next.js: la guida al Thinking Server per impostazione predefinita
- Buone pratiche di internazionalizzazione (i18n) in React e Next.js nel 2025
- Cosa sono i componenti del server React e perché Logic sta tornando al server
- Server-First: la decisione architetturale di alleggerire il browser