# cookie-session [![NPM Version][npm-image]][npm-url] [![NPM Downloads][downloads-image]][downloads-url] [![Build Status][travis-image]][travis-url] [![Test Coverage][coveralls-image]][coveralls-url] Simple cookie-based session middleware. A user session can be stored in two main ways with cookies: on the server or on the client. This module stores the session data on the client within a cookie, while a module like [express-session](https://www.npmjs.com/package/express-session) stores only a session identifier on the client within a cookie and stores the session data on the server, typically in a database. The following points can help you choose which to use: * `cookie-session` does not require any database / resources on the server side, though the total session data cannot exceed the browser's max cookie size. * `cookie-session` can simplify certain load-balanced scenarios. * `cookie-session` can be used to store a "light" session and include an identifier to look up a database-backed secondary store to reduce database lookups. ## Semantics This module provides "guest" sessions, meaning any visitor will have a session, authenticated or not. If a session is _new_ a `Set-Cookie` will be produced regardless of populating the session. ## Install ```bash $ npm install cookie-session ``` ## API ```js var cookieSession = require('cookie-session') ``` ### cookieSession(options) Create a new cookie session middleware with the provided options. #### Options Cookie session accepts these properties in the options object. ##### name The name of the cookie to set, defaults to `express:sess`. ##### keys The list of keys to use to sign & verify cookie values. Set cookies are always signed with `keys[0]`, while the other keys are valid for verification, allowing for key rotation. ##### secret A string which will be used as single key if `keys` is not provided. ##### Cookie Options Other options are passed to `cookies.get()` and `cookies.set()` allowing you to control security, domain, path, and signing among other settings. The options can also contain any of the following (for the full list, see [cookies module documentation](https://www.npmjs.org/package/cookies#readme): - `maxAge`: a number representing the milliseconds from `Date.now()` for expiry - `expires`: a `Date` object indicating the cookie's expiration date (expires at the end of session by default). - `path`: a string indicating the path of the cookie (`/` by default). - `domain`: a string indicating the domain of the cookie (no default). - `secure`: a boolean indicating whether the cookie is only to be sent over HTTPS (`false` by default for HTTP, `true` by default for HTTPS). - `secureProxy`: a boolean indicating whether the cookie is only to be sent over HTTPS (use this if you handle SSL not in your node process). - `httpOnly`: a boolean indicating whether the cookie is only to be sent over HTTP(S), and not made available to client JavaScript (`true` by default). - `signed`: a boolean indicating whether the cookie is to be signed (`true` by default). - `overwrite`: a boolean indicating whether to overwrite previously set cookies of the same name (`true` by default). ### req.session Represents the session for the given request. #### .isNew Is `true` if the session is new. #### .populated Determine if the session has been populated with data or is empty. ### req.sessionOptions Represents the session options for the current request. These options are a shallow clone of what was provided at middleware construction and can be altered to change cookie setting behavior on a per-request basis. ### Destroying a session To destroy a session simply set it to `null`: ```js req.session = null ``` ## Example ### Simple view counter example ```js var cookieSession = require('cookie-session') var express = require('express') var app = express() app.set('trust proxy', 1) // trust first proxy app.use(cookieSession({ name: 'session', keys: ['key1', 'key2'] })) app.use(function (req, res, next) { // Update views req.session.views = (req.session.views || 0) + 1 // Write response res.end(req.session.views + ' views') }) app.listen(3000) ``` ## Per-user sticky max age ```js var cookieSession = require('cookie-session') var express = require('express') var app = express() app.set('trust proxy', 1) // trust first proxy app.use(cookieSession({ name: 'session', keys: ['key1', 'key2'] })) // This allows you to set req.session.maxAge to let certain sessions // have a different value than the default. app.use(function (req, res, next) { req.sessionOptions.maxAge = req.session.maxAge || req.sessionOptions.maxAge }) // ... your logic here ... ``` ## License [MIT](LICENSE) [npm-image]: https://img.shields.io/npm/v/cookie-session.svg [npm-url]: https://npmjs.org/package/cookie-session [travis-image]: https://img.shields.io/travis/expressjs/cookie-session/master.svg [travis-url]: https://travis-ci.org/expressjs/cookie-session [coveralls-image]: https://img.shields.io/coveralls/expressjs/cookie-session.svg [coveralls-url]: https://coveralls.io/r/expressjs/cookie-session?branch=master [downloads-image]: https://img.shields.io/npm/dm/cookie-session.svg [downloads-url]: https://npmjs.org/package/cookie-session