🌐 웹개발

Cookie

쿠키

브라우저에 저장되는 작은 데이터. 세션 관리, 사용자 추적에 사용.

📖 상세 설명

Cookie는 1994년 Netscape 개발자 Lou Montulli가 장바구니 기능 구현을 위해 발명한, 브라우저에 저장되는 작은 텍스트 데이터입니다. HTTP가 무상태(Stateless) 프로토콜이기 때문에, 서버가 사용자를 식별하고 상태를 유지하려면 쿠키 같은 메커니즘이 필수입니다.

쿠키의 최대 크기는 도메인당 약 4KB이며, 브라우저당 최대 쿠키 수는 약 150~180개입니다. 쿠키는 만료일에 따라 세션 쿠키(브라우저 종료 시 삭제)와 영속 쿠키(지정 일시까지 유지)로 구분됩니다. Expires나 Max-Age 속성으로 수명을 제어합니다.

보안을 위해 HttpOnly, Secure, SameSite 세 가지 속성이 중요합니다. HttpOnly는 JavaScript의 document.cookie 접근을 차단해 XSS 공격을 방어하고, Secure는 HTTPS 연결에서만 쿠키를 전송하며, SameSite는 CSRF 공격을 방지하기 위해 크로스 사이트 요청 시 쿠키 전송을 제한합니다.

최근 3rd-party 쿠키 차단이 주요 브라우저에서 시행되면서, 광고 추적 기반 비즈니스 모델이 변화하고 있습니다. Safari는 2020년부터, Chrome은 2024년부터 단계적으로 차단합니다. 대안으로 1st-party 쿠키와 서버 사이드 세션, Privacy Sandbox API가 부상하고 있습니다.

💻 코드 예제

// Express.js에서 보안 쿠키 설정
import express from 'express';
import cookieParser from 'cookie-parser';

const app = express();
app.use(cookieParser());

// 로그인 시 세션 쿠키 설정
app.post('/api/login', async (req, res) => {
  const { email, password } = req.body;
  const user = await authenticate(email, password);

  if (user) {
    // 보안 쿠키 설정 (HttpOnly, Secure, SameSite)
    res.cookie('sessionId', generateSessionId(), {
      httpOnly: true,    // XSS 방지: JS에서 접근 불가
      secure: true,      // HTTPS에서만 전송
      sameSite: 'strict',// CSRF 방지: 같은 사이트에서만 전송
      maxAge: 24 * 60 * 60 * 1000, // 24시간
      path: '/',
      domain: '.example.com'
    });

    res.json({ success: true });
  }
});

// 쿠키 읽기
app.get('/api/profile', (req, res) => {
  const sessionId = req.cookies.sessionId;

  if (!sessionId) {
    return res.status(401).json({ error: 'Not authenticated' });
  }

  // 세션 검증 로직
  const user = validateSession(sessionId);
  res.json(user);
});

// 로그아웃 시 쿠키 삭제
app.post('/api/logout', (req, res) => {
  res.clearCookie('sessionId', {
    httpOnly: true,
    secure: true,
    sameSite: 'strict'
  });
  res.json({ success: true });
});

🗣️ 실무 대화 예시

💼 보안 검토 회의에서

"JWT를 로컬스토리지에 저장하면 XSS에 취약해요. HttpOnly 쿠키에 저장하면 JavaScript에서 접근 자체가 불가능하니까 보안성이 훨씬 높습니다. 대신 CSRF 토큰을 같이 사용해야 해요."

🎯 기술 면접에서

"면접관: 세션과 토큰 기반 인증의 차이점은?

지원자: 세션 기반은 서버에 상태를 저장하고 쿠키로 세션 ID만 전달합니다. 토큰 기반(JWT)은 상태를 토큰 자체에 담아 서버가 stateless하게 됩니다. 세션은 서버 메모리 부담이 있지만 즉시 무효화가 가능하고, JWT는 확장성이 좋지만 만료 전 강제 로그아웃이 어렵습니다."

🔍 코드 리뷰에서

"쿠키에 SameSite 옵션이 빠져있네요. 기본값이 'Lax'라 GET 요청에는 쿠키가 전송되는데, API가 POST인 경우 CSRF 공격에 노출될 수 있어요. 'Strict'로 명시하고, 필요하면 별도의 CSRF 토큰을 추가하는 게 좋겠습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기