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