서론
자 우리가 로그인 기능을 구현할 때 많이 이용하는 쿠키와 세션을 암호화해서 저장하는 방법에 대해 알아보려고 한다.
자 일단 iron-session은 session에 들어가는 데이터를 암호화해 저장하는게 특징이다. 데이터를 암호화하면 민감한 데이터도 저장할 수 있는 장점이 있다.
iron-session으로 쿠키를 암호화해서 저장하기
일단
npm i iron-session
명령어를 실행해 iron-session을 다운받자.
import { withIronSessionApiRoute } from "iron-session/next";
자 이제 import해 준 다음
export default withIronSessionApiRoute(withHandler("POST", handler), {
cookieName: "carrotsession",
password: "30자 이상의 PASSWORD입력"
});
이렇게 작성해주면 된다. 여기서 password는 해당 session을 암호화하는데 이용되는데 강력한 랜덤 비밀번호는
https://www.avast.com/ko-kr/random-password-generator#pc
이 사이트에서 가능하다. 최대 50자까지 생성할 수 있으며 사용할 문자는 모든 문자를 선택해주면 강력한 비밀번호가 완성된다.
자 이제 위 코드에서 이용된 function에 대해 알아보자.
일단 우리는 libs폴더에 server폴더와 client폴더를 나누어 주었는데 이건 개인별로 조금씩 다른 부분이 있을 수 있으니 참고하면 된다.
나는
이렇게 libs폴더 안에 있는 server폴더 안쪽에 withSession.tsx파일을 만들어 주었다.
withSession.tsx파일은
import { withIronSessionApiRoute } from "iron-session/next";
declare module "iron-session" {
interface IronSessionData {
user?: {
id: number;
};
}
}
const cookieOptioons = {
cookieName: "carrotsession",
password: process.env.COOKIE_PASSWORD!,
};
export function withApiSession(fn: any) {
return withIronSessionApiRoute(fn, cookieOptioons);
}
이렇게 작성해 주었다. api를 효율적으로 관리하기 위해 만든 withApiSession은 withSession.tsx파일과 같은 폴더 안에 있다(server 폴더)
import { NextApiRequest, NextApiResponse } from "next";
export interface ResponseType {
ok: boolean;
[key: string]: any;
}
type method = "GET" | "POST" | "DELETE";
interface ConfigType {
methods: method[];
handler: (req: NextApiRequest, res: NextApiResponse) => void;
isPrivate?: boolean;
}
export default function withHandler({
methods,
isPrivate = true,
handler,
}: ConfigType) {
return async function (
req: NextApiRequest,
res: NextApiResponse
): Promise<any> {
if (req.method && !methods.includes(req.method as any)) {
return res.status(405).end();
}
if (isPrivate && !req.session.user) {
res.status(401).json({ ok: false, error: "Piz log in." });
}
try {
await handler(req, res);
} catch (error) {
console.log(error);
return res.status(500).json({ error });
}
};
}
자 이제 iron-session을 이용해 암호화된 session을 저장할 수 있다.
이 글에 등장하는 코드중 일부(withSession, withApiHandler)는 코딩 강의 사이트 '노마드코더' 의 '캐럿마켓 클론코딩' 강의를 참고했음을 알립니다