Importnza della chiave segreta di session nel framework web Express

Sono abbastanza confuso dall'importnza di una session segreta . Sto saltando nello sviluppo web con Express e Node, e al momento sto cercando di implementare un semplice login. Il codice seguente è tratto dall'esempio delle sessioni in Express.

// Required by session() middleware // pass the secret for signed cookies // (required by session()) app.use(express.cookieParser('keyboard cat')); // Populates req.session app.use(express.session()); 

Usa "keyboard cat" come segreto di session. Molte delle cose che ho guardato in giro sui segreti delle sessioni mi consiglia di cambiare questo aspetto in qualcosa di personalizzato. Ora ho 3 domande specifiche su questo.

  1. Perché non l'ho visto prima quando lavoravo con PHP?
  2. Qual è il segreto della session utilizzato esattamente?
  3. Diciamo che cambio la chiave della session. Il mio codice è open source. In questo caso, non cambiare questo sarà un po 'ridondante? Non vedo chiedere all'utente una chiave personalizzata come opzione.
  4. Stavo pensando di generare un UUID random per compilare la chiave. Ci sono problemi con questo? (in termini di sicurezza)

Penso che il punto principale sia mancato nelle altre risposte, ovvero se il parametro secret sta rendendo più sicura la gestione delle sessioni. è discusso bene in questa domanda Security.StackExchange: Perché è insicuro archiviare direttamente l'ID di session in un cookie?

Consiglio di leggerlo (non solo la risposta più votata è pertinente).

Cercando di riassumerlo: non ridurrà in modo significativo le probabilità che una session venga indovinata e dirottata nel caso in cui gli ID di session siano numbers casuali di grandi size, ma ovviamente sarà di grande aiuto se gli ID di session sono personalizzati come ID di incremento, che è ansible in ExpressJS .

Gli utenti possono utilizzare qualsiasi ID di session che desiderano. Forse qualcuno pensa che dovrebbe usare un numero autoincrementante dal database SQL, non import, perché proteggiamo la loro decisione non informata firmando il valore, allungando la chiave.

  1. Perché PHP non è Nodejs. La gestione delle sessioni in PHP è diversa dalla gestione delle sessioni nel nodo: il nodo non muore mai, diversamente da PHP, che viene costantemente invocato dal demone del server (apache, IIS, cosa hai), chiesto di generare del contenuto, quindi terminare il process. Il nodo è l'equivalente di Apache più PHP.
  2. Viene utilizzato per crittografare il cookie di session in modo da poter essere ragionevolmente (ma non al 100%) sicuro che il cookie non sia falso e che la connessione debba essere considerata parte della session più ampia con express.
  3. Questo è il motivo per cui non inserisci la string nel codice sorgente. Lo fai diventare una variabile di ambiente e leggerlo come process.env ("SESSION_SECRET") o usi un file .env con https://npmjs.org/package/habitat , e assicurati che quei file non tocchino mai il tuo repository (svn / git esclusione / ignora) in modo che i tuoi dati segreti rimangano segreti.
  4. il segreto è immutabile mentre viene eseguita l'app del nodo. È molto meglio presentare una frase lunga e divertente di un UUID, che è generalmente molto più breve di "I didn't think I needed a secret, but the voices in my head told me Express needed one" .

Come uso le sessioni:

File .env (sempre nel mio file .gitignore in modo che non tocchi mai i miei repository pubblici):

 SECRET="This is my funky secret oh my god it has ninja turtles" 

app.js:

 var express = require('express'), env = (function(){ var Habitat = require("habitat"); Habitat.load(); return new Habitat(); }()), app = express(); app.use(express.compress()); // gzip all the things. If possible. app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.cookieSession({ key: "mysite.sid", // seeing this tells you nothing about the actual secret: secret: env.get("SESSION_SECRET"), cookie: { maxAge: 2678400000 // 31 days } })); app.use(express.csrf()); 

Quel bit di CSRF garantisce che le richieste di pagina provengano dal tuo sito, non da richieste CURL o incorporate nei siti Web di altre persone. http://expressjs.com/api.html#csrf per maggiori informazioni su questo.

La mia confusione era tra sessioni lato server e sessioni lato client. Prima di oggi non sapevo nulla del lato client. Una chiara spiegazione della differenza si trova di seguito.

Perché la session CherryPy non richiede una chiave segreta?

Pensando al model lato server, ero molto confuso where sarebbe richiesta la crittografia nelle sessioni.