npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

iron-session

v8.0.4

Published

Secure, stateless, and cookie-based session library for JavaScript

Downloads

726,215

Readme

iron-session GitHub Workflow Status (with event) GitHub license npm npm npm package minimized gzipped size (select exports)

iron-session is a secure, stateless, and cookie-based session library for JavaScript.



The session data is stored in signed and encrypted cookies which are decoded by your server code in a stateless fashion (= no network involved). This is the same technique used by frameworks like Ruby On Rails.

Table of Contents

Installation

pnpm add iron-session

Usage

We have extensive examples here too: https://get-iron-session.vercel.app/.

To get a session, there's a single method to know: getIronSession.

// Next.js API Routes and Node.js/Express/Connect.
import { getIronSession } from 'iron-session';

export async function get(req, res) {
  const session = await getIronSession(req, res, { password: "...", cookieName: "..." });
  return session;
}

export async function post(req, res) {
  const session = await getIronSession(req, res, { password: "...", cookieName: "..." });
  session.username = "Alison";
  await session.save();
}
// Next.js Route Handlers (App Router)
import { cookies } from 'next/headers';
import { getIronSession } from 'iron-session';

export async function GET() {
  const session = await getIronSession(cookies(), { password: "...", cookieName: "..." });
  return session;
}

export async function POST() {
  const session = await getIronSession(cookies(), { password: "...", cookieName: "..." });
  session.username = "Alison";
  await session.save();
}
// Next.js Server Components and Server Actions (App Router)
import { cookies } from 'next/headers';
import { getIronSession } from 'iron-session';

async function getIronSessionData() {
  const session = await getIronSession(cookies(), { password: "...", cookieName: "..." });
  return session
}

async function Profile() {
  const session = await getIronSessionData();

  return <div>{session.username}</div>;
}

Examples

We have many different patterns and examples on the online demo, have a look: https://get-iron-session.vercel.app/.

Project status

✅ Production ready and maintained.

Session options

Two options are required: password and cookieName. Everything else is automatically computed and usually doesn't need to be changed.****

  • password, required: Private key used to encrypt the cookie. It has to be at least 32 characters long. Use https://1password.com/password-generator/ to generate strong passwords. password can be either a string or an object with incrementing keys like this: {2: "...", 1: "..."} to allow for password rotation. iron-session will use the highest numbered key for new cookies.

  • cookieName, required: Name of the cookie to be stored

  • ttl, optional: In seconds. Default to the equivalent of 14 days. You can set this to 0 and iron-session will compute the maximum allowed value by cookies.

  • cookieOptions, optional: Any option available from jshttp/cookie#serialize except for encode which is not a Set-Cookie Attribute. See Mozilla Set-Cookie Attributes and Chrome Cookie Fields. Default to:

    {
      httpOnly: true,
      secure: true, // set this to false in local (non-HTTPS) development
      sameSite: "lax",// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#lax
      maxAge: (ttl === 0 ? 2147483647 : ttl) - 60, // Expire cookie before the session expires.
      path: "/",
    }

API

getIronSession<T>(req, res, sessionOptions): Promise<IronSession<T>>

type SessionData = {
  // Your data
}

const session = await getIronSession<SessionData>(req, res, sessionOptions);

getIronSession<T>(cookieStore, sessionOptions): Promise<IronSession<T>>

type SessionData = {
  // Your data
}

const session = await getIronSession<SessionData>(cookies(), sessionOptions);

session.save(): Promise<void>

Saves the session. This is an asynchronous operation. It must be done and awaited before headers are sent to the client.

await session.save()

session.destroy(): void

Destroys the session. This is a synchronous operation as it only removes the cookie. It must be done before headers are sent to the client.

session.destroy()

session.updateConfig(sessionOptions: SessionOptions): void

Updates the configuration of the session with new session options. You still need to call save() if you want them to be applied.

sealData(data: unknown, { password, ttl }): Promise<string>

This is the underlying method and seal mechanism that powers iron-session. You can use it to seal any data you want and pass it around. One usecase are magic links: you generate a seal that contains a user id to login and send it to a route on your website (like /magic-login). Once received, you can safely decode the seal with unsealData and log the user in.

unsealData<T>(seal: string, { password, ttl }): Promise<T>

This is the opposite of sealData and allow you to decode a seal to get the original data back.

FAQ

Why use pure cookies for sessions?

This makes your sessions stateless: since the data is passed around in cookies, you do not need any server or service to store session data.

More information can also be found on the Ruby On Rails website which uses the same technique.

How to invalidate sessions?

Sessions cannot be instantly invalidated (or "disconnect this customer") as there is typically no state stored about sessions on the server by default. However, in most applications, the first step upon receiving an authenticated request is to validate the user and their permissions in the database. So, to easily disconnect customers (or invalidate sessions), you can add an `isBlocked`` state in the database and create a UI to block customers.

Then, every time a request is received that involves reading or altering sensitive data, make sure to check this flag.

Can I use something else than cookies?

Yes, we expose sealData and unsealData which are not tied to cookies. This way you can seal and unseal any object in your application and move seals around to login users.

How is this different from JWT?

Not so much:

  • JWT is a standard, it stores metadata in the JWT token themselves to ensure communication between different systems is flawless.
  • JWT tokens are not encrypted, the payload is visible by customers if they manage to inspect the seal. You would have to use JWE to achieve the same.
  • @hapi/iron mechanism is not a standard, it's a way to sign and encrypt data into seals

Depending on your own needs and preferences, iron-session may or may not fit you.

Credits

Good Reads