2025.3.24 월요일의 공부기록
이 글에서는 웹 개발에서 자주 등장하는 쿠키(Cookie)와 세션(Session)의 개념을 명확히 구분하고, 실무에서 자주 사용하는 JavaScript 세션 관리 라이브러리인 iron-session의 사용법을 알아본다.
- 쿠키는 클라이언트 측에 저장되는 텍스트 데이터로, 사용자 인증 정보나 임시 데이터를 저장하고 서버와 주고받는다.
- 세션은 서버 측에서 사용자 상태를 관리하며, 쿠키에 세션 ID를 저장해 서버가 클라이언트를 식별하고 세션 데이터를 제공한다.
- iron-session은 암호화된 쿠키를 사용해 서버에 세션을 저장하지 않는(stateless) 방식으로, Next.js 15 이상에서는 cookies() 함수를 await로 호출해야 정상적으로 동작한다.
쿠키는 클라이언트(브라우저) 쪽에 저장되는 작은 크기의 텍스트 데이터로, 서버가 클라이언트의 상태 정보를 저장하기 위해 사용한다. 브라우저는 서버로부터 받은 쿠키를 저장하고, 이후 요청을 보낼 때 해당 쿠키를 다시 서버에 전달한다.
쿠키는 주로 아래와 같은 용도로 사용된다.
세션은 서버 측에서 관리하는 상태 데이터이다. 세션을 활용하면 사용자의 로그인 상태와 같은 민감한 정보를 클라이언트 측에 직접 저장하지 않고, 서버에 안전하게 보관할 수 있다.
세션은 일반적으로 다음과 같은 흐름으로 작동한다.
이러한 구조 덕분에 민감한 데이터를 클라이언트가 아닌 서버에 안전하게 저장할 수 있다.
브라우저에 저장되는 쿠키는 일반적으로 다음과 같은 형태이다.
// 브라우저 쿠키의 예시
Cookie = {
session_id: "some_unique_session_value",
};
서버는 세션 ID를 키(key)로 하여 세션 데이터를 관리한다.
// 서버의 세션 데이터 예시
session = {
'session_id_1': {
user_id: "123",
user_name: "kim-chulsu",
},
'session_id_2': {
user_id: "456",
user_name: "happyCat",
}
};
세션 데이터를 어디에 저장하는지는 구현 방식에 따라 달라질 수 있다.
iron-session
은 JavaScript(Node.js) 환경에서 안전하고 간편하게 쿠키 기반 세션을 구현할 수 있게 해주는 라이브러리이다. 이는 암호화된 쿠키를 사용하여 서버에서 상태를 유지하지 않고(stateless), 쿠키만으로 세션 데이터를 안전하게 관리한다.
다음 명령어를 사용하여 설치한다.
npm i iron-session
Next.js 15부터는 cookies()
함수가 비동기(async) 함수로 변경되었으므로, 아래와 같이 반드시 await
를 붙여야 한다.
import { getIronSession } from 'iron-session';
import { cookies } from 'next/headers';
const session = await getIronSession(await cookies(), {
cookieName: "carrot-market",
password: process.env.COOKIE_PASSWORD!,
});
다음은 iron-session을 사용하여 로그인 상태를 저장하는 간단한 예시이다.
import { getIronSession } from 'iron-session';
import { cookies } from 'next/headers';
export async function login(userId: string) {
const session = await getIronSession(await cookies(), {
cookieName: "my-app-session",
password: process.env.COOKIE_PASSWORD!,
});
session.userId = userId;
await session.save();
}
export async function getUserSession() {
const session = await getIronSession(await cookies(), {
cookieName: "my-app-session",
password: process.env.COOKIE_PASSWORD!,
});
return session.userId ?? null;
}
COOKIE_PASSWORD
)는 절대 외부에 노출하지 않고 .env
파일로 보호한다.HttpOnly
및 Secure
옵션을 설정하여 XSS 및 네트워크 공격에 대비한다.