1. maxAge / expires
- 쿠키의 유효 기간을 설정하는 옵션
- maxAge가 있으면 expires보다 우선
특징
maxAge: 초 단위 (예: 60 60 24 = 하루) → “지금부터 몇 초”
expires: 특정 날짜/시간을 지정 → “언제까지”
setCookie("token", "abc123", { maxAge: 60 * 60 }); // 1시간
2. path
- 쿠키가 유효한 URL 경로
- 기본값: / (사이트 전체에서 전송됨)
- 특정 경로만 유효하게 제한 가능
// /dashboard 이하에서만 자동 전송됨
setCookie("token", "abc123", { path: "/dashboard" });
3. domain
- 쿠키가 유효한 도메인
- 기본값: 현재 도메인
- 서브도메인까지 공유하고 싶으면 .example.com처럼 설정
// app.example.com, api.example.com 모두 접근 가능
setCookie("token", "abc123", { domain: ".example.com" });
4. secure
- HTTPS에서만 쿠키를 전송
- 보안상 꼭 켜야 함 (HTTP에서는 전송되지 않음)
setCookie("token", "abc123", { secure: true });
// 보통 프로덕션 환경에서만 true
const isProd = process.env.NODE_ENV === "production";
setCookie("token", "abc123", { secure: isProd });
5. httpOnly
- JavaScript(document.cookie)에서 접근 불가능
- 서버에서만 읽을 수 있음
- XSS 공격 방지에 필수
- cookies-next, js-cookie 같은 클라이언트 라이브러리에서는 못 씀
- 서버에서만 설정 가능
cookies().set("token", "abc123", { httpOnly: true });
httpOnly: false
- JavaScript에서 document.cookie 또는 cookies-next, js-cookie 같은 라이브러리로 쿠키에 접근 가능
- 즉, 클라이언트 코드에서 읽기/쓰기 가능
- 보안상 취약점(XSS 노출)
6. sameSite
- 다른 사이트에서 요청할 때 쿠키를 보낼지 여부 결정
lax (기본): 안전한 요청(GET, 링크 이동 등)에서는 전송, cross-site POST에는 전송 안 함
strict: 완전히 같은 사이트에서만 쿠키 전송
none: 모든 요청에 전송 (이 경우 secure: true 필수)
setCookie("token", "abc123", { sameSite: "lax" }); // 기본
setCookie("token", "abc123", { sameSite: "strict" }); // 같은 사이트만
setCookie("token", "abc123", { sameSite: "none", secure: true }); // cross-site 허용
실제 예시(strict)
- a.com 로그인 상태에서,
- b.com 블로그 글에
<a href="https://a.com/profile"> 클릭 → 쿠키가 안 붙음 → 로그인 풀린 것처럼 보임
7. priority (신규 옵션)
- 브라우저가 쿠키 용량 초과 시 어떤 쿠키를 먼저 지울지 결정
- 값: "low" | "medium" | "high"