Next.js에서 Iron Session 사용하기.

Blackeichi·2022년 11월 20일
0
post-custom-banner

Iron Session이란? 📌

  • iron-session
    • 서명, 암호화된 쿠키를 사용하는 nodejs stateless 세션 도구
    • 유저가 안에 있는 정보를 볼 수 없음
    • 세션을 위한 백엔드 구축이 필요 없음
    • JWT는 Iron session과 다르게 암호화되지 않고 서명이 되어있음

Install

	npm i iron-session

사용하기

iron session은 다음과 같이 사용하면 된다.

import { withIronSessionApiRoute } from "iron-session/next";
import { NextApiRequest, NextApiResponse } from "next";

declare module "iron-session" {
  interface IronSessionData {
    user?: {
      id: number;
    };
  }
}//req.session.user를 사용하기 위해, user의 내용을 정의

async function handler(
      req: NextApiRequest,
      res: NextApiResponse<ResponseType>
    ) {
      const exists = 유저데이터
      req.session.user = {
        id: exists?.userId,
        //유저 session에 유저의 id를 id로 저장
      };
      await req.session.save();
      //로그인을 하면 session을 만들어서 저장함.
      res.status(200).end();
    }

    export default withIronSessionApiRoute(withHandler("POST", handler), {
      //withIronSessionApiRoute로 요청객체(평범한 API핸들러)를 감싸면, 요청객체에 req.session.user를 담아서 보내줌.
      cookieName: "carrotsession",
      password:
        "9845904809485098594385093840598df;slkgjfdl;gkfsdjg;ldfksjgdsflgjdfklgjdflgjflkgjdgd",
        //password는 아무도 모르게 설정해야함.
    });

만약 Iron Session을 여러 곳에서 사용해야 한다면(ex)session만들 때, session 확인할 때 등등) Iron Session을 처리하는 새로운 파일을 만들어서 사용하자!

<withSession.ts>
import { withIronSessionApiRoute } from "iron-session/next";

declare module "iron-session" {
  interface IronSessionData {
    user?: {
      id: number;
    };
  }
}
const cookieOptions = {
  cookieName: "carrotsession",
  password: process.env.COOKIE_PASSWORD!,
};
export function withApiSession(fn: any) {
  return withIronSessionApiRoute(fn, cookieOptions);
}

그리고 api 페이지는 다음과 같이 수정할 수 있다.

import { NextApiRequest, NextApiResponse } from "next";
import withHandler from "@libs/server/withHandler";
import { withApiSession } from "@libs/server/withSession";

async function handler(
      req: NextApiRequest,
      res: NextApiResponse<ResponseType>
    ) {
      const exists = 유저데이터
      req.session.user = {
        id: exists?.userId,
        //유저 session에 유저의 id를 id로 저장
      };
      await req.session.save();
      //로그인을 하면 session을 만들어서 저장함.
      res.status(200).end();
    }

export default withApiSession(withHandler("POST", handler));
profile
프론트엔드 주니어 개발자 한정우입니다. 😁
post-custom-banner

0개의 댓글