Sessions
Under the name of sessions go various techniques for keeping a key-value storage associated to a client and controlled by the server.
- 
      Different from a simple client-based storage (cookies, storage API): - 
          The client cannot insert/modify data without help from the server 
- 
          (optional) Stored data are not visible to the client. 
 
- 
          
- 
      Typically short-lived: - Reduces risks associated to session hijacking/fixing.
 
Mechanics of a session system
- 
          The client connects for the first time: - It is given a session identifier,
- the server sets up a storage associated to the identifier.
 
- 
          When the client visits again the site: - It transmits the session identifier
- the server recovers the storage.
 
Session identifiers
Many possible channels (any techniques used for keeping the state on the client):
- 
      URL (query string, path) https://www.example.com/home?sessid=a3423f344 https://www.example.com/a3423f344/home
- 
      Hidden forms <input type="hidden" name="sessid" value="a3423f344">
- 
      Cookies (the most used one): Cookie: sessid=a3423f344
- 
      Storage API (with AJAX). 
Security: session identifiers must be ephemeral, random and hard to guess.
Storage by the server
- 
      Possible storage areas: - volatile memory (RAM),
- temporary file,
- temporary database.
 
- 
      The server is the only one to see and modify data. 
- 
      Potentially store large data (not recommended). 
- 
      Default sessions system historically implemented in PHP (temporary file). 
- 
      In Express: - express-session(RAM, temporary database, …).
- …
 
Storage by the client
- 
      Leveraging the client local storage: cookies, storage API. 
- 
      (Symmetric) cryptographic methods to guarantee - 
          Confidentiality → Encryption: the server is the only one able to see the data. 
- 
          Integrity → Signature (HMAC): the server is the only one able to create/modify data. 
 
- 
          
- 
      Session identifier = storage area. 
- 
      Limited to small data. 
- 
      The server must generate a random secret key, and never give it away. 
- 
      In Express: cookie-session.
Express example
var express = require('express'),
    session = require('express-session');
app.use(session( {
  secret : '12345',
  resave: false,
  saveUninitialized: false,
} ));
app.get('/welcome', function (req, res) {
  req.session.user = req.query.user;       // Store data in the session
  ...
});
app.get('/next', function (req, res) {
  if (req.session.user) {                  // Retrieve data from the session
    res.end('Hello ' + req.session.user);
  } else {
    res.redirect('/welcome');              // If data is absent, redirect to /welcome
  }
});
Sessions: pros/cons
Advantages
- Transparent API, hides the protocol and implementation details.
- Often faster than querying a DB.
Disadvantages
- Uses more resources than a simple client-based storage.
- Almost all implementations need the client to activate cookies.
Alternatives and complementary systems
Global storage for the application
- Memory based key-value storages: Redis, …
- Big table: Memcached, …
Security warnings
- Never store unencrypted sensible data on the client
- Never transmit them via the URL.
- Always generate hard-to-guess session identifiers:
- use random number generators and long strings, let identifiers depend on the HTTP(S) request.
- Use an encrypted transport layer:
- only use HTTPS for sensitive information (remember all personal information is sensitive).
An attacker with the ability to steal/fix session identifiers can acces all the user data.
- Use short-lived sessions:
- session cookies, identifiers, … must expire fast (or at least regularly).
AND NEVER TRUST THE CLIENT!
References
Documentations
- Express
