🍪 쿠키와 세션
📖 정의
**쿠키(Cookie)**는 서버가 클라이언트의 브라우저에 저장하는 작은 데이터 조각입니다. **세션(Session)**은 서버가 클라이언트의 상태를 유지하기 위해 서버 측에 저장하는 정보입니다. 둘 다 HTTP의 무상태성(Stateless)을 극복하기 위해 사용됩니다.
🎯 비유로 이해하기
호텔 시스템
쿠키 = 룸 카드
├─ 투숙객이 직접 소지
├─ 카드에 방 번호 기록
├─ 분실하면 재발급
└─ 다른 사람이 훔칠 수 있음
세션 = 호텔 장부
├─ 호텔이 보관
├─ 투숙객 정보 상세 기록
├─ 룸 카드로 장부 조회
└─ 안전하게 관리
과정:
1. 체크인 (로그인)
├─ 호텔: 장부에 투숙객 정보 기록 (세션)
└─ 투숙객: 룸 카드 받음 (쿠키)
2. 서비스 이용
├─ 투숙객: 룸 카드 제시
├─ 호텔: 장부에서 정보 확인
└─ 서비스 제공
3. 체크아웃 (로그아웃)
├─ 룸 카드 반납
└─ 장부 정리
💡 쿠키 (Cookie)
쿠키의 동작 원리
1. 서버 → 클라이언트 (쿠키 설정)
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123
Set-Cookie: userId=456
2. 클라이언트 → 서버 (쿠키 전송)
GET /api/profile HTTP/1.1
Cookie: sessionId=abc123; userId=456
3. 브라우저가 자동으로 저장 및 전송
├─ 같은 도메인에 요청 시 자동 전송
├─ 만료 전까지 저장
└─ 사용자가 직접 관리 불필요
쿠키 설정하기
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=3600
Set-Cookie: theme=dark; Path=/; Max-Age=31536000
Set-Cookie: lang=ko; Domain=.example.com
// 서버에서 쿠키 설정 (Node.js/Express)
app.post('/login', (req, res) => {
// 로그인 처리...
// 세션 쿠키
res.cookie('sessionId', 'abc123', {
httpOnly: true, // JavaScript 접근 차단 (XSS 방어)
secure: true, // HTTPS에서만 전송
sameSite: 'strict', // CSRF 방어
maxAge: 3600000 // 1시간 (밀리초)
});
// 테마 쿠키
res.cookie('theme', 'dark', {
maxAge: 365 * 24 * 60 * 60 * 1000 // 1년
});
res.json({ message: '로그인 성공' });
});
// 클라이언트에서 쿠키 읽기/쓰기 (JavaScript)
// ⚠️ HttpOnly 쿠키는 읽을 수 없음
// 쿠키 설정
document.cookie = "theme=dark; max-age=3600; path=/";
document.cookie = "lang=ko; max-age=31536000; path=/";
// 쿠키 읽기
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) {
return parts.pop().split(';').shift();
}
}
const theme = getCookie('theme');
console.log(theme); // "dark"
// 쿠키 삭제
document.cookie = "theme=; max-age=0; path=/";