Scopri come i framework moderni implementano autenticazione e autorizzazione: sessioni, token, OAuth/OIDC, middleware, ruoli, policy e principali insidie di sicurezza.

is_verified, is_active, is_locked, deleted_at.\n\nQuesti flag contano perché l'autenticazione non è solo “password corretta?”, ma anche “questo account può accedere adesso?”.\n\n### Ciclo di vita dell'account: più del solo signup\n\nUno store di identità pratico supporta eventi comuni: registrazione, verifica email/telefono, reset password, revoca sessioni dopo cambi sensibili e disattivazione o soft-deletion. I framework spesso forniscono primitive (token, timestamp, hook), ma tu definisci le regole: finestre di scadenza, rate limit e cosa succede alle sessioni esistenti quando un account viene disabilitato.\n\n### Dove i framework si collegano\n\nLa maggior parte dei framework offre punti di estensione come user providers, adapter o repository. Questi componenti traducono “dato un identificatore di login, recupera l'utente” e “dato un ID utente, carica l'utente corrente” nel tuo store scelto—che sia una query SQL, una chiamata a un IdP o una lookup in una directory aziendale.\n\n## Autenticazione basata su sessione (cookie e sessioni server)\n\nL'autenticazione basata su sessione è l'approccio classico che molti framework ancora prediligono—specialmente per app server-rendered. L'idea è semplice: il server ricorda chi sei e il browser tiene un piccolo puntatore a quella memoria.\n\n### Come funziona\n\nDopo un login riuscito, il framework crea un record di sessione sul server (spesso un ID di sessione casuale mappato a un utente). Il browser riceve un cookie contenente quell'ID di sessione. Ad ogni richiesta, il browser manda automaticamente il cookie e il server lo usa per cercare l'utente loggato.\n\nPoiché il cookie è solo un identificatore (non dati utente), le informazioni sensibili restano sul server.\n\n### Flag dei cookie che i framework tipicamente impostano\n\nI framework moderni cercano di rendere i cookie di sessione più difficili da rubare o usare impropriamente impostando default sicuri:\n\n- HttpOnly: impedisce a JavaScript di leggere il cookie (aiuta a ridurre i danni da XSS).\n- Secure: invia il cookie solo su HTTPS.\n- SameSite (Lax/Strict/None): controlla l'invio cross-site dei cookie (importante per le difese CSRF e i flussi di auth di terze parti).\n\nSpesso li vedrai configurati nelle impostazioni “session cookie” o “security headers”.\n\n### Dove vengono memorizzate le sessioni\n\nI framework di solito permettono di scegliere uno store di sessione:\n\n- In-memory: veloce e semplice, ma le sessioni scompaiono al riavvio e non scalano bene su più server.\n- Database: durevole e auditabile, ma aggiunge overhead di query.\n- Cache/Redis: veloce e condivisa fra server; buona per scalare, ma dipendi da un servizio in più.\n\nA livello alto, il compromesso è velocità vs durabilità vs complessità operativa.\n\n### Logout e invalidazione\n\nLogout può significare due cose diverse:\n\n- Logout singolo dispositivo: cancellare la sessione corrente e pulire il cookie.\n- Logout ovunque: invalidare tutte le sessioni dell'utente (es. dopo un cambio password).\n\nI framework spesso implementano “logout ovunque” tracciando una “versione di sessione” per l'utente, memorizzando più ID di sessione per utente e revocandoli. Se serve controllo più forte (revoca immediata), l'autenticazione basata su sessione è spesso più semplice dei token perché il server può dimenticare una sessione all'istante.\n\n## Autenticazione basata su token (JWT e token opachi)\n\nL'autenticazione con token sostituisce le lookup di sessione server-side con una stringa che il client presenta ad ogni richiesta. I framework tipicamente raccomandano i token quando il server è principalmente un'API (usata da più client), quando hai app mobile, quando costruisci una SPA che parla a un backend separato o quando i servizi devono chiamarsi a vicenda senza sessioni browser.\n\n### Cosa significa “token” nella pratica\n\nUn token è una credenziale di accesso rilasciata dopo il login (o dopo un flusso OAuth). Il client lo invia nelle richieste successive così il server può autenticare il chiamante e poi autorizzare l'azione. La maggior parte dei framework tratta questo come pattern di prima classe: un endpoint “issue token”, middleware di autenticazione che valida il token e guardie/policy che girano dopo che l'identità è stabilita.\n\n### Token opachi vs JWT\n\nToken opachi sono stringhe casuali senza significato per il client (es. tX9...). Il server le valida interrogando database o cache. Questo rende la revoca semplice e mantiene privato il contenuto del token.\n\nJWT (JSON Web Token) sono strutturati e firmati. Un JWT tipicamente contiene claim come un identificatore utente (sub), issuer (iss), audience (aud), tempi di emissione/scadenza (iat, exp) e a volte ruoli/scopes. Importante: i JWT sono codificati, non cifrati per default—chiunque tenga il token può leggere i claim, anche se non può falsificarlo.\n\n### Dove memorizzare: header Authorization vs cookie\n\nLe indicazioni dei framework convergono su due default più sicuri:\n\n- Inviare access token tramite l'header Authorization: Bearer <token> per le API. Questo evita rischi CSRF che vengono con i cookie inviati automaticamente, ma aumenta la necessità di difese contro l'XSS perché JavaScript normalmente legge e allega i token.\n- Usare cookie solo quando puoi renderli HttpOnly, Secure e SameSite, e sei pronto a gestire correttamente il CSRF (spesso affiancato a token CSRF separati).\n\n### Refresh token, rotazione e endpoint\n\nGli access token sono di breve durata. Per evitare di forzare login continui, molti framework supportano refresh token: una credenziale di lunga durata usata solo per emettere nuovi access token.\n\nUna struttura comune è:\n\n- POST /auth/login → ritorna access token (e refresh token)\n- POST /auth/refresh → ruota il refresh token e ritorna un nuovo access token\n- POST /auth/logout → invalida i refresh token server-side\n\nLa rotazione (emettere un nuovo refresh token ogni volta) limita i danni se un refresh token viene rubato, e molti framework forniscono hook per memorizzare identificatori di token, rilevare riuso e revocare sessioni rapidamente.\n\n## OAuth 2.0 e OpenID Connect negli ecosistemi dei framework\n\nOAuth 2.0 e OpenID Connect (OIDC) sono spesso menzionati insieme, ma i framework li trattano differentemente perché risolvono problemi diversi.\n\n### OAuth 2.0 vs OIDC: quale ti serve davvero\n\nUsa OAuth 2.0 quando hai bisogno di accesso delegato: la tua app ottiene il permesso di chiamare un'API per conto dell'utente (per esempio leggere un calendario o postare su un repo) senza gestire la password dell'utente.\n\nUsa OpenID Connect quando ti serve login/identità: la tua app vuole sapere chi è l'utente e ricevere un ID token con claim d'identità. In pratica, “Login with X” è di solito OIDC sopra OAuth 2.0.\n\n### Flussi core che i framework supportano comunemente\n\nLa maggior parte dei framework e delle loro librerie auth si concentra su due flussi:\n\n- Authorization Code flow + PKCE: il default per app browser e mobile. PKCE aiuta a prevenire l'intercettazione del codice ed è atteso dalla maggior parte dei provider.\n- Client Credentials flow: per chiamate service-to-service dove non c'è un utente finale (job, worker back-end, microservizi interni).\n\n### Gestione del callback: dove i dettagli di sicurezza contano\n\nLe integrazioni dei framework forniscono tipicamente una rotta di callback e middleware helper, ma devi comunque configurare correttamente gli elementi essenziali:\n\n- Valida esattamente la redirect URI (schema/host/path). Evita redirect URI wildcard.\n- Usa e verifica il parametro state per prevenire attacchi tipo CSRF sul login.\n- Per OIDC, genera e valida un nonce per ridurre i rischi di replay token.\n- Conserva valori transitori (state/nonce/verifier) in una sessione sicura o in un cookie cifrato, non in local storage.\n\n### Scopes, claim e mappatura agli utenti locali\n\nI framework di solito normalizzano i dati del provider in un modello utente locale. La decisione chiave è cosa guida realmente l'autorizzazione:\n\n- Scopes sono permessi OAuth per le API (cosa può fare l'access token).\n- Claims sono attributi d'identità nell'ID token OIDC (chi è l'utente).\n\nUn pattern comune è: mappare identificatori stabili (come sub) a un utente locale, poi tradurre ruoli/gruppi/claim del provider in ruoli locali o policy che l'app controlla.\n\n## Password, hashing, MFA e recupero account\n\nLe password sono ancora il metodo di default in molte app, quindi i framework tendono a fornire storage più sicuro e guardrail comuni. La regola fondamentale non cambia: non dovresti mai memorizzare una password (o un hash semplice) nel database.\n\n### Default per l'hashing delle password (e perché gli hash semplici non bastano)\n\nI framework moderni e le loro librerie auth di solito usano di default hasher progettati per le password come bcrypt, Argon2 o scrypt. Questi algoritmi sono intenzionalmente lenti e includono salting, che aiuta a prevenire attacchi con tabelle precomputate e rende la crack dei password su larga scala più costosa.\n\nUn hash crittografico semplice (come SHA-256) è insicuro per le password perché è pensato per essere veloce. Se un database viene leakato, hash veloci permettono agli attaccanti di provare miliardi di password rapidamente. I password hasher aggiungono work factor (parametri di costo) così puoi tarare la sicurezza col migliorare dell'hardware.\n\n### Politiche di password che vedrai spesso\n\nI framework tipicamente forniscono hook (o plugin) per applicare regole sensate senza incollarle in ogni endpoint:\n\n- Politiche basate sulla lunghezza (password/passphrase lunghe battono regole complesse ma corte).\n- Controlli breach contro liste di password già esposte (concettualmente: “non permettere password già leakate”).\n- Rate limiting e eventuale lockout temporaneo dopo ripetuti fallimenti per rallentare forzature brute-force.\n\n### Opzioni MFA e compromessi\n\nLa maggior parte degli ecosistemi supporta MFA come secondo step dopo la verifica della password:\n\n- TOTP (app autenticatore): ampiamente supportato e funziona offline; è comunque soggetto al phishing se l'utente inserisce il codice su siti malevoli.\n- WebAuthn / passkey: forte protezione contro phishing e replay; spesso fornisce la migliore UX una volta configurato.\n- SMS: facile da implementare, ma più debole per via di SIM swap e intercettazioni—meglio di niente, ma non ideale per account ad alto rischio.\n\n### Recupero account in modo sicuro\n\nIl reset della password è una via d'attacco comune, quindi i framework incoraggiano pattern come:\n\n- Link di reset basati su token monouso memorizzati server-side (spesso hashed come le password).\n- Scadenze brevi (minuti/ore) e enforcement monouso.\n- Invalidazione delle sessioni o rotazione dei token dopo un reset riuscito in modo che sessioni rubate non rimangano attive.\n\nUna buona regola: rendere il recupero semplice per gli utenti legittimi ma costoso da automatizzare per gli attaccanti.\n\n## Middleware, guardie e il ciclo di vita della richiesta\n\nLa maggior parte dei framework tratta la sicurezza come parte della pipeline di richiesta: una serie di passi che girano prima (e talvolta dopo) il controller/handler. I nomi variano—middleware, filtri, guardie, intercettori—ma l'idea è la stessa: ogni passo può leggere la richiesta, aggiungere contesto o fermare l'elaborazione.\n\n### Un modello mentale pratico della pipeline\n\nUn flusso tipico è:\n\n1. Routing seleziona l'endpoint (es. /account/settings).\n2. Componenti di pre-processing girano (middleware/filtri/intercettori).\n3. Autenticazione tenta di identificare il chiamante.\n4. Autorizzazione decide se il chiamante identificato può accedere all'endpoint.\n5. Handler/controller esegue la logica di business.\n6. Post-processing trasforma la risposta o registra dettagli.\n\nI framework incoraggiano a mantenere i controlli di sicurezza fuori dalla logica di business, così i controller restano focalizzati su “cosa fare” piuttosto che “chi può farlo”.\n\n### Dove avviene l'autenticazione (identity first)\n\nL'autenticazione è lo step dove il framework stabilisce il contesto utente da cookie, session ID, chiavi API o bearer token. Se ha successo, crea un'identità con scope di richiesta—spesso esposta come user, principal o context.auth.\nQuesto oggetto allegato è cruciale perché i passi successivi (e il tuo codice) non dovrebbero rianalizzare header o rivalidare token. Dovrebbero leggere l'oggetto utente già popolato, che tipicamente include:\n\n- un ID utente stabile\n- ruoli/claim (a volte)\n- metadata come metodo di autenticazione o età della sessione\n\n### Dove avviene l'autorizzazione (controlli di permesso)\n\nL'autorizzazione viene comunemente implementata come:\n\n- (es. “deve essere autenticato”)\n- (es. “può modificare questo documento”) valutati dopo il caricamento della risorsa\n\nQuesto secondo tipo spiega perché gli hook di autorizzazione spesso stanno vicino a controller e servizi: possono aver bisogno di parametri di rotta o di oggetti caricati dal database per decidere correttamente.\n\n### 401 vs 403: gestire i fallimenti in modo pulito\n\nI framework distinguono due modalità di fallimento comuni:\n\n- non è stata stabilita un'identità valida. Spesso provoca redirect al login per app browser o un errore JSON per API.\n- l'identità è nota, ma manca il permesso.\n\nSistemi ben progettati evitano di rivelare dettagli nelle risposte 403; negano l'accesso senza spiegare quale regola è fallita.\n\n## Modelli di autorizzazione: ruoli, permessi e policy\n\nL'autorizzazione risponde a una domanda più ristretta del login: “Questo utente autenticato può fare questa cosa specifica adesso?” I framework moderni solitamente supportano diversi modelli, e molti team li combinano.\n\n### Controllo accesso basato su ruoli (RBAC)\n\nRBAC assegna agli utenti uno o più ruoli (es. , , ) e limita le funzionalità in base a quei ruoli.\n\nÈ facile da ragionare e veloce da implementare, specialmente quando i framework offrono helper come . Gerarchie di ruolo (“admin implica manager implica member”) possono ridurre duplicazioni, ma possono anche nascondere privilegi: una piccola modifica a un ruolo padre potrebbe concedere accesso silenziosamente in tutta l'app.\n\nRBAC funziona meglio per distinzioni ampie e stabili.\n\n### Autorizzazione basata su permessi (più granulare)\n\nL'autorizzazione basata su permessi confronta un'azione con una risorsa, spesso espressa come:\n\n- : , , , , \n- : , , , talvolta con un ID o proprietà di ownership\n\nQuesto modello è più preciso di RBAC. Per esempio, “può aggiornare progetti” è diverso da “può aggiornare solo i progetti che possiede”, che richiede di controllare permessi e condizioni sui dati.\n\nI framework spesso implementano ciò tramite una funzione centrale “can?” (o servizio) chiamata da controller, resolver, worker o template.\n\n### Autorizzazione basata su policy (regole con condizioni)\n\nLe policy incapsulano la logica di autorizzazione in valutatori riutilizzabili: “Un utente può cancellare un commento se l'ha scritto o se è un moderatore.” Le policy possono accettare contesto (utente, risorsa, richiesta), rendendole ideali per:\n\n- controlli di proprietà\n- regole legate al piano di abbonamento\n- vincoli basati su tempo o organizzazione\n\nQuando i framework integrano le policy nel routing e nel middleware, puoi far rispettare le regole in modo coerente su tutti gli endpoint.\n\n### Attributi/annotazioni vs controlli nel codice\n\nLe annotazioni (es. ) mantengono l'intento vicino all'handler, ma possono frammentarsi quando le regole diventano complesse.\n\nI controlli nel codice (chiamate esplicite all'autorizer) sono più verbosi, ma tipicamente più facili da testare e refactorare. Un compromesso comune è usare annotazioni per i controlli grossolani e policy per la logica dettagliata.\n\n## Protezioni integrate comuni: CSRF, CORS e security header\n\nI framework moderni non aiutano solo a far effettuare il login: forniscono anche difese per gli attacchi più comuni che accadono attorno all'autenticazione.\n\n### CSRF: proteggere app browser basate su cookie\n\nSe la tua app usa cookie di sessione, il browser li allega automaticamente alle richieste—a volte anche quando la richiesta è innescata da un altro sito. La protezione CSRF dei framework tipicamente aggiunge un token CSRF per sessione (o per richiesta) che deve essere inviato insieme a richieste che cambiano stato.\n\nPattern comuni:\n\n- : il server rende un token nei form e lo verifica su POST/PUT/PATCH/DELETE.\n- : un token CSRF è memorizzato in un cookie e inviato anche in header/body; il server verifica che combacino.\n\nAffianca i token CSRF a cookie (spesso di default) per ridurre il rischio e assicurati che il cookie di sessione sia e quando appropriato.\n\n### CORS: le API richiedono regole esplicite\n\nCORS non è un meccanismo di auth; è un sistema di permessi del browser. I framework di solito offrono middleware/config per permettere a origini fidate di chiamare la tua API.\n\nConfigurazioni errate da evitare:\n\n- insieme a (i browser lo rifiuteranno e segnala confusione).\n- Riflettere qualsiasi header senza una allowlist rigorosa.\n- Dimenticare di autorizzare header necessari (come ) o metodi, facendo sì che funzioni in curl ma fallisca nel browser.\n\n### Clickjacking e security header\n\nLa maggior parte dei framework può impostare default sicuri o rendere facile aggiungere header come:\n\n- o per prevenire clickjacking.\n- (controlli più ampi su script/risorse).\n- e per un comportamento del browser più sicuro.\n\n### Validazione input vs autorizzazione\n\nLa validazione assicura che i dati siano ben formati; l'autorizzazione assicura che l'utente possa agire. Una richiesta valida può comunque essere vietata—i framework funzionano meglio quando applichi entrambe: valida gli input presto, poi applica i permessi sulla risorsa specifica che si sta accedendo.\n\n## Pattern per tipo di app: SSR, SPA, mobile e microservizi\n\nIl pattern “giusto” dipende molto da dove gira il tuo codice e come le richieste arrivano al backend. I framework possono supportare più opzioni, ma i default che sembrano naturali in un tipo di app possono essere scomodi (o rischiosi) in un altro.\n\n### App renderizzate lato server (SSR)\n\nI framework SSR solitamente si abbinano bene a sessioni basate su cookie. Il browser invia automaticamente il cookie, il server cerca la sessione e le pagine possono essere renderizzate con il contesto utente senza codice client extra.\n\nUna regola pratica: mantieni i cookie di sessione , e con un'impostazione sensata, e fai affidamento sui controlli server-side per ogni richiesta che renderizza dati privati.\n\n### Single-page app (SPA)\n\nLe SPA spesso chiamano API da JavaScript, il che rende le scelte sui token più evidenti. Molti team preferiscono un flusso OAuth/OIDC che rilasci short-lived access token.\n\nEvita di memorizzare token di lunga durata in quando puoi; aumenta il raggio d'azione di un XSS. Un'alternativa comune è il pattern backend-for-frontend (BFF): la SPA parla al tuo server con un cookie di sessione, e il server scambia/gestisce i token per le API upstream.\n\n### Client mobile\n\nLe app mobile non possono contare sulle regole dei cookie del browser allo stesso modo. Tipicamente usano OAuth/OIDC con PKCE e memorizzano i refresh token nello storage sicuro della piattaforma (Keychain/Keystore).\n\nPianifica il recupero da “dispositivo perso”: revoca refresh token, ruota le credenziali e rendi la ri-autenticazione fluida—soprattutto quando MFA è abilitato.\n\n### Microservizi e API gateway\n\nCon molti servizi, sceglierai tra identità centralizzata e enforcement a livello di servizio:\n\n- : il gateway valida i token e inoltra il contesto identità.\n- : ogni servizio valida anche i token e fa rispettare l'autorizzazione per le proprie risorse.\n\nPer l'autenticazione servizio-a-servizio, i framework si integrano comunemente con (identità di canale forte) o (account di servizio). La chiave è autenticare il chiamante autorizzare ciò che può fare.\n\n### Impersonazione e accesso admin\n\nLa funzionalità “impersona utente” degli admin è potente e pericolosa. Preferisci sessioni di impersonazione esplicite, richiedi ri-autenticazione/MFA per gli admin e registra sempre audit log (chi ha impersonato chi, quando e quali azioni sono state fatte).\n\n## Test, osservabilità e trappole da evitare\n\nLe feature di sicurezza aiutano solo se continuano a funzionare quando il codice cambia. I framework moderni rendono più facile testare autenticazione e autorizzazione, ma servono test che riflettano il comportamento degli utenti reali—e degli attaccanti.\n\n### Testare i flussi auth senza setup fragili\n\nInizia separando cosa testare:\n\n- (policy, guardie, controlli di permesso). Devono essere veloci e coprire casi limite come “l'utente possiede la risorsa” vs “override admin”.\n- (richieste che dovrebbero passare o essere negate). Questi catturano middleware mal configurati, decorator mancanti e redirect rotti.\n\nLa maggior parte dei framework include helper di test così non devi ricreare manualmente sessioni o token ogni volta. Pattern comuni includono:\n\n- Un che può mantenere cookie tra richieste (utile per auth basata su sessione).\n- Helper per (o allegare un JWT/token opaco) senza passare dall'interfaccia.\n- per utenti, ruoli e risorse, così i test restano leggibili.\n\nUna regola pratica: per ogni test “happy path”, aggiungi un test “deve essere negato” che dimostri che il controllo di autorizzazione viene eseguito.\n\nSe stai iterando velocemente su questi flussi, strumenti che supportano prototipazione rapida più rollback sicuri possono aiutare. Per esempio, Koder.ai (una piattaforma vibe-coding) può generare un front end React e un backend Go + PostgreSQL da una specifica conversazionale, poi permetterti di usare snapshot e rollback mentre affini middleware/guardie e controlli di policy—utile quando sperimenti sessioni vs token e vuoi tenere traccia delle modifiche in modo auditabile.\n\n### Osservabilità: dimostra cosa è successo, non cosa pensavi fosse successo\n\nQuando qualcosa va storto, vuoi risposte rapide e affidabili.\n\nRegistra e/o audita eventi chiave:\n\n- : accessi riusciti/ falliti, challenge MFA, reset password, refresh token.\n- : quale policy ha fallito, su quale risorsa, per quale utente (evita di loggare segreti).\n- : un ID richiesta propagato attraverso log e trace così puoi seguire un tentativo di login tra i servizi.\n\nAggiungi anche metriche leggere: tasso di risposte 401/403, picchi di login falliti e pattern insoliti di refresh token.\n\n### Trappole comuni da cui i framework non ti salvano completamente\n\n- : non fare mai affidamento su flag UI o “ruoli” lato client. Fai sempre enforcement sul server.\n- : export, job in background, strumenti admin e API “interne” hanno comunque bisogno di autorizzazione.\n- : permessi “buoni per ora” tendono a diventare permanenti.\n- : memorizzare token in posti facilmente copiabili (log, URL, local storage) o inviarli a terze parti.\n\nTratta i bug di auth come comportamenti testabili: se può regressare, merita un test.
L'autenticazione dimostra l'identità (chi sta effettuando la richiesta). L'autorizzazione decide l'accesso (cosa quell'identità può fare) usando il contesto come rotta, proprietà della risorsa, tenant e scope.
I framework li separano per permetterti di cambiare i metodi di accesso senza riscrivere la logica dei permessi.
La maggior parte dei framework applica l'autenticazione e l'autorizzazione in una pipeline di richiesta, tipicamente con:
user/principalUn identity store è la fonte di verità per utenti e credenziali (o i collegamenti a identità esterne). Un user model è il modo in cui il tuo codice rappresenta quell'identità.
In pratica, i framework hanno bisogno di entrambi per rispondere: “dato questo identificatore/token, chi è l'utente corrente?”
Le sorgenti comuni includono:
Quando usi un IdP o una directory, molte app mantengono un “shadow user” locale per mappare ID esterni stabili (come sub OIDC) a ruoli e dati specifici dell'app.
Le sessioni memorizzano l'identità sul server e usano un cookie come puntatore (session ID). Sono ottime per SSR e rendono semplice la revoca.
I token (JWT/opaque) vengono inviati ad ogni richiesta (spesso via Authorization: Bearer <token>) e si adattano ad API, SPA, mobile e scenari servizio-a-servizio.
I framework normalmente induriscono i cookie di sessione con:
HttpOnly (riduce il furto via XSS)Secure (solo HTTPS)SameSite (limita l'invio cross-site; incide su CSRF e flussi di login)Devi comunque scegliere i valori appropriati per la tua app (es. vs per flussi cross-site).
I token opachi sono stringhe casuali validate con una lookup server-side (revoca semplice, contenuto privato).
I JWT sono firmati e contengono claim leggibili (sub, exp, ruoli/scopes). Sono comodi per sistemi distribuiti, ma la revoca è più difficile a meno di usare scadenze brevi e controlli server-side (deny list, versioning dei token).
Mantieni gli access token di breve durata e usa refresh token solo per ottenere nuovi access token.
Endpoint comuni:
POST /auth/login → access + refreshPOST /auth/refresh → rotazione del refresh token + nuovo accessPOST /auth/logout → invalidazione dei refresh tokenLa rotazione e il rilevamento di riuso limitano il danno se un refresh token viene compromesso.
OAuth 2.0 serve per l'accesso delegato alle API (“consenti a questa app di chiamare un'API per me”).
OpenID Connect (OIDC) serve per il login/identità (“chi è l'utente?”) e aggiunge ID token e claim standardizzati.
Il tipico “Login with X” è OIDC costruito su OAuth 2.0.
RBAC (ruoli) è semplice per controlli ampi (es. admin vs member). Permessi/policy gestiscono regole più dettagliate (es. modifica solo i propri documenti).
Un pattern comune è:
adminsupportmemberrequireRole('admin')readcreateupdatedeleteinviteinvoiceprojectuser@RequireRole('admin')SameSiteLaxHttpOnlySecureAccess-Control-Allow-Origin: *Access-Control-Allow-Credentials: trueOriginAuthorizationX-Frame-OptionsContent-Security-Policy: frame-ancestorsContent-Security-PolicyReferrer-PolicyX-Content-Type-Options: nosniffHttpOnlySecureSameSitelocalStorageLaxNone